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

