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

Mar*_*les 81 docker docker-networking

主机中的容器"突然"失去与外部世界容器的连接.然而,一些主机被刷新,突然我们遇到以下情况:

  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
Run Code Online (Sandbox Code Playgroud)

现在,从容器本身,我们无法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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*les 155

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

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

net.ipv4.ip_forward=1
Run Code Online (Sandbox Code Playgroud)

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

[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
Run Code Online (Sandbox Code Playgroud)

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

  • 在Ubuntu上我需要`sudo sysctl -p`来重新加载设置(找不到systemctl). (11认同)
  • 但是为什么需要它?网络在没有转发的情况下运行正常,因此docker也不应要求它... (3认同)
  • 仅在尝试从主机访问容器(用于测试)时,Centos 7便需要此解决方案。 (2认同)
  • @user3338098,因为底层内部网络正在接口之间转发流量以获得互联网访问权限。长期以来,这一直需要向任何 Linux 系统表明它以网络路由器的方式在接口之间路由流量。默认情况下此功能是关闭的,因为大多数 Linux 机器不进行转发,意外转发流量在最坏的情况下会构成安全威胁,或者在最好的情况下会使您的网络变得复杂。 (2认同)

Dmi*_*lov 59

尝试重新启动 Docker 服务。

例如对于 Ubuntu:

$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

  • 在CentOS7上突然出现这个问题,只需重新启动docker服务即可完美解决。 (7认同)
  • 这有效,让我紧张,我不知道为什么它有效。有人知道吗?或者至少采取步骤重复失败? (3认同)
  • 直到现在,在今天花了很多时间解决问题之后,我才意识到 docker 在守护进程启动时运行 `sysctl -w net.ipv4.ip_forward=1`,而我的 sysctl 中有 `net.ipv4.ip_forward=0`。 conf 文件。这解释了为什么我突然遇到容器无法“随机”访问外部网络的问题......终于解决了一个长期的谜团! (3认同)
  • 它有效,谢谢!但有人知道它是如何完成这项工作的吗? (2认同)

小智 8

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

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

  • 对运行中的单个容器很有用。参数是`--net=host` (2认同)
  • 也适用于 docker build,谢谢! (2认同)

小智 5

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

systemctl restart network
Run Code Online (Sandbox Code Playgroud)