如何调试容器网络问题

如何调试容器网络问题

常见的容器网络问题

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"

面试要点

  1. 理解 Docker 网络模型:bridge、host、overlay 的区别
  2. 掌握 iptables 规则:Docker 通过 iptables 实现端口映射和网络隔离
  3. 熟悉排查工具:ping、traceroute、tcpdump、ss、nsenter
  4. 常见问题原因:IP 转发未开启、防火墙拦截、DNS 配置错误、网络命名空间问题
  5. 网络插件排查:如果使用 Calico/Flannel,需了解其排错命令
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容