一、前言:为什么你的Docker容器突然"失联"了?

在日常开发和运维中,Docker容器网络问题堪称"薛定谔的猫"——运行得好好的服务突然就拒绝访问了。你可能遇到以下场景:

  • 容器之间互相Ping不通
  • 宿主机访问不到映射的端口
  • 容器内域名死活解析失败

这些问题往往让开发者抓狂。本文将基于Linux技术栈,通过真实的故障模拟和代码示例,带您建立系统化的排查思路。


二、Docker网络模型速览(关联技术)

Docker默认提供五种网络模式:

docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
0e3b7f...      bridge    bridge    local
3a8d2f...      host      host      local
c5a21d...      none      null      local

其中bridge模式最常用,默认创建名为docker0的虚拟网桥,IP段通常为172.17.0.0/16,这也是多数问题的根源。


三、容器网络不通的侦查术

场景模拟

创建两个背靠背运行的Nginx容器:

docker run -d --name nginx1 nginx:alpine
docker run -d --name nginx2 nginx:alpine
1. 检查基础网络拓扑
# 查看容器的IP地址(重点看"IPAddress"字段)
docker inspect nginx1 | grep IPAddress
docker inspect nginx2 | grep IPAddress

# 进入容器内部Ping测试
docker exec -it nginx1 ping 172.17.0.3  # 假设nginx2的IP是172.17.0.3
2. 当Ping不通时怎么办?

排查路径:

# 检查宿主机的网桥状态
brctl show docker0

# 查看容器网卡是否正常
nsenter -t $(docker inspect -f '{{.State.Pid}}' nginx1) -n ip addr

# 验证iptables规则(重点看FORWARD链)
iptables -L -n -v | grep FORWARD
典型故障案例:

iptables的FORWARD策略被误设置为DROP时:

# 临时恢复通信(生产环境需谨慎)
iptables -P FORWARD ACCEPT

四、端口映射失败的破局之道

场景还原

运行一个映射到宿主机80端口的容器:

docker run -d -p 80:80 --name web nginx:alpine

但通过curl localhost:80却返回Connection refused

排查三板斧
# 1. 确认端口绑定状态
ss -tulnp | grep 80

# 2. 检查Docker代理进程
ps aux | grep docker-proxy

# 3. 深入容器内部验证监听
docker exec web netstat -tuln | grep 80

# 4. 终极武器——tcpdump抓包
tcpdump -i docker0 port 80 -vv
隐蔽陷阱揭秘

当宿主机开启net.ipv4.ip_forward=0时:

# 查看内核参数
sysctl net.ipv4.ip_forward

# 临时开启(需写入sysctl.conf永久生效)
sysctl -w net.ipv4.ip_forward=1

五、DNS解析异常的捉虫记录

经典症状

容器内执行ping baidu.com提示Temporary failure in name resolution

诊断流程
# 1. 检查resolve.conf配置
docker exec -it web cat /etc/resolv.conf

# 2. 测试DNS服务器连通性
docker exec web ping 8.8.8.8

# 3. 手动指定DNS查询
docker exec web nslookup baidu.com 8.8.8.8

# 4. 检查Docker守护进程配置
cat /etc/docker/daemon.json | grep dns
配置实战

通过daemon.json强制指定DNS:

{
  "dns": ["8.8.8.8", "114.114.114.114"]
}

重启服务生效:

systemctl restart docker

六、不同应用场景的解法选择

开发环境
  • 推荐使用默认bridge网络
  • 调试时临时启动--network host模式
生产环境
  • 使用自定义bridge网络隔离服务
  • 通过--dns参数覆盖单个容器的DNS配置
微服务架构
  • 采用overlay网络实现跨主机通信
  • 配合Consul等工具实现服务发现

七、技术选型的辩证思考

网络模式 优点 缺点
bridge 默认隔离,IP自动分配 NAT带来性能损耗
host 零转换,性能最优 端口冲突风险高
overlay 支持跨主机通信 需要额外配置Swarm集群
macvlan 直接分配物理IP 需要网卡支持

八、避坑指南(注意事项)

  1. 避免随意修改docker0的默认IP段
  2. 生产环境慎用--network=host模式
  3. 注意系统防火墙与Docker的兼容性
  4. 定期执行docker network prune清理僵尸网络

九、总结:构建你的排查工具箱

通过三大典型问题的实战拆解,我们可以总结出系统化的解决思路:

  1. 先内后外:从容器的网络栈检查到宿主机环境验证
  2. 分层突破:从物理连通性到协议层逐步排查
  3. 善用工具:掌握tcpdump、nsenter等瑞士军刀

记住:90%的Docker网络问题都能通过docker network inspectiptables -t nat -L -n找到线索。