Docker 容器连不通、端口映射失效?排错手册
『容器起来了,端口也映射了,浏览器却连不上』——这是 Docker 新手到进阶都绕不开的坑。Docker 的网络是分层的:端口映射、容器内监听、宿主防火墙、自定义网络各自独立。下面用一套排查顺序,把问题钉在具体的那一层。
一、先校验端口映射语法
- 确认用的是
-p 宿主端口:容器端口,顺序写反会导致映射失败。 - 执行
docker ps看 PORTS 列是否显示0.0.0.0:8080->80/tcp。 - 若只显示容器端口而无宿主绑定,说明
-p没生效。
二、确认容器内服务真的在监听
- 进入容器:
docker exec -it 容器 sh。 - 执行
netstat -tlnp或ss -tlnp,确认进程监听在0.0.0.0而非127.0.0.1。 - 很多框架默认只绑 localhost,外部自然连不进。
三、排查宿主防火墙与端口占用
- 宿主上执行
ss -tlnp | grep 8080,确认 Docker 代理已监听。 - Linux 防火墙
ufw或firewalld可能拦截,需放行端口。 - 云服务器还要检查安全组入站规则。
四、自定义网络与 DNS
- 容器间通信用自定义 bridge 网络,用服务名互访而非 IP。
- 默认 bridge 网段冲突时,用
docker network create --subnet指定。 - 容器内无法解析域名,检查
/etc/resolv.conf是否被覆盖。
五、用 docker network inspect 诊断
- 执行
docker network inspect 网络名,查看 Containers 段是否包含目标容器。 - 缺失则说明容器没接对网络,用
docker network connect补连。
六、端口范围与 host 网络模式
- 需要随机映射时可用
-p 8080-形式暴露一段端口范围。 - 若映射始终不生效且排查无果,可临时用
--network host让容器共享宿主网络栈验证。 - host 模式下不再需要
-p,但会失去网络隔离,仅用于排错。
技术总结:Docker 网络排错要分层定位:映射语法 → 容器内监听 → 宿主防火墙 → 网络归属。每层用对应命令验证,必要时用 host 模式隔离变量,基本能在一两分钟内锁定断点。