Docker 的 `docker0` 设备反复死机(`inet addr` 消失)

问题描述 投票:0回答:5

我在 Ubuntu 14.04 上运行

Docker version 1.4.1, build 5bc2ff8
。当我
docker run
任何容器时,几分钟后我的
docker0
桥“死亡”,并且容器停止能够访问网络。在连接中断之前,运行
ifconfig
会报告带有
docker0
inet addr
设备,例如:

docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          [... etc.]

但是连接断开后,

ifconfig
显示ipv4地址已经消失了:

docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99 
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8116 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15995 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2444859 (2.4 MB)  TX bytes:17440729 (17.4 MB)

重新启动docker,例如使用

sudo service docker restart
,使设备恢复 - 但我所有的容器都死掉了,问题又开始了。我无法可靠地让任何东西一次运行超过几分钟。对于大多数项目来说,时间甚至不足以完成
docker build

  1. 这可能是什么原因造成的?
  2. 如何诊断?
  3. 有哪些可能的解决方案?

谢谢!


更新:我可以通过使用

docker0
启动容器,然后使用
docker run -t -i ubuntu /bin/bash
退出来可靠地触发此
ctrl-d
删除行为。当我这样做时,这就是我在
/var/log/syslog

中看到的内容
myhost kernel:  docker0: port 1(veth80ddeaf) entered disabled state
myhost kernel:  device veth80ddeaf left promiscuous mode
myhost kernel:  docker0: port 1(veth80ddeaf) entered disabled state
'

myhost dhclient: Internet Systems Consortium DHCP Client 4.2.4
myhost dhclient: Copyright 2004-2012 Internet Systems Consortium.
myhost dhclient: All rights reserved.
myhost dhclient: For info, please visit https://www.isc.org/software/dhcp/
myhost dhclient: 
myhost dhclient: Listening on LPF/docker0/56:84:7a:fe:97:99
myhost dhclient: Sending on   LPF/docker0/56:84:7a:fe:97:99
myhost dhclient: Sending on   Socket/fallback
myhost kernel:  IPv6: ADDRCONF(NETDEV_UP): docker0: link is not ready

更新#2:失败的频率似乎取决于容器运行的时间。例如:

docker run -i -t  ubuntu   sleep 0
--> `docker0` "survives" ~100% of the time

docker run -i -t  ubuntu   sleep 1
--> `docker0` survives ~80% of the time

docker run -i -t  ubuntu   sleep 5
--> `docker0` survives ~0% of the time
networking docker containers connectivity
5个回答
6
投票

我也遇到过类似的问题:每次我重新启动docker时,

docker0
桥都会上升,然后,一旦我执行
docker run hello-world
并且程序退出,它就消失了。我无法让 hello-world 再次工作,因为
docker0
消失了。

所以我从一台docker经常工作的PC和我遇到这个问题的PC上检查了系统日志(通过

gnome-system-log
的syslog),来自hello world命令的日志在顺序上有点不同,但本质上是相同的。但我注意到以下几点:在有问题的 PC 上,docker 使用
netscript
来处理网络接口,当我通过
sudo apt remove netscript-2.4
将其删除并使用
sudo systemctl restart docker
重新启动 docker 时,一切都恢复正常。


3
投票

如何诊断?

docker0
有 IP 地址时,如果您启动任何容器,它会消失吗?如果它无限期地持续到您启动容器为止,我将首先查看 Docker 日志,并在启动容器时跟踪系统日志。

IP 地址是否会按照设定的时间间隔(例如每 N 分钟)消失?如果是这样,我会从

cron
查找日志,看看是否有某个周期性任务负责。

您正在运行 NetworkManager 吗?禁用 NetworkManager 是否可以解决问题?我在带有 NetworkManager 的系统上运行 Docker 没有问题,但我在配置中设置了

no-auto-default=*
,这可能会对此类事情产生影响。

更新

这很可疑:

myhost dhclient: Internet Systems Consortium DHCP Client 4.2.4
myhost dhclient: Copyright 2004-2012 Internet Systems Consortium.
myhost dhclient: All rights reserved.
myhost dhclient: For info, please visit https://www.isc.org/software/dhcp/
myhost dhclient: 
myhost dhclient: Listening on LPF/docker0/56:84:7a:fe:97:99
myhost dhclient: Sending on   LPF/docker0/56:84:7a:fe:97:99
myhost dhclient: Sending on   Socket/fallback

不应该有任何

dhclient
进程在监听
docker0
,这绝对是导致您的 IP 地址消失的原因。如果您没有在此接口上显式运行 dhcp 客户端,则这确实表明 NetworkManager 实际上正在尝试管理此接口。您说您禁用了 NetworkManager,但您是否确认该进程已停止?正在监听
dhclient
docker0
的父进程是什么?如果停止
dhclient
进程,它会重新启动吗?问题就消失了吗?


3
投票

wcid
服务似乎确实是原因。 我在配置中找到:

(/etc/wicd/manager-settings.conf): 有线接口 = docker0

我将其更改为

eth0

我忘记重新启动服务,但是当

wicd
服务停止后,我的问题就消失了。 进行上述更改后,我再次启动它,就没有再遇到任何问题了。

显然存在一些自动配置问题

wicd

要让桥再次工作,您可以使用:

sudo ip addr add 172.17.0.1/24 dev docker0

桥接器将取回 IP。


1
投票

我遇到了完全相同的问题,根本原因是

wicd
。跑步:

sudo service wicd stop
sudo service docker restart

...应该可以解决问题。


0
投票

对于 Ubuntu 22: 简而言之:

sudo apt remove netscript-2.4

是的,这个解法和前面的解是等价的,但是前面的很难明白重点。

© www.soinside.com 2019 - 2024. All rights reserved.