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

