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

Docker-Compose部署Node.js+MySQL容器连接被拒绝问题求助

排查Node.js容器无法连接MySQL容器的问题

1. 修正数据库连接配置

你的错误日志里用了192.168.144.3:6002,这是宿主机的IP和映射端口,容器间内部通信必须用以下正确配置:

  • 主机名:直接用Docker Compose中MySQL容器的名称db(Docker默认会在内部网络自动解析容器名)
  • 端口:用MySQL容器内部的默认端口3306,而非宿主机映射的6002

比如Node项目的数据库配置文件(如db.config.js)应修改为:

module.exports = {
  host: 'db',
  port: 3306,
  user: '你的数据库用户名',
  password: '你的数据库密码',
  database: '目标数据库名'
};

2. 解决容器启动顺序问题

Node服务可能在MySQL完全就绪前就发起连接,导致连接拒绝。在docker-compose.yml中给db容器添加健康检查,同时让users_service依赖这个健康状态:

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: target_db
      MYSQL_USER: db_user
      MYSQL_PASSWORD: db_password
    ports:
      - "6002:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 5s
      timeout: 5s
      retries: 5
  users_service:
    build: ./users_service
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "你的宿主机端口:容器端口"

配置后,users_service只会在MySQL容器健康检查通过(即数据库就绪)后才启动。

3. 验证MySQL容器初始化状态

查看MySQL容器日志,确认它已完成初始化并处于可连接状态:

docker-compose logs db

如果日志中出现ready for connections的提示,说明MySQL已就绪。如果有初始化脚本(如./init.sql),需确认脚本已执行完成,目标数据库和用户已正确创建。

4. 检查容器间网络连通性

进入users_service容器,测试与db容器的网络连通性:

# 测试主机名解析
docker-compose exec users_service ping db
# 测试端口连通性
docker-compose exec users_service telnet db 3306

如果无法连通,检查docker-compose.yml的网络配置——Docker Compose默认会创建共享网络,只要没有自定义隔离网络,两个容器默认处于同一网络。

5. 检查MySQL权限配置

确保Node使用的数据库用户允许从users_service容器所在IP段连接,或临时授权允许所有地址连接(仅测试用,生产环境需限制IP):

GRANT ALL PRIVILEGES ON target_db.* TO 'db_user'@'%' IDENTIFIED BY 'db_password';
FLUSH PRIVILEGES;

可将这条语句放入MySQL初始化脚本中,让容器启动时自动执行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:12:54