You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动