Debian 容器之间网络不通?
Debian 上容器之间互访不通。按默认网络、自定义网络、DNS 名解析、iptables/防火墙四层排查,区分「不在同一网络」「解析不了」与「被防火墙挡」三类原因。
简短答案
容器之间不通,四类原因占绝大多数:不在同一自定义网络(默认桥接网络不能跨网络互通)、用 IP 而非服务名解析、DNS 名没注册(未在同一网络内用服务名)、主机侧防火墙/iptables 挡了。按「网络归属 → 解析方式 → 防火墙」顺序查。
现象对照
| 现象 | 含义 |
|---|---|
| 两个容器在各自默认网络,互 ping 不通 | 默认桥接网络隔离,需放同一自定义网络 |
| 同网络、用服务名解析失败 | 没在同一网络内注册服务名(容器名即服务名) |
| 容器到外网通、容器间不通 | 网络/解析问题,不是防火墙 |
| 全都不通、含外网 | 主机 iptables/防火墙规则拦截 |
排查步骤
# 1. 看两个容器在哪些网络里
sudo docker network ls
sudo docker inspect <容器名> --format '{{range .NetworkSettings.Networks}}{{.NetworkID}} {{end}}'
# 2. 放同一个自定义网络后用服务名互访
sudo docker network create web
sudo docker run -d --name a --network web <镜像A>
# 容器 B 也用 --network web,容器名即服务名,B 里可用 a 访问
# 3. 看主机防火墙是否放行容器网段
sudo iptables -L -n | grep -i docker
sudo ufw status 2>/dev/null
- 默认网络隔离:把容器放进同一个自定义网络(
--network指定),就能用容器名互访;网络名与容器名以实际编排为准。 - 解析失败:确认两个容器在同一网络内且都用容器名/固定名访问(自定义网络内由容器名注册服务名,规则以工具文档为准)。
- 仍不通:查主机侧 iptables/
ufw,容器网段被规则挡掉会全断;规则以条目页说明为准,勿盲目清空。
注意:「容器 DNS 名解析」只在同一网络内生效,把两个网络里的容器用默认名互访必然失败——这是设计如此,不是 bug。容器基线见 Debian 13.7.0 DVD-1 条目,总览 Debian 索引;Ubuntu 侧容器用法参考 Ubuntu 索引。
操作小结
docker network inspect看两容器是否同网络。- 不同网络就放同一自定义网络,用服务名互访。
- 解析失败查是否同一网络、是否用容器名互访。
- 全断查主机 iptables/ufw,别清空防火墙。