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

Docker容器通信异常:Node.js无法连接MySQL(EHOSTUNREACH)

问题解决步骤

1. 修复Node.js连接配置的Host错误

你的Node.js代码中,MySQL连接池的host参数未加引号,会被当作未定义变量处理,导致连接地址错误。需修改为Docker Compose服务名的字符串形式(内部DNS可直接解析服务名):

const pool = mysql.createPool({
  host: "mysql", // 改为字符串"mysql"
  port: process.env.PORT || 3306, // 添加默认值避免环境变量缺失
  user: process.env.DBUSER || "root",
  password: process.env.PASS,
  database: process.env.DB,
});

2. 确保MySQL监听所有网络接口

MySQL容器默认可能仅绑定127.0.0.1,导致其他容器无法访问。在Docker Compose的mysql服务中添加启动命令强制监听所有接口:

mysql:
  platform: linux/amd64
  image: mysql:8.0.33-oracle
  container_name: mysql
  restart: always
  ports:
    - "1200:3306"
  environment:
    - MYSQL_ROOT_PASSWORD=<mypass>
  volumes:
    - test:/var/lib/mysql
  networks:
    - backend
  command: --bind-address=0.0.0.0 # 添加该行

3. 替换Sleep等待,使用健康检查确保MySQL就绪

depends_on仅保证容器启动顺序,不确保MySQL服务可用。添加健康检查让Node.js容器等待MySQL完全就绪后再启动:

给MySQL服务添加健康检查

mysql:
  # ...其他配置
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
    interval: 5s
    timeout: 5s
    retries: 5

修改Node.js服务的依赖条件

server:
  # ...其他配置
  depends_on:
    mysql:
      condition: service_healthy # 替换原有的"- mysql"

4. 检查VPS防火墙规则

IONOS VPS的ufw防火墙可能默认阻止Docker内部桥接网络的流量,执行以下命令允许内部网络通信:

sudo ufw allow from 172.21.0.0/16 to any

同时确认IONOS控制面板的安全组未限制内部流量(公网端口限制不影响容器间通信,但部分服务商有额外规则)。

5. 验证环境变量正确性

确保/secrets/private.env中的配置符合要求:

  • PORT应为3306(MySQL容器内部端口,而非主机映射的1200)
  • DBUSER应为root(或你创建的授权用户)
  • PASS需与MYSQL_ROOT_PASSWORD完全一致
  • DB需是MySQL中已存在的数据库(可手动进入MySQL容器执行CREATE DATABASE命令,或添加初始化脚本自动创建)

内容的提问来源于stack exchange,提问作者Talal Zeid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:45:09