Docker Compose部署多Node.js服务时第二个无法连接MySQL如何解决
问题根因
第二个MySQL容器ISAAC-sensor-database的端口配置存在错误:MySQL官方镜像默认在容器内部监听3306端口,你配置的ports: - "3307:3307"是将宿主机3307端口映射到了容器的3307端口,但容器内部没有服务监听3307端口,因此同网络下的第二个Node.js服务访问ISAAC-sensor-database:3307会触发连接拒绝错误。
修复方案
步骤1:调整第二个MySQL服务的端口映射
将容器侧端口改回MySQL默认的3306,宿主机侧保持3307不变用于本地访问,修改后配置如下:
ISAAC-sensor-database: image: mysql environment: MYSQL_ROOT_PASSWORD: isaac ports: - "3307:3306" # 宿主机3307映射容器内部3306端口 volumes: - ./sql-scripts:/docker-entrypoint-initdb.d
步骤2:调整第二个Node.js服务的数据库端口配置
Docker Compose同网络内的服务通信直接使用容器内部监听端口,因此将第二个后端的DB_PORT参数修改为3306即可:
ISAAC-sensor-back-end: image: jjuless/isaac-sensor-back-end environment: DB_HOST: ISAAC-sensor-database DB_USER: root DB_PASSWORD: isaac DB_DATABASE: isaac DB_PORT: 3306 # 改为容器内MySQL监听的默认端口 DB_DIALECT: mysql ports: - "3001:80" depends_on: - ISAAC-sensor-database
补充说明
- Docker Compose同网桥下的服务互访不需要通过宿主机映射的端口,端口映射仅用于宿主机或外部网络访问容器服务,你当前的多Node.js服务部署逻辑本身没有问题,调整端口配置后即可正常运行
- 可选优化:如果出现服务启动时数据库未初始化完成导致的偶发连接失败,可以给MySQL服务增加健康检查配置,示例如下:
# 添加到MySQL服务配置段中 healthcheck: test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] timeout: 20s retries: 10
同时在后端服务的depends_on中增加condition: service_healthy规则,确保数据库完全就绪后再启动后端服务。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

