You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器无法对外发起HTTP请求及容器间通信异常排查求助

Docker容器网络阻塞排查指南

问题概述

新搭建的Ubuntu 22.04.1服务器,使用Docker版本20.10.21,镜像由旧Ubuntu 20.04服务器上正常运行的Dockerfile构建。但新环境出现以下异常:

  • 容器内部无法访问外部网络(如执行wget google.com能解析IP,但连接过程一直挂起)
  • 外部无法访问容器提供的服务
  • 同一自定义桥接网络docker.mynet内,反向代理容器无法访问应用容器
  • 特殊现象:container1可正常对外发起请求,container2在旧服务器运行正常,但新服务器上不行

用到的网络配置

创建自定义桥接网络:

docker network create docker.mynet --driver bridge

为container1连接网络:

docker network connect docker.mynet container1

启动并连接container2:

docker run --name container2 -d -p 8485:8080 \
   --network docker.mynet \
   $IMAGE:$VERSION

排查步骤

1. 验证基础网络连通性

  • 在新服务器宿主机执行wget google.com,先排除宿主机本身网络故障
  • 进入container2,用ip route show查看默认网关,再ping该网关,确认能否连通Docker网桥网关
  • 对比container1和container2的网络配置:执行docker inspect container1和docker inspect container2,查看NetworkSettings下的IP、网关、DNS配置是否一致

2. 检查Docker网桥与iptables规则

  • 查看Docker网桥状态:ip link show docker0和ip link show br-<网络ID>(网络ID通过docker network ls查询),确认网桥已正常启动
  • 检查iptables的nat表规则:iptables -t nat -L -n,确认存在DOCKER链,且自定义网桥的SNAT规则已配置(负责容器出站流量的地址转换)
  • 查看新服务器ufw防火墙状态:ufw status,若开启,确认是否允许Docker相关端口及网桥流量通过,可临时关闭ufw测试是否恢复正常

3. 排查DNS与路由配置

  • 在container2内查看/etc/resolv.conf,对比container1的DNS配置,确认使用了正确的DNS服务器(如宿主机DNS或公共DNS)
  • 测试容器内DNS解析稳定性:nslookup google.com,即使解析已成功,也需确认无间歇性异常
  • 检查宿主机路由表:ip route show,确保Docker网桥的路由条目存在,且默认路由配置正常

4. 检查Docker daemon配置与版本兼容性

  • 查看Docker daemon配置文件/etc/docker/daemon.json,确认是否有自定义网络配置(如bip、dns等),对比旧服务器配置找差异
  • 检查Docker服务状态:systemctl status docker,查看是否有异常日志,可尝试重启Docker服务:systemctl restart docker
  • 考虑Ubuntu 22.04与Docker 20.10.21的兼容性,尝试升级Docker到较新版本(如24.x系列)测试

5. 排查容器镜像与启动参数

  • 对比container1和container2的启动参数,确认是否有网络相关限制(如--cap-drop、--security-opt等参数)
  • 重新构建镜像(即使Dockerfile相同,新环境构建缓存可能存在差异),用新镜像启动container2测试
  • 拉取官方镜像(如ubuntu:22.04)启动临时容器,加入docker.mynet网络测试连通性,排除自定义镜像的问题

6. 检查内核与网络模块

  • 查看新服务器内核版本:uname -r,对比旧服务器确认内核网络模块是否存在差异
  • 检查必要内核模块是否加载:lsmod | grep br_netfilter、lsmod | grep ip_tables,未加载则手动加载:modprobe br_netfilter、modprobe ip_tables
  • 检查sysctl网络参数:sysctl net.ipv4.ip_forward,确认值为1(Docker需开启IP转发),若不是则执行sysctl -w net.ipv4.ip_forward=1,并写入/etc/sysctl.conf永久生效

内容的提问来源于stack exchange,提问作者not2savvy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:01:25