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


106

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

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

这是一个例子:

[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,如何解决此问题?

Answers:


177

我查看了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

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


15
在Ubuntu上,我需要sudo sysctl -p重新加载设置(未找到systemctl)。
纳乔·科洛玛

2
仅在尝试从主机访问容器(用于测试)时,Centos 7便需要此解决方案。
Dave C

我在Windows主机(在Hyper-V上)上运行的容器中也遇到了类似情况。Windows是否有类似的设置?
Anthony Mastrean

4
但是为什么需要它?网络在没有转发的情况下运行正常,因此
docker

2
@ user3338098,因为基础内部网络正在接口之间转发流量以获取Internet访问权限。这需要向任何linux系统表明它将以网络路由器很长时间的方式在接口之间路由通信。默认情况下,此功能是关闭的,因为大多数linux机器都不会转发,而意外转发流量将在最坏的情况下对安全构成威胁,或在最好的情况下会使网络复杂化。
约西亚

25

尝试重新启动Docker服务。

例如,对于Ubuntu:

$ sudo systemctl restart docker


5
在CentOS7上,此问题突然出现,只需重启docker服务即可正常运行。
steven87vt

1
这行之有效,令我感到紧张,因为我不知道为什么行。有人知道吗?还是至少有步骤重复失败?
约西亚

再生产?在升级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 repo:@ docker-ol7-prod)
JohannesB

有效,谢谢!但是有人知道它是如何做到的吗?
c0degeas

17

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

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


2
对于运行中的单个容器很有用。参数为--net=host
Max13

1
现在,这种方法的问题是,如果您有多个容器并行运行(例如在Jenkins上),则端口是共享的,并且冒着在这些共享端口上碰到问题的风险。具体来说,我们正在使用赛普拉斯(Cypress)运行e2e测试,而Xvfb却遇到问题,因为已经占用了端口,因此无法生成新实例。
Alex Rashkov

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.