我在我的笔记本电脑上看到这个问题:当我使用docker run
Docker 容器时,几秒钟后我的 WiFi 互联网停止工作。我没有以太网连接来测试这方面的事情。
我不知道如何解决这个问题,我看到我有 2 个与此问题相关的网络接口:
- 无线网络接口
wlp2s0
- 码头工人界面
docker0
一旦网络 I/O 在网络接口上启动docker0
,它就会在网络接口上停止wlp2s0
。我可以使用 Web 浏览器进行检查,因为当 Docker 容器运行时,我无法通过浏览器访问任何网页。
我在 Docker 中看到了这个网络配置:
docker network list
NETWORK ID NAME DRIVER SCOPE
5d408693425d bridge bridge local
2eba59b04a5f host host local
f22b30d7782a none null local
使用时ifconfig
我看到这个:
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:e5ff:fe8a:b85c prefixlen 64 scopeid 0x20<link>
ether 02:42:e5:8a:b8:5c txqueuelen 0 (Ethernet)
RX packets 9034 bytes 1228570 (1.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9945 bytes 94278580 (94.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
wlp2s0: flags=-28605<UP,BROADCAST,RUNNING,MULTICAST,DYNAMIC> mtu 1500
inet 192.168.1.54 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 2001:b07:6477:ebfa:e46f:631e:206c:8a9e prefixlen 64 scopeid 0x0<global>
ether 04:d3:b0:ee:2f:b9 txqueuelen 1000 (Ethernet)
RX packets 3771571 bytes 3664198427 (3.6 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2460874 bytes 1439515295 (1.4 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
sudo ifconfig wlp2s0 up
停止运行的 docker 容器后,我不需要做任何事情。互联网又开始工作了。
在/etc/docker
我只看到一个名为 的文件key.json
,该文件看起来与网络设置无关(例如/etc/docker/daemon.json
DNS 条目,但它不存在)。
在这个文件中,~/.docker/config.json
我只看到对某些私有 Docker 注册表的一些授权,与网络无关。还有一些其他与令牌相关的文件,我认为这些文件不相关:
$ ls -a ~/.docker/
. .. .buildNodeID config.json .token_seed .token_seed.lock
如果我sudo systemctl restart network-manager.service
在运行 docker 容器后重新启动 NetworkManager,那么我仍然无法使用我的浏览器或例如访问互联网ping 8.8.8.8
(但ping localhost
无论我是否正在运行 Docker 容器,都可以继续工作)。
我还尝试更改 NetworkManager 配置(请参阅这里)/etc/NetworkManager/NetworkManager.conf
通过添加:
[keyfile]
unmanaged-devices=interface-name:docker0
然后使用 重新启动服务sudo systemctl restart network-manager.service
。但效果是一样的:Docker 容器启动几秒钟后,就无法通过 WiFi 访问互联网。
但是,这可能与网络管理器的错误或配置错误有关,因为当我检查服务日志service network-manager status
时,我会看到以下内容:
May 05 08:49:05 my-host NetworkManager[1269565]: <info> [1620200945.9900] dhcp6 (wlp2s0): option dhcp6_name_servers => '2001:b07:6477:ebfa:aa2b>
May 05 08:49:05 my-host NetworkManager[1269565]: <info> [1620200945.9900] dhcp6 (wlp2s0): state changed unknown -> bound
May 05 08:49:06 my-host NetworkManager[1269565]: <info> [1620200946.2184] manager: startup complete
May 05 08:53:43 my-host NetworkManager[1269565]: <info> [1620201223.6347] manager: (veth90dd212): new Veth device (/org/freedesktop/NetworkManage>
May 05 08:53:43 my-host NetworkManager[1269565]: <info> [1620201223.6358] manager: (veth9cfce50): new Veth device (/org/freedesktop/NetworkManage>
May 05 08:53:43 my-host NetworkManager[1269565]: <info> [1620201223.6374] device (veth90dd212): carrier: link connected
May 05 08:53:43 my-host NetworkManager[1269565]: <info> [1620201223.6389] device (veth9cfce50): carrier: link connected
May 05 08:53:43 my-host NetworkManager[1269565]: <info> [1620201223.6394] device (docker0): carrier: link connected
May 05 08:55:29 my-host NetworkManager[1269565]: <info> [1620201329.0433] manager: (veth90dd212): new Veth device (/org/freedesktop/NetworkManage>
May 05 08:55:29 my-host NetworkManager[1269565]: <info> [1620201329.0777] device (veth9cfce50): released from master device docker0
- 直到 08:53 一切顺利:WiFi 正常工作并且没有 Docker 容器运行
- 在 08:53:43 我启动了一个 Docker 容器,网络管理器链接到这两个容器
docker0
以及由于我运行新的 Docker 容器而出现的其他一些临时网络接口。互联网触手可及。 - 在 08:55:29 我停止 Docker 容器,然后网络管理器从
docker0
.互联网恢复正常:我可以再次看到网页。
我在各种 Linux Ubuntu/Debian 版本和 Docker 版本上都会遇到这个问题,无论如何我当前的设置是:
乌班图:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
码头工人:
$ docker --version
Docker version 20.10.6, build 370c289
网络管理员:
$ /usr/sbin/NetworkManager --version
1.22.10
$ nmcli --version
nmcli tool, version 1.22.10
我读过这个页面几次https://docs.docker.com/network/bridge/我认为我的 Docker Bridge 正在工作,因为当我在笔记本电脑上运行这些 Docker 容器时,它们能够访问互联网。然而,Docker 网站上的文档有点枯燥,我不确定如何深入解决这些网络问题。
- docker配置有什么问题?
- 网络管理器是否有任何配置错误?
- 我需要做什么才能使 2 个网络接口同时协同工作?
编辑:
在运行 Docker 容器之前:
$ ip route get 1.1.1.1
1.1.1.1 via 192.168.1.254 dev wlp2s0 src 192.168.1.54 uid 1000
cache
运行 Docker 容器后:
$ ip route get 1.1.1.1
1.1.1.1 dev vethf6c1790 src 169.254.198.92 uid 1000
cache
$ ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
From 169.254.198.92 icmp_seq=1 Destination Host Unreachable
^C
vethf6c1790
当我运行新的 Docker 容器时,它总是显示为新的网络接口。
答案1
事实证明,NetworkManager 尝试管理 IP 地址并将其分配给网桥端口(我假设这与网桥veth*
有关)。docker0
在我调用启动 Docker 容器后,所有这些veth*
都出现在列表中。它们具有不同的动态后缀标签,但它们的前缀始终为。ifconfig
docker run
veth*
所以解决办法是要求网络管理器忽略这些桥接端口。
我/etc/NetworkManager/NetworkManager.conf
在名称上添加了通配符到此配置veth*
:
[keyfile]
unmanaged-devices=interface-name:veth*
然后我重新启动 NetworkManager 服务:sudo systemctl restart network-manager.service
完成此操作后,我能够在运行 Docker 容器并侦听这些桥接端口(如vethf6c1790
.