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文件里有几个小问题需要调整:
- 错误的环境变量:MySQL官方镜像的普通用户变量是
MYSQL_USER,不是MYSQL_ROOT_USER(MYSQL_ROOT_USER不是默认支持的变量,默认root用户的名称就是root) - MySQL绑定地址限制:默认情况下MySQL可能只监听
127.0.0.1,导致其他容器无法连接,需要让它监听所有地址 - 添加健康检查:
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
相关产品推荐
相关产品推荐

