默认 bridge 网络不支持 DNS,需创建自定义 bridge 网络(如 mynet)以启用容器名解析;容器无法访问外网多因 DNS 配置错误或 iptables FORWARD 策略非 ACCEPT;端口映射失败常因宿主机防火墙、iptables DNAT 规则缺失或云平台安全组未放行;多容器依赖应通过 healthcheck 与重试机制保障,而非依赖启动顺序。
Bridge 网络用着简单,出问题却很隐蔽——容器重启后连不上、服务名 ping 不通、外部访问失败、DNS 解析卡住……这些问题大多不是 Docker 坏了,而是配置没对上底层逻辑。关键不在“怎么配”,而在“为什么这么配”。
默认的 bridge 网络(即不指定 --network 时自动用的那个)只做 IP 层转发,不提供内置 DNS 服务。所以 ping container_b 会失败,哪怕两个容器都在 docker0 上。
docker network create mynet
docker run -d --name db --network mynet postgres
docker run -it --network mynet alpine ping db
常见于宿主机开了防火墙、iptables 被清过、或 resolv.conf 被覆盖。容器里 ping 8.8.8.8 成功但 nslookup google.com 失败,基本就是 DNS 问题。
/etc/resolv.conf 是否指向 127.0.0.11(Docker 内置 DNS)--dns 8.8.8.8 临时验证;长期方案是配置 daemon.json 的 dns 字段iptables FORWARD 链默认策略为 ACCEPT,否则 NAT 流量被丢弃-p 8080:80 写对了,但浏览器打不开,通常不是容器问题,而是宿主机层面拦截或转发没生效。
docker port <容器名> 确认端口是否真映射成功curl localhost:8080,排除网络路径问题sudo iptables -t nat -L DOCKER -n
一个容器启动快,另一个慢半拍,硬写 db:5432 却连不上——不是网络不通,是服务还没就绪。
docker-compose,它自动建专属 bridge 网络 + 支持 healthcheck + restart_policylocalhost 访问同网络其他服务——那是宿主机回环,不是容器间通信