Docker 网络已禁用:警告:IPv4 转发已禁用。网络将无法正常工作

Posted

技术标签:

【中文标题】Docker 网络已禁用:警告:IPv4 转发已禁用。网络将无法正常工作【英文标题】:Docker Networking Disabled: WARNING: IPv4 forwarding is disabled. Networking will not work 【发布时间】:2017-05-18 02:54:09 【问题描述】:

主机中的容器“突然”失去与外部容器的连接。但是,有些主机刷新了,突然出现以下情况:

    主机可以与其他主机通信。 在主机中运行的容器无法与其他主机通信。

这是一个例子:

[root@pprdespap322 deploy]# ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=64 time=0.282 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=64 time=0.341 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.282/0.311/0.341/0.034 ms

现在,从容器本身,我们无法 ping 同一个主机:

[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
WARNING: IPv4 forwarding is disabled. Networking will not work.
ping: unknown host ci.docker.company.net

我第一次看到这个警告是在 Docker 的初始版本中... 有 Docker 1.9.1 和 1.10.3,如何解决这个问题?

【问题讨论】:

【参考方案1】:

我查看了http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html,它帮助我解决了主机上的问题。

我在 /etc/sysctl.conf 中添加了以下内容:

net.ipv4.ip_forward=1

然后我重新启动了网络服务并验证了设置:

[root@pprdespap322 deploy]#  systemctl restart network
[root@pprdespap322 deploy]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
[root@pprdespap322 deploy]# docker run -ti quay.io/coreos/registry ping ci.docker.company.net
PING pprdespap324.corp.company.net (10.137.55.22) 56(84) bytes of data.
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=1 ttl=63 time=0.329 ms
64 bytes from pprdespap324.corp.company.net (10.137.55.22): icmp_seq=2 ttl=63 time=0.306 ms
^C
--- pprdespap324.corp.company.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.306/0.317/0.329/0.021 ms

现在所有容器都可以与外界容器通信了!

【讨论】:

在 Ubuntu 上我需要 sudo sysctl -p 重新加载设置(未找到 systemctl)。 在 Centos 7 上简单地尝试从主机访问容器(用于测试)时需要此解决方案。 我在 Windows 主机(在 Hyper-V 上)上运行的容器中也有类似的情况。 Windows 是否有类似的设置? 但为什么需要它?网络在没有转发的情况下运行良好,因此 docker 也不应该要求它...... @user3338098,因为底层内部网络正在接口之间转发流量以获得互联网访问权限。这需要向任何 linux 系统指示它将以网络路由器在很长一段时间内所做的方式在接口之间路由流量。默认情况下这是关闭的,因为大多数 linux 机器不进行转发,并且意外地转发流量在最坏的情况下会成为安全威胁,或者在最好的情况下真正使您的网络复杂化。【参考方案2】:

尝试添加--network=hostdocker run 命令来解决此问题。

https://medium.com/@gchandra/docker-ipv4-forwarding-is-disabled-8499ce59231e

【讨论】:

对运行中的单个容器很有用。参数为--net=host 现在这种方法的问题是,如果你有多个并行运行的容器,比如在 Jenkins 上,端口是共享的,你可能会在这些共享端口上遇到问题。具体来说,我们正在使用 Cypress 运行 e2e 测试,并且由于端口已被占用,我们遇到了 Xvfb 无法生成新实例的问题。 这帮助我解决了 Maven 和 fabric8io 的错误,即在构建映像时安装软件失败,因为找不到 rpm 存储库。 也适用于 docker build,谢谢! 这与 Gitlab 中的 docker-in-docker (dind) 配置一起用于 docker 构建非常有效。谢谢!【参考方案3】:

尝试重启 Docker 服务。

例如对于 Ubuntu:

$ sudo systemctl restart docker

【讨论】:

在 CentOS7 上突然出现这个问题,只需重新启动 docker 服务就可以完美运行。 这行得通,让我很紧张,因为我不知道它为什么行得通。有人有线索吗?或者至少要重复失败的步骤? 复制?它发生在升级 Docker 并重新启动后(在带有内核的 Oracle Linux Server 7.8 版上:- 3.10.0-1127.el7.x86_64 #1 SMP Wed Apr 1 10:20:09 PDT 2020 x86_64 x86_64 x86_64 GNU/Linux - 升级 Docker至:docker-ce-3:19.03.8-3.el7.x86_64 通过 yum 仓库:@docker-ol7-prod) 它有效,谢谢!但有人知道它是如何完成这项工作的吗? 也对我有用,知道为什么会发生吗?【参考方案4】:

解决了我重启网络的问题。

systemctl restart network

【讨论】:

以上是关于Docker 网络已禁用:警告:IPv4 转发已禁用。网络将无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习笔记(9-3)Docker容器与外部网络的连接(待加强)

Docker使用错误小结

docker 错误 WARNING: IPv4 forwarding is disabled. Networking will not work.

Docker 平台基本使用方法

Docker:ping:未知主机 yahoo.com

powershell 启用或禁用网络绑定(即禁用IPv4或启用IPv6)