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

Docker-Compose部署下Node.js连接MySQL容器出现ECONNREFUSED 3306错误

问题分析

API容器内的localhost指向容器自身,而非MySQL容器,导致无法连接到数据库服务。Docker Compose默认会为所有服务创建一个共享网络,服务名称(如mysql)可作为DNS地址直接访问对应容器。

解决方案

1. 修改API的.env配置

将API的.env文件中的host值从localhost改为mysql(即docker-compose.yml中MySQL服务的名称):

port=8080
user=express
password=password
database=mia
db_port=3306
host=mysql

2. 优化Docker Compose配置(可选但推荐)

  • 移除MySQL服务中无效的MYSQL_HOST环境变量,MySQL容器默认会监听所有网卡(0.0.0.0),无需指定localhost
  • 为MySQL添加健康检查,确保API在MySQL完全就绪后再尝试连接,避免因启动顺序问题导致的连接失败:
mysql:
  image: mysql:8.0
  cap_add:
    - SYS_NICE 
  volumes:
    - ./database/mia.sql:/docker-entrypoint-initdb.d/0_init.sql
    - ./database/mia:/var/lib/mysql
  ports:
    - "3306:3306" 
  restart: always 
  environment:
    MYSQL_DATABASE: mia
    MYSQL_USER: express
    MYSQL_PASSWORD: password
    MYSQL_ROOT_PASSWORD: password
    SERVICE_TAGS: dev
    SERVICE_NAME: mysql
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-ppassword"]
    interval: 5s
    timeout: 5s
    retries: 5

同时修改API服务的depends_on,依赖MySQL的健康状态:

api:
  container_name: miAPI
  build: ./MI_Assessment_Back_end
  restart: always
  ports:
    - 8080:8080
  expose:
    - 8080
  depends_on:
    mysql:
      condition: service_healthy

3. 重启服务

执行以下命令重新部署容器:

docker-compose down
docker-compose up --build
补充说明
  • Docker Compose的depends_on仅控制服务启动顺序,不保证依赖服务完全就绪,添加健康检查能确保API在MySQL可用后再启动
  • 容器间通信无需映射端口(ports字段),expose也非必需,只要在同一网络内即可通过服务名+容器内部端口访问

内容的提问来源于stack exchange,提问作者Ameen Infobhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:05:21