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

Docker环境下Node.js Express连接MySQL报ECONNREFUSED错误如何解决

问题原因

报错的核心原因是容器网络的寻址逻辑问题:

  • 你在Express配置里写的host是127.0.0.1,当Express运行在容器内时,这个地址指向的是Express容器自身的回环地址,而非宿主机或者MySQL容器的地址,自然无法找到3306端口的MySQL服务
  • 本地运行Express时能连通,是因为此时127.0.0.1指向宿主机,而你已经把MySQL容器的3306端口映射到了宿主机的3306端口。
调整步骤

1. 修改Express的数据库连接配置

把host从127.0.0.1改为Docker Compose中MySQL服务的服务名db,Docker内部的DNS服务会自动将服务名解析为对应容器的内网IP。
修改后的app.js代码示例:

var mysql = require('mysql')
var connection = mysql.createConnection({
  host: 'db', // 替换为docker compose内MySQL的服务名
  user: 'admini',
  password: 'admini',
  database: 'cooper',
  port:'3306'
  // 注:connectionLimit是连接池createPool的专属参数,createConnection场景下可删除
})

如果需要更高的连接稳定性,也可以改用连接池配置:

var mysql = require('mysql')
var pool = mysql.createPool({
  host: 'db',
  user: 'admini',
  password: 'admini',
  database: 'cooper',
  port:'3306',
  connectionLimit: 10
})

2. 补全docker-compose.yaml配置

你当前的compose配置中没有包含Express服务,需要补充对应配置;另外当前MySQL配置仅设置了root用户密码,没有自动创建admini用户和cooper库,也需要补充对应的环境变量避免权限/库不存在的报错:
修改后的docker-compose.yaml示例:

services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: cooper # 启动时自动创建cooper数据库
      MYSQL_USER: admini # 启动时自动创建admini用户
      MYSQL_PASSWORD: admini # 设置admini用户的登录密码
    ports: 
      - 3306:3306
    healthcheck: # 新增健康检查,确保MySQL完全初始化后再启动Express
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  express: # 新增Express服务配置
    build: . # 假设你的Express Dockerfile存放在当前目录,按需调整路径
    restart: always
    ports:
      - 3000:3000 # 按你实际的Express服务端口调整
    depends_on:
      db:
        condition: service_healthy # 等待MySQL健康检查通过后再启动
    environment: # 可将数据库配置抽为环境变量,避免硬编码更灵活
      DB_HOST: db
      DB_USER: admini
      DB_PASSWORD: admini
      DB_NAME: cooper

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/

3. 重启服务生效

执行以下命令重建容器即可:

docker compose down -v
docker compose up -d --build
额外说明

如果你没有把Express加入同一个Compose集群,而是单独运行的Express容器,可以在运行Express容器时加入和MySQL相同的Docker网络,或者将host改为宿主机的局域网IP,也能正常连通。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:48:03