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

