1. 问题现象与排查思路

当我们在生产环境使用Docker部署服务时,经常遇到容器无法访问外网的情况。典型表现包括:

  • 容器内无法ping通www.baidu.com
  • 容器与宿主机间网络不通
  • 跨主机容器间通信失败
  • 特定端口无法访问

排查思路建议遵循"由近及远"原则:

# 示例:基础排查命令(技术栈:Docker 20.10+)
$ docker exec -it my_container ping 8.8.8.8      # 测试基础网络连通性
$ docker exec -it my_container curl -v http://example.com  # 检查HTTP访问
$ docker network inspect bridge                # 查看默认网络配置
$ iptables -t nat -L -n -v                    # 检查NAT规则

2. 常见原因及解决方案

2.1 防火墙配置问题

(技术栈:CentOS 7 + firewalld)

# 示例:放行Docker流量
$ firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source not ip="172.17.0.0/16" drop'
$ firewall-cmd --permanent --zone=public --add-service=docker
$ systemctl restart firewalld docker

# 查看生效规则
$ firewall-cmd --list-all --zone=public

2.2 DNS解析故障

(技术栈:Ubuntu 22.04 + systemd-resolved)

# 示例:自定义DNS配置
$ docker run -d --name test_nginx \
  --dns 223.5.5.5 \
  --dns-option timeout:2 \
  nginx:alpine

# 验证DNS配置
$ docker exec test_nginx cat /etc/resolv.conf

2.3 网络模式选择不当

(技术栈:Docker overlay网络)

# 示例:创建自定义网络
$ docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --gateway 10.0.9.254 \
  my_overlay_net

# 容器接入自定义网络
$ docker service create \
  --network my_overlay_net \
  --name web_app \
  nginx:latest

3. 深度技术解析

3.1 Docker网络驱动对比

驱动类型 适用场景 跨主机通信 性能损耗
bridge 单机容器通信 不支持
host 高性能网络需求 支持
overlay 集群容器通信 支持
macvlan 物理网络直连 支持

3.2 iptables规则优化

(技术栈:Docker自定义链)

# 示例:保留自定义iptables规则
$ cat /etc/docker/daemon.json
{
  "iptables": false,
  "dns": ["8.8.8.8", "114.114.114.114"]
}

# 手动设置NAT规则
$ iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

4. 复杂场景解决方案

4.1 混合云网络穿透

(技术栈:WireGuard + Docker)

# 示例:建立VPN隧道
$ docker run -d \
  --name=wireguard \
  --cap-add=NET_ADMIN \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  -p 51820:51820/udp \
  linuxserver/wireguard

# 容器接入VPN网络
$ docker run -d --net=container:wireguard my_app

4.2 容器限速与QoS

(技术栈:tc命令)

# 示例:限制容器带宽
$ docker run -d --name limited_container \
  --ulimit nofile=1024:1024 \
  --device-write-bps /dev/sda:1mb \
  nginx:alpine

# 使用tc进行流量控制
$ tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

5. 应用场景分析

5.1 微服务架构

在Spring Cloud集群中,服务注册发现依赖网络连通性。推荐使用自定义bridge网络配合服务别名实现服务发现:

# docker-compose示例
version: '3.8'
services:
  user-service:
    networks:
      app_net:
        aliases:
          - user-service
  order-service:
    networks:
      app_net:
        aliases:
          - order-service

networks:
  app_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.22.0.0/24

5.2 大数据处理

Spark on YARN集群需要容器间高速通信,建议采用host网络模式:

$ docker run -d \
  --net=host \
  -e SPARK_MASTER_HOST=$(hostname) \
  spark:3.3.1

6. 技术方案优缺点

6.1 第三方网络插件对比

方案 安装复杂度 性能 功能完整性
Calico 完整
Flannel 基础
Weave Net 中等

7. 注意事项

  1. 生产环境避免使用--network=host模式
  2. 定期清理僵尸网络命名空间:
$ find /var/run/docker/netns/ -type f -delete
  1. Overlay网络需要开放以下端口:
  • TCP/2377 集群管理
  • TCP/7946 节点通信
  • UDP/4789 VXLAN数据

8. 文章总结

本文系统梳理了Docker容器网络故障的完整排查路径,通过大量生产环境验证的示例,展示了从基础配置到复杂场景的解决方案。建议运维人员重点关注DNS解析、防火墙策略、网络驱动选择三个核心维度,同时建立网络配置变更的标准化流程。