Docker-Compose部署Node.js+MySQL无法连接数据库求助
解决Node.js容器无法连接MySQL容器的问题
Hey,我来帮你排查下Node.js容器连不上MySQL的问题,从你贴的docker-compose.yml来看,有几个常见的坑可能踩中了,咱们一步步来:
1. 最可能的核心问题:MySQL服务未就绪就启动Node应用
你把wait-for-it.sh的启动命令注释掉了,这大概率是关键原因!depends_on只是保证db容器先启动,但不代表MySQL服务已经完成初始化、可以接受连接了。Node容器启动后立刻尝试连接,此时MySQL可能还在创建数据库、初始化权限,自然连不上。
解决办法:
- 取消注释那行
command,确保Node应用等MySQL的3306端口就绪后再启动。 - 如果你还没有
wait-for-it.sh脚本,把它放到Node项目的根目录(可以手动编写一个简单的端口等待脚本,或者找成熟的开源实现)。
2. 网络配置确认
你用了自定义网络docker_xxx,这部分配置是对的——两个服务都加入了同一个网络,容器间可以用服务名(db)直接通信。不过如果之前这个网络出过问题,可以试试删除后重建:
docker network rm docker_xxx docker-compose up -d
3. MySQL容器的配置验证
- 检查
db服务的MYSQL_DATABASE值,你写的database...是不是占位符?要改成和Node应用里配置的数据库名完全一致。 - 进入MySQL容器,手动验证服务是否正常:
# 替换成你的db容器名或容器ID docker exec -it <your-db-container-name> mysql -uroot -pxxx # 登录后查看数据库是否存在 SHOW DATABASES; - 如果你的
./db目录下有自定义Dockerfile,确保没有修改MySQL默认的3306端口,或者如果改了,要同步到Node应用的连接配置里。
4. Node应用的连接配置检查
- 确认你的Node应用确实在读取
DATABASE_HOST这个环境变量,有没有拼写错误?比如是不是写成了DB_HOST而不是DATABASE_HOST? - 在Node容器里测试到
db的连通性:# 进入Node容器 docker exec -it <your-node-container-name> /bin/bash # 测试ping通db服务 ping db # 测试3306端口是否开放 telnet db 3306
调整后的docker-compose.yml示例
version: '3.2' services: node: build: ./ ports: - "8787:8787" depends_on: - db networks: - docker_xxx environment: - PORT=8787 - DATABASE_HOST=db - DATABASE_PASSWORD=xxx - EGG_SERVER_ENV=local - NODE_ENV=development # 取消注释,确保等MySQL就绪后启动应用 command: ["./wait-for-it.sh", "db:3306", "--", "npm run docker"] db: build: ./db networks: - docker_xxx environment: - MYSQL_ROOT_PASSWORD=xxx - MYSQL_DATABASE=your_actual_database_name # 替换为真实数据库名
内容的提问来源于stack exchange,提问作者ycjcl868




