Docker容器网络不通排查指南

 更新时间:2026年02月11日 09:03:18   作者:花宝宝hua  
本文主要介绍了Docker容器网络不通排查指南,包括容器无法访问外网、容器间网络不通、端口映射不生效、DNS解析失败以及跨主机容器通信等常见问题的诊断方法,感兴趣的可以了解一下

前言

容器跑起来了,但是网络不通——ping不通外网、容器间互相访问不了、端口映射不生效…

这类问题排查比较麻烦,涉及容器网络、宿主机网络、iptables规则等多个层面。这篇整理一套系统的排查流程,覆盖常见的网络问题场景。

一、容器访问不了外网

症状:

docker exec -it myapp ping 8.8.8.8
# 卡住或者 Network is unreachable

第一反应:检查宿主机的IP转发有没有开。

cat /proc/sys/net/ipv4/ip_forward

如果是0,容器的包出不去。开一下:

echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效要写到sysctl.conf

还是不通?看下iptables的NAT规则:

iptables -t nat -L -n | grep MASQUERADE

应该有条类似这样的规则:

MASQUERADE  all  --  172.17.0.0/16   0.0.0.0/0

没有的话Docker的NAT可能被清掉了,重启Docker一般能恢复:

systemctl restart docker

还有一个大坑:firewalld。CentOS默认开着,它和Docker的iptables规则会打架。

# 先关了试试
systemctl stop firewalld

如果关了就好了,说明是防火墙的问题。正式解决要配置firewalld的docker zone,或者干脆用iptables。

二、容器间网络不通

在同一台机器上,两个容器互相访问不了。

先确认它们在不在同一个网络:

docker inspect 容器A --format '{{.NetworkSettings.Networks}}'
docker inspect 容器B --format '{{.NetworkSettings.Networks}}'

如果都在默认的bridge网络,有个坑:默认bridge不支持通过容器名访问

docker exec 容器A ping 容器B
# ping: 容器B: Name or service not known

只能用IP:

# 先拿到IP
docker inspect 容器B --format '{{.NetworkSettings.IPAddress}}'
# 172.17.0.3

docker exec 容器A ping 172.17.0.3
# 这样就通了

嫌麻烦的话,用自定义网络:

docker network create mynet
docker network connect mynet 容器A
docker network connect mynet 容器B

# 现在可以用名字了
docker exec 容器A ping 容器B

自定义网络有内置DNS,会自动解析容器名。

三、端口映射不生效

docker run -p 8080:80 nginx
curl http://localhost:8080
# 不通

先确认服务在容器里跑起来没:

docker exec 容器 curl localhost:80

如果容器里能访问说明服务没问题,那问题在外面。

检查点:

1、服务监听的地址对不对:

docker exec 容器 netstat -tlnp

如果显示127.0.0.1:80,那外面肯定访问不了,要改成0.0.0.0:80

2、宿主机端口有没有被占:

netstat -tlnp | grep 8080

3、防火墙/安全组:

# 本地防火墙
firewall-cmd --list-ports

# 云服务器别忘了安全组

云服务器安全组没开端口是个常见的坑。

四、DNS解析失败

能ping通IP,但ping域名不行:

docker exec 容器 ping 8.8.8.8  # 通
docker exec 容器 ping baidu.com  # 不通

看下容器的DNS配置:

docker exec 容器 cat /etc/resolv.conf

如果DNS服务器不可达,最简单的办法是启动时指定:

docker run --dns 8.8.8.8 nginx

或者全局配置,改 /etc/docker/daemon.json

{
  "dns": ["8.8.8.8", "114.114.114.114"]
}

五、跨主机容器通信

这个稍微复杂点。两台机器上的容器默认是不通的,因为各自的bridge网络是隔离的。

最简单的方案:用端口映射,通过宿主机IP访问。

# 机器B上
docker run -p 8080:80 nginx

# 机器A上访问
curl http://机器B的IP:8080

想让容器直接互通的话,要用overlay网络或者第三方方案(Flannel、Calico这些)。

还有个偏门办法:如果两台主机已经通过WireGuard或者其他组网工具连在一起了,可以配静态路由让容器网段互通。不过这个配置比较麻烦,一般不推荐。

六、一键诊断脚本

懒得一个个查,写了个脚本:

#!/bin/bash
# 用法: ./check.sh 容器名

C=$1
echo "=== 检查 $C ==="

echo -e "\n[网络模式]"
docker inspect $C --format '{{.HostConfig.NetworkMode}}'

echo -e "\n[IP地址]"
docker inspect $C --format '{{.NetworkSettings.IPAddress}}'

echo -e "\n[路由]"
docker exec $C ip route 2>/dev/null || echo "无ip命令"

echo -e "\n[DNS]"
docker exec $C cat /etc/resolv.conf 2>/dev/null

echo -e "\n[外网连通性]"
docker exec $C ping -c 1 -W 2 8.8.8.8 2>/dev/null && echo "OK" || echo "不通"

echo -e "\n[宿主机IP转发]"
cat /proc/sys/net/ipv4/ip_forward

跑一下基本能看出问题在哪。

总结

Docker网络问题90%出在这几个地方:

问题原因解决
容器出不了外网ip_forward没开echo 1 > /proc/sys/net/ipv4/ip_forward
容器出不了外网防火墙拦截检查firewalld/iptables
容器间不通不在同一网络使用自定义网络
端口映射失败服务监听127.0.0.1改成监听0.0.0.0
DNS解析失败DNS服务器不可达指定DNS服务器

排查顺序:网络配置IP转发防火墙规则服务监听地址DNS配置

到此这篇关于Docker容器网络不通排查指南的文章就介绍到这了,更多相关Docker 网络不通排查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker学习之Container容器的具体使用

    Docker学习之Container容器的具体使用

    这篇文章主要介绍了Docker学习之Container容器的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Docker+keepalived+nginx实现主从热备的方法示例

    Docker+keepalived+nginx实现主从热备的方法示例

    这篇文章主要介绍了Docker+keepalived+nginx实现主从热备的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • dockerfile中CMD和ENTRYPOINT指令使用及说明

    dockerfile中CMD和ENTRYPOINT指令使用及说明

    介绍了Dockerfile中的CMD和ENTRYPOINT指令以及它们的执行方式,包括exec形式和shell形式,CMD提供默认命令,支持覆盖;ENTRYPOINT定义固定命令,不支持覆盖,但可以通过--entrypoint参数实现覆盖
    2025-11-11
  • docker生命周期管理和镜像管理命令详解

    docker生命周期管理和镜像管理命令详解

    Docker通过容器技术提供了一种轻量级、快速部署和可移植的应用程序运行环境,极大地简化了应用程序的部署和管理过程,提高了开发和运维的效率,这篇文章主要介绍了docker生命周期管理和镜像管理命令,需要的朋友可以参考下
    2023-08-08
  • Docker宿主机与容器之间的文件拷贝实例详解

    Docker宿主机与容器之间的文件拷贝实例详解

    现在公司用docker,有时候需要从容器中拷贝文件出来,下面这篇文章主要给大家介绍了关于Docker宿主机与容器之间的文件拷贝的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 使用docker制作分布式lnmp 镜像

    使用docker制作分布式lnmp 镜像

    最近在学习docker相关知识,顺便把docker制作分布式lnmp 镜像的过程分享给大家,包括Nginx配置文件和PHP文件的修改代码也一并给出,感兴趣的朋友跟随小编一起看看吧
    2021-06-06
  • docker-compose启动redis集群的实现步骤

    docker-compose启动redis集群的实现步骤

    本文主要介绍了docker-compose启动redis集群的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Docker部署MySQL主从复制的实现

    Docker部署MySQL主从复制的实现

    本文主要介绍了Docker部署MySQL主从复制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • docker运行异构镜像详解

    docker运行异构镜像详解

    介绍了在不同CPU架构下运行Docker镜像时遇到的问题及解决方法,作者分享了由于银行使用鲲鹏系统(ARM架构)导致Docker容器运行失败的经历,解决方法包括启用`--platform`参数、安装`qemu-user-static`及`binfmt_misc`
    2024-12-12
  • 如何免sudo使用docker命令详解

    如何免sudo使用docker命令详解

    有时候发现docker有的指令必须加sudo才能执行,下面这篇文章主要给大家介绍了关于如何免sudo使用docker命令的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。
    2017-12-12

最新评论