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

同一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:

排查与解决步骤

  1. 修复连接代码语法错误
    连接配置中host: mysql和database: online_chess未加引号,Node.js会将其视为未定义变量,导致解析错误。修正后的代码:

    const db=mysql.createConnection({
        user: 'root',
        host: 'mysql',
        password: 'password',
        database: 'online_chess',
        port: 3306
    })
    
  2. 解除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
    
  3. 验证容器间网络连通性
    进入game容器,测试与mysql容器的网络连通:

    docker exec -it game ping mysql
    

    若ping不通,检查容器是否在同一网络:

    docker network inspect app_default
    

    确认三个容器均在该网络的Containers列表中。

  4. 检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:23:14