You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

自定义Docker网络故障求助:容器连通性与解析异常

Docker桥接网络故障排查与修复方案

听起来你碰到了Docker桥接网络的典型间歇性故障,这种问题通常和内核网络参数、Docker的iptables规则管理或者系统防火墙冲突有关,我结合处理过的类似案例,给你一步步的排查和修复思路:

问题复盘

先确认下你的核心问题:

  • 容器无法ping通外部公网(如8.8.8.8
  • 同网络容器能解析IP但无法ping通
  • 容器内DNS解析超时
  • 重启Docker/服务器偶尔能解决,但无规律
  • 已尝试重装Docker、清空iptables、重启网络等操作,但未彻底解决

排查与修复步骤

1. 验证内核IP转发是否开启

Docker桥接网络依赖内核的IP转发功能,这是最常见的故障点之一:

  • 临时检查:sysctl net.ipv4.ip_forward,输出应为net.ipv4.ip_forward = 1
  • 如果是0,临时开启:sysctl -w net.ipv4.ip_forward=1
  • 永久生效:编辑/etc/sysctl.conf,添加或修改为net.ipv4.ip_forward=1,然后执行sysctl -p加载配置

2. 确保Docker自动管理iptables规则

手动清空iptables后,Docker可能未重新生成必要的规则,导致网络不通:

  • 检查Docker配置文件/etc/docker/daemon.json,确保包含以下内容:
    {
      "iptables": true,
      "ip-masq": true
    }
    
  • 如果文件不存在,直接创建;如果已有内容,添加上述键值对
  • 重启Docker服务:systemctl restart docker
  • 验证规则是否生成:iptables-save | grep DOCKER,应该能看到大量DOCKER-*开头的规则

3. 检查容器路由与网关连通性

容器的网络必须指向正确的网关才能对外通信:

  • 先找到你的自定义网桥名称:docker network inspect docker_network | jq .[].Options."com.docker.network.bridge.name",输出类似docker0或者br-xxxxxx
  • 检查网桥的IP地址:ip addr show <网桥名称>,确认网关IP(通常是子网的第一个IP,比如172.200.0.1
  • 进入容器检查路由:docker exec container_a ip route,应该能看到类似default via 172.200.0.1 dev eth0的默认路由
  • 在容器内ping网关:docker exec container_a ping 172.200.0.1,如果ping不通,说明网桥与容器的链路有问题,尝试删除并重建网络:
    docker network rm docker_network
    docker-compose up -d # 重新创建网络和容器
    

4. 修复容器DNS解析问题

DNS超时通常是因为容器没有配置正确的DNS服务器:

  • 检查容器内的DNS配置:docker exec container_a cat /etc/resolv.conf,如果是空的或者指向无效的服务器,需要手动指定
  • docker-compose.yml中为网络添加DNS配置:
    networks:
      default:
        driver: bridge
        ipam:
          driver: default
          config:
            - subnet: 172.200.0.0/16
        dns:
          - 8.8.8.8
          - 1.1.1.1
    
  • 或者在Docker daemon全局配置/etc/docker/daemon.json中添加默认DNS:
    {
      "dns": ["8.8.8.8", "1.1.1.1"]
    }
    
  • 重启Docker和容器后,验证DNS:docker exec container_a nslookup google.com

5. 调整系统防火墙规则(Ubuntu ufw)

Ubuntu默认的ufw防火墙可能会阻止Docker容器的网络流量:

  • 检查ufw状态:ufw status,如果是开启状态,需要添加规则允许Docker网络:
    ufw allow in on <网桥名称>
    ufw allow out on <网桥名称>
    ufw reload
    
  • 另外,确保ufw允许IP转发:编辑/etc/default/ufw,设置DEFAULT_FORWARD_POLICY="ACCEPT",然后重启ufw:systemctl restart ufw

6. 确保必要的内核模块加载

Docker桥接需要br_netfilter模块支持,若未加载会导致网络异常:

  • 检查模块是否加载:lsmod | grep br_netfilter
  • 如果未加载,临时加载:modprobe br_netfilter
  • 永久加载:编辑/etc/modules-load.d/br_netfilter.conf,添加br_netfilter,重启系统后生效

7. 升级Docker版本(推荐)

你使用的Docker 19.03.11是比较老的版本,存在不少已知的网络bug,升级到稳定版能解决很多间歇性问题:

  • 卸载旧版本(你已经试过这一步,可跳过)
  • 安装最新稳定版:
    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    
  • 升级后重启Docker和容器,观察问题是否消失

最后排查:查看日志定位深层问题

如果上述步骤都无法解决,查看日志找线索:

  • Docker服务日志:journalctl -u docker.service -f,看启动或运行时的报错
  • 内核网络日志:dmesg | grep -i network,查找内核层面的网络异常

内容的提问来源于stack exchange,提问作者Bajzáth Dávid

火山引擎 最新活动