Docker 容器连不通、端口映射失效?排错手册

『容器起来了,端口也映射了,浏览器却连不上』——这是 Docker 新手到进阶都绕不开的坑。Docker 的网络是分层的:端口映射、容器内监听、宿主防火墙、自定义网络各自独立。下面用一套排查顺序,把问题钉在具体的那一层。

一、先校验端口映射语法

  1. 确认用的是 -p 宿主端口:容器端口,顺序写反会导致映射失败。
  2. 执行 docker ps 看 PORTS 列是否显示 0.0.0.0:8080->80/tcp
  3. 若只显示容器端口而无宿主绑定,说明 -p 没生效。

二、确认容器内服务真的在监听

  1. 进入容器:docker exec -it 容器 sh
  2. 执行 netstat -tlnpss -tlnp,确认进程监听在 0.0.0.0 而非 127.0.0.1
  3. 很多框架默认只绑 localhost,外部自然连不进

三、排查宿主防火墙与端口占用

  1. 宿主上执行 ss -tlnp | grep 8080,确认 Docker 代理已监听。
  2. Linux 防火墙 ufwfirewalld 可能拦截,需放行端口。
  3. 云服务器还要检查安全组入站规则。

四、自定义网络与 DNS

  1. 容器间通信用自定义 bridge 网络,用服务名互访而非 IP。
  2. 默认 bridge 网段冲突时,用 docker network create --subnet 指定。
  3. 容器内无法解析域名,检查 /etc/resolv.conf 是否被覆盖。

五、用 docker network inspect 诊断

  1. 执行 docker network inspect 网络名,查看 Containers 段是否包含目标容器。
  2. 缺失则说明容器没接对网络,用 docker network connect 补连。

六、端口范围与 host 网络模式

  1. 需要随机映射时可用 -p 8080- 形式暴露一段端口范围。
  2. 若映射始终不生效且排查无果,可临时用 --network host 让容器共享宿主网络栈验证。
  3. host 模式下不再需要 -p,但会失去网络隔离,仅用于排错。

技术总结:Docker 网络排错要分层定位:映射语法 → 容器内监听 → 宿主防火墙 → 网络归属。每层用对应命令验证,必要时用 host 模式隔离变量,基本能在一两分钟内锁定断点。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注