You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:45:03