同一Docker网络中Node.js容器无法连接MySQL容器求助
问题:Node.js容器无法连接同网络下的MySQL容器
环境概述
- 部署三个Docker容器:
game(运行Node.js应用)、mysql(运行MySQL)、redis(运行Redis),三者处于同一默认网络app_default
容器网络信息
执行以下命令获取容器网络详情:
root@online-chess:~# docker inspect mysql -f "{{json .NetworkSettings.Networks }}" {"app_default":{"IPAMConfig":null,"Links":null,"Aliases":["mysql","e89159b03ea0"],"NetworkID":"4559baadffb3bb25beb74e63d3ffcf1df3acfdac7fd496d28a20747f55153447","EndpointID":"844932c4542c6aab74dda6571477c1fd51743a4a890dc25792e80262aad55f7f","Gateway":"172.27.0.1","IPAddress":"172.27.0.3","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:1b:00:03","DriverOpts":null}} root@online-chess:~# docker inspect redis -f "{{json .NetworkSettings.Networks }}" {"app_default":{"IPAMConfig":null,"Links":null,"Aliases":["redis","9e5c1cb5c0ab"],"NetworkID":"4559baadffb3bb25beb74e63d3ffcf1df3acfdac7fd496d28a20747f55153447","EndpointID":"8de49f7eb5c1ccc428d1e27da841033b548c3bf75ef5d60d196d65d5bbde8b38","Gateway":"172.27.0.1","IPAddress":"172.27.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:1b:00:02","DriverOpts":null}} root@online-chess:~# docker inspect game -f "{{json .NetworkSettings.Networks }}" {"app_default":{"IPAMConfig":null,"Links":null,"Aliases":["game","18e7eeb3fd65"],"NetworkID":"4559baadffb3bb25beb74e63d3ffcf1df3acfdac7fd496d28a20747f55153447","EndpointID":"4158b7ef6fc66006e19be58c6f29633dfce1742e3327c76765d116c2ff243c1a","Gateway":"172.27.0.1","IPAddress":"172.27.0.4","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:1b:00:04","DriverOpts":null}}
MySQL连接代码
Node.js应用中MySQL连接配置如下:
const db=mysql.createConnection({ user: 'root', host: mysql, password: 'password', database: online_chess, port: 3306 // user,host,password,port,database })
报错日志
容器运行状态及报错信息:
root@online-chess:/app# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0aa397f6beac app_game "docker-entrypoint.s…" 9 seconds ago Up 8 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp game 39ef715e9b2d mysql "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql 2912223e0281 redis "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis root@online-chess:/app# docker logs 0aa397f6beac > online-chess-starting-files@1.0.0 start > node server.js server started at http://localhost:5000 Connected to redis... Error: connect ETIMEDOUT at Connection._handleTimeoutError (/app/node_modules/mysql2/lib/connection.js:205:17) at listOnTimeout (node:internal/timers:573:17) at process.processTimers (node:internal/timers:514:7) { errorno: 'ETIMEDOUT', code: 'ETIMEDOUT', syscall: 'connect', fatal: true }
容器Docker Compose配置
game容器(Node.js)
version: '3.1' services: game: build: . ports: - 5000:5000 container_name: game environment: PORT: 5000
mysql容器
version: '3.1' services: mysql: image: mysql ports: - 3306:3306 environment: # MYSQL_USER: testuser # MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: password # MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: online_chess command: --default-authentication-plugin=mysql_native_password restart: always volumes: - db_data:/var/lib/mysql container_name: mysql volumes: db_data:
排查与解决步骤
修复连接代码语法错误
连接配置中host: mysql和database: online_chess未加引号,Node.js会将其视为未定义变量,导致解析错误。修正后的代码:const db=mysql.createConnection({ user: 'root', host: 'mysql', password: 'password', database: 'online_chess', port: 3306 })解除MySQL root用户访问限制
当前MySQL配置中MYSQL_ROOT_HOST被注释,默认仅允许本地访问。需解除注释并设置为%,允许任意主机连接:
修改mysql容器的docker-compose.yml:environment: MYSQL_ROOT_PASSWORD: password MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: online_chess重启容器生效:
docker-compose down && docker-compose up -d验证容器间网络连通性
进入game容器,测试与mysql容器的网络连通:docker exec -it game ping mysql若ping不通,检查容器是否在同一网络:
docker network inspect app_default确认三个容器均在该网络的
Containers列表中。检查MySQL端口监听状态
进入mysql容器,查看3306端口监听情况:docker exec -it mysql netstat -tulpn | grep 3306确保输出显示
0.0.0.0:3306,而非仅127.0.0.1:3306,否则说明MySQL仅允许本地连接。
内容的提问来源于stack exchange,提问作者Haochen Wang
相关产品推荐
相关产品推荐

