如何调试容器网络问题
常见的容器网络问题
Docker 容器网络问题在面试和实际工作中都是高频话题。常见问题包括:
- 容器无法访问外部网络
- 容器之间无法通信
- DNS 解析失败
- 端口映射不生效
- 网络延迟高或丢包
- IP 地址冲突
下面逐一介绍排查方法和工具。
基础排查命令
0. 确认容器状态和网络配置
# 查看容器详情(包含网络配置)
docker inspect container_name | grep -A 20 "NetworkSettings"
# 查看容器的 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
# 列出容器的端口映射
docker port container_name
1. 检查网络连通性
# 在容器内执行 ping(需容器有 ping 命令)
docker exec container_name ping 8.8.8.8
# 测试端口可达性
docker exec container_name bash -c 'exec 3<>/dev/tcp/8.8.8.8/80; echo "OK"'
# 使用 curl 测试 HTTP 服务
docker exec container_name curl -v http://other-container:8080
2. DNS 排查
# 查看容器 DNS 配置
docker exec container_name cat /etc/resolv.conf
# 测试域名解析
docker exec container_name nslookup google.com
# 或
docker exec container_name getent hosts google.com
3. 路由跟踪
# 查看路由表
docker exec container_name ip route
# 追踪网络路径
docker exec container_name traceroute 8.8.8.8
# 查看网络接口
docker exec container_name ip addr
进阶排查技巧
使用 nsenter 进入网络命名空间
当容器内缺少工具(没有 ping、tcpdump 等)时,可以从宿主机进入容器的网络命名空间:
# 获取容器 PID
PID=$(docker inspect -f '{{.State.Pid}}' container_name)
# 进入容器的网络命名空间
nsenter -t $PID -n
# 现在可以使用宿主机上的网络工具了
ip addr
ping 8.8.8.8
ss -tlnp
tcpdump -i eth0
抓包分析
# 在宿主机上对容器的 veth 接口抓包
# 先找到 veth 接口
PID=$(docker inspect -f '{{.State.Pid}}' container_name)
cat /proc/$PID/net/if_inet6 # 查看接口索引
# 使用 nsenter 进入命名空间后直接抓包
nsenter -t $PID -n
tcpdump -i eth0 -nn port 80
iptables 排查
# 查看 NAT 规则(端口映射的关键)
iptables -t nat -L -n -v
# 查看 FORWARD 链(容器间通信关键)
iptables -L FORWARD -n -v
# 查看 Docker 专用链
iptables -t nat -L DOCKER -n -v
iptables -L DOCKER -n -v
iptables -L DOCKER-USER -n -v
网络性能测试
# 安装 iperf3 测试带宽
docker run --rm networkstatic/iperf3 -c server_ip
# 测试延迟
docker run --rm alpine ping -c 10 target_ip
典型场景排查流程
场景:容器无法访问外网
排查步骤:
# 1. 检查宿主机网络
ping 8.8.8.8
# 2. 检查容器 DNS
docker exec container_name cat /etc/resolv.conf
# 3. 检查容器路由
docker exec container_name ip route
# 4. 检查 NAT 规则
iptables -t nat -L POSTROUTING -n -v
# 5. 检查 IP 转发是否开启
cat /proc/sys/net/ipv4/ip_forward
场景:容器间无法通信
# 1. 确认在同一个网络
docker network inspect bridge | grep -E "(Name|IPv4Address)"
# 2. 检查是否在同一个自定义网络
docker ps --format "table {{.Names}}\t{{.Networks}}"
# 3. 检查 iptables FORWARD 规则
iptables -L FORWARD -n -v | grep DROP
场景:端口映射不生效
# 1. 确认端口绑定是否成功
docker port container_name
# 2. 检查端口是否被占用
ss -tlnp | grep 8080
# 3. 检查防火墙
iptables -L -n | grep 8080
# 4. 确认容器内有进程监听该端口
docker exec container_name ss -tlnp
# 5. 确认绑定地址(特别注意限制在 127.0.0.1 的情况)
docker inspect container_name | grep PortBindings
调试工具清单
| 工具 | 用途 | 安装包 |
|---|---|---|
| ping | 网络连通性测试 | iputils-ping |
| traceroute | 路由追踪 | traceroute |
| nslookup/dig | DNS 解析 | dnsutils |
| curl | HTTP 测试 | curl |
| tcpdump | 抓包分析 | tcpdump |
| iptables | 防火墙规则 | iptables |
| iproute2 | 网络接口/路由 | iproute2 |
| netstat/ss | 端口监听 | net-tools/iproute2 |
| nmap | 端口扫描 | nmap |
| iperf3 | 网络性能 | iperf3 |
创建自带调试工具的镜像:
docker run -it --rm alpine sh -c "apk add --no-cache iputils bind-tools curl tcpdump iptables iproute2 && sh"
面试要点
- 理解 Docker 网络模型:bridge、host、overlay 的区别
- 掌握 iptables 规则:Docker 通过 iptables 实现端口映射和网络隔离
- 熟悉排查工具:ping、traceroute、tcpdump、ss、nsenter
- 常见问题原因:IP 转发未开启、防火墙拦截、DNS 配置错误、网络命名空间问题
- 网络插件排查:如果使用 Calico/Flannel,需了解其排错命令
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容