如何解决docker容器访问不了外部网络问题

 更新时间:2024年11月12日 10:48:51   作者:一只牛博  
介绍了Docker bridge网络的工作原理,包括虚拟网桥的创建、容器的IP地址分配、IP转发的作用以及NAT的配置,通过配置IP转发和NAT规则,Docker能够实现容器与外部网络之间的通信,文章还提供了解决某个具体问题的步骤

前戏

事情的起因是我在服务器A中部署了一个用docker实现的java项目,这个项目中依赖于另一台服务器中的elasticsearch,但是一直显示无法连接,

进入容器ping一下试试看

很显然,网络不通

docker中的bridge网络详解

在 Docker 中,bridge 网络 是最常用的网络模式之一,它通过虚拟网桥(如默认的 docker0)来连接容器。

容器之间以及容器与外部网络的通信,需要依赖 Linux 主机的 IP 转发功能。

这是因为 Docker 网络模型本质上是通过 Linux 的虚拟网络设备、iptables 和 IP 转发等内核功能来实现的。

1. 什么是 Docker bridge 网络?

当 Docker 启动时,它会自动创建一个名为 docker0 的虚拟网桥,类似于一个软件交换机。所有使用 bridge 模式运行的容器,都会自动连接到 docker0 上,并被分配一个 IP 地址。

2. IP 转发的作用

当你在 Docker 中使用 bridge 网络时,IP 转发 起到以下关键作用:

  • 容器与外部网络的通信:当容器 A(在 docker0 网络中)想要访问外部网络(比如互联网或其他主机)时,数据包会通过 docker0 虚拟网桥被发送到主机的网络接口(如 eth0)。在这种情况下,主机必须启用 IP 转发功能,才能将这些数据包从 docker0 转发到外部网络。
  • 容器之间的通信:容器 A 和容器 B 在 docker0 虚拟网桥上被分配了不同的 IP 地址,Linux 需要启用 IP 转发来在它们之间路由数据包。例如,容器 A 的 IP 地址为 172.17.0.2,容器 B 的 IP 地址为 172.17.0.3,如果 A 需要与 B 通信,数据包需要通过 docker0 网桥进行转发。
  • NAT(网络地址转换)和外部访问:为了使容器能够访问外部网络(如互联网),Docker 通常会通过 NAT 来隐藏容器的内部 IP 地址(例如 172.17.0.x),这需要主机具有 IP 转发能力。Docker 会通过 iptables 将内部容器网络的流量进行 SNAT(源地址转换),并转发到主机的物理网络接口上。

3. IP 转发如何帮助 Docker 网络工作?

在 Linux 主机中,IP 转发的配置位于 /proc/sys/net/ipv4/ip_forward。如果该值为 0,则表示 IP 转发被禁用;如果该值为 1,则表示启用。Docker 依赖这个设置来实现容器与外部网络之间的通信。

当 Docker 创建 bridge 网络时,内部机制包括以下几步:

  • 创建虚拟网桥(如 docker0**)**。
  • 给每个连接到该网桥的容器分配一个虚拟网卡(veth 设备)
  • 配置 IP 转发:确保 Linux 主机启用了 IP 转发,以便将不同网络接口之间的数据包进行转发。

Docker 通过这种方式,将每个容器的 veth 设备与虚拟网桥 docker0 连接,形成一个桥接网络。Linux 内核的 IP 转发机制则负责管理这些网络接口之间的通信。

4. 配置 IP 转发的步骤

在 Docker 主机上启用 IP 转发通常是自动的,但如果你需要手动启用或进行故障排查,可以参考以下步骤:

  • 检查 IP 转发是否启用cat /proc/sys/net/ipv4/ip_forward
  • 临时启用 IP 转发(在系统重启前有效):echo 1 > /proc/sys/net/ipv4/ip_forward
  • 永久启用 IP 转发:编辑 /etc/sysctl.conf 文件,添加或修改以下内容:net.ipv4.ip_forward = 1

然后运行以下命令以应用:sysctl -p

5. bridge 网络中的 NAT 和 iptables

为了使容器能够访问外部网络,Docker 会自动配置 NAT 规则。Docker 默认会在 docker0 网桥上创建 iptables 规则,使得从内部网络发往外部的流量进行 SNAT(源地址转换)。

这就意味着,来自容器的请求会以主机的 IP 地址作为源 IP 发往外部网络,这样容器之间和容器与外部网络之间的通信才得以实现。

例如:

​Docker 会创建如下的 iptables 规则来进行 NAT:

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

解决

可以认真看一下上面的,里面就有解决方案,我这里仅临时展示解决一下

执行

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

加餐

明明服务器A可以telnet服务器B的es服务,但是还会报错

在服务器B进行抓包可以看到如下

显示被拒绝了,这个情况我是感到很无语的

进入服务器A中的java容器去ping一下服务器B的地址,你会发现它好了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Dockerfile文件详细介绍

    Dockerfile文件详细介绍

    Dockerfile 是一个文本文件,里面包含组装新镜像时用到的基础镜像和各种指令。使用dockerfile 文件来定义镜像,然后运行镜像,启动容器。本文详细介绍了Dockerfile文件,感兴趣的小伙伴可以参考一下
    2023-04-04
  • docker交叉编译工具链解读

    docker交叉编译工具链解读

    使用Docker容器进行交叉编译具有环境隔离、一致性、可移植性和简化配置等优势,以下是一个示例的Dockerfile,用于创建一个包含C++11 ARM交叉编译工具链的Docker容器,构建完成后,可以在容器中进行ARM交叉编译
    2024-12-12
  • docker国内镜像源配置及走代理设置小结

    docker国内镜像源配置及走代理设置小结

    本文主要介绍了配置Docker国内镜像源及代理设置,以加快镜像拉取速度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Docker搭建SVN服务器的实现步骤

    Docker搭建SVN服务器的实现步骤

    本文主要介绍了Docker搭建SVN服务器的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 详解Centos7 下建立 Docker 桥接网络

    详解Centos7 下建立 Docker 桥接网络

    本篇文章主要介绍了详解Centos7 下建立 Docker 桥接网络,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Docker容器网络不通排查指南

    Docker容器网络不通排查指南

    本文主要介绍了Docker容器网络不通排查指南,包括容器无法访问外网、容器间网络不通、端口映射不生效、DNS解析失败以及跨主机容器通信等常见问题的诊断方法,感兴趣的可以了解一下
    2026-02-02
  • docker搭建minio服务器,解决内网穿透后外网无法访问

    docker搭建minio服务器,解决内网穿透后外网无法访问

    这篇文章主要介绍了docker搭建minio服务器,解决内网穿透后外网无法访问的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • mac系统使用docker搭建nacos(亲测有效)

    mac系统使用docker搭建nacos(亲测有效)

    本文主要介绍了mac系统使用docker搭建nacos,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • 在Centos7 中更改Docker默认镜像和容器的位置

    在Centos7 中更改Docker默认镜像和容器的位置

    这篇文章主要介绍了在Centos7 下更改Docker默认镜像和容器的位置,需要的朋友可以参考下
    2017-05-05
  • Docker部署springboot项目实例解析

    Docker部署springboot项目实例解析

    这篇文章主要介绍了docker部署springboot项目实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论