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

Docker化Node.js应用连接MySQL报ECONNREFUSED错误,但MySQL Workbench可正常连接

解决Docker化Node.js应用连接MySQL的ECONNREFUSED问题

嘿,我之前也踩过这个Docker容器间通信的坑,给你理清楚几个关键问题,帮你搞定这个连接失败的问题:

核心误区:Docker容器的localhost和本地不是一回事

你在本地用localhost:3307能连上MySQL,是因为宿主机把3307端口映射到了MySQL容器的3306端口,但Node.js容器里的localhost指的是它自己的容器,不是宿主机或者MySQL容器——这是最容易踩的坑!

步骤1:修改Node.js的连接主机地址

把连接配置里的host改成Docker Compose中MySQL服务的名称db,而不是localhost/127.0.0.1:

const pool = mysql.createPool({
  connectionLimit: 15,
  host: 'db',  // 重点:用Docker服务名作为主机名
  user: 'user',
  password: 'password',
  port: 3306,  // 用MySQL容器内部的端口,不是宿主机映射的3307
  database: 'database',
  multipleStatements: true
});

Docker Compose会自动创建一个内部网络,服务名db就是MySQL容器的可解析主机名,Node容器可以直接通过这个名称访问MySQL容器。

步骤2:修正Docker Compose的MySQL配置

你的Compose文件里有几个小问题需要调整:

  1. 错误的环境变量:MySQL官方镜像的普通用户变量是MYSQL_USER,不是MYSQL_ROOT_USER(MYSQL_ROOT_USER不是默认支持的变量,默认root用户的名称就是root)
  2. MySQL绑定地址限制:默认情况下MySQL可能只监听127.0.0.1,导致其他容器无法连接,需要让它监听所有地址
  3. 添加健康检查:depends_on只保证容器启动顺序,不保证MySQL服务就绪,加健康检查确保数据库真正可以连接后再启动Node应用

修改后的Docker Compose:

version: '3.3'
services:
  db:
    image: mysql:8
    restart: always
    volumes:
      - db:/var/lib/mysql
    env_file: ./.env
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: database
      MYSQL_USER: user  # 修正为官方支持的变量
      MYSQL_PASSWORD: password
    ports:
      - 3307:3306
    command: --bind-address=0.0.0.0  # 让MySQL监听所有网络地址
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "user", "-ppassword"]
      timeout: 20s
      retries: 10
  app:
    container_name: app_con
    build: ./
    restart: always
    env_file: ./.env
    ports:
      - 5000:5000
    stdin_open: true
    tty: true
    depends_on:
      db:
        condition: service_healthy  # 等待MySQL健康检查通过再启动
volumes:
  db:

步骤3:确保数据库用户有远程连接权限

如果还是连接失败,检查你的数据库用户是否允许从Docker内部网络连接:
先进入MySQL容器执行命令:

docker exec -it <你的MySQL容器名> mysql -u root -ppassword

然后执行授权命令(允许用户user从任何地址连接):

GRANT ALL PRIVILEGES ON database.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

关键知识点总结

  • 容器间通信用服务名当主机名,不要用localhost
  • 容器间连接用容器内部端口(3306),宿主机映射的端口(3307)是给外部工具(比如你的MySQL Workbench)用的
  • 确保MySQL监听所有地址,并且用户有跨网络连接的权限
  • 用健康检查替代单纯的启动顺序依赖,避免数据库还没就绪就发起连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:32:46