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
相关产品推荐
相关产品推荐

