使用rancher、MySQL做测试容器构建,但Windows 端实际 TCP 连接失败?

AI开发

原因:
测试架构频繁跨越“Rancher Desktop/WSL 容器网络 → Windows 宿主机”的端口转发层,导致不稳定。
典型链路是:
MySQL 容器内正常

Docker 记录 127.0.0.1:3340 → 3306

Rancher Desktop / WSL 转发层
↓ 这里失效
Windows 127.0.0.1:3340 无监听

Windows 上运行的测试 ECONNREFUSED
docker port 显示映射,只代表 Docker 已登记发布规则,不等于 Windows 端口转发进程一定正常。Docker 官方说明,发布端口还需要通过宿主机的 NAT/PAT、防火墙和转发规则才能抵达容器。Docker 端口发布机制
为什么 Win Hunt 多条任务线容易反复遇到?因为 Codex 经常采用以下方式做真实数据库测试:
临时创建一个 MySQL 容器;
随机选择 3340、3341…… 等 Windows 端口;
在 Windows PowerShell/Node 里运行测试;
通过 127.0.0.1:3340 访问容器。
而你的容器实际运行在 Rancher Desktop 的 WSL 环境中。Windows、WSL、Rancher Desktop、Hyper-V 防火墙和 VPN 网络组件之间,任何一层转发状态异常,就会出现这个问题。Rancher Desktop 官方说明,原生 Windows 程序使用 Testcontainers 时应通过 Windows named pipe 连接 Docker,并预期容器端口可以从 localhost 访问;现在的现象说明这一预期链路已经失效。
建议:
自动化真实 MySQL 测试,不要再依赖 Windows 的 127.0.0.1:随机端口。改成:
测试运行容器
↓ Docker内部网络
mysql-test:3306
例如:
services:
mysql-test:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: test-password
MYSQL_DATABASE: winhunt_test
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 2s
timeout: 2s
retries: 30
networks:
- winhunt-test

backend-test:
build:
context: .
dockerfile: backend/Dockerfile
environment:
DB_HOST: mysql-test
DB_PORT: 3306
DB_NAME: winhunt_test
depends_on:
mysql-test:
condition: service_healthy
networks:
- winhunt-test

networks:
winhunt-test:
这里 MySQL 不需要配置 ports:,测试容器直接通过 mysql-test:3306 连接。Docker 官方确认,同一容器网络内可以直接通信,不需要把端口发布到 Windows。Docker 网络说明
这会同时解决:
Rancher Desktop localhost 转发失效;
VPN与WSL网络冲突;
随机宿主机端口冲突;
Windows防火墙拦截;
Codex反复创建 r5、r6、r7 容器试错;
docker port 显示正常但实际无法连接。