我在一台全新的 ubuntu 桌面 18.04 机器上安装了该软件docker
,安装完成后主机立即断开了网络连接。更具体地说,我可以ping 8.8.8.8
但不能ping www.google.com
。
重现错误的步骤如下:
- 安装 ubuntu 18.04
- 安装 docker-ce使用本地 DNS 服务器。
编辑:
全新安装和我的情况之间最重要的区别是,我的机器使用本地 DNS 服务器,该服务器在公司网络中172.17.100.3
具有固定地址。172.17.100.70
从我目前所读到的内容来看,问题要么来自于NetworkManager
试图管理docker0
界面或者 某物在 docker 安装过程中破坏了systemd
解析功能。请注意systemd-resolve
默认使用 127.0.0.53
到目前为止我已尝试了以下操作:
nameserver 8.8.8.8
正在进行硬/etc/resolv.conf
编码- 卸载 docker 可修复此问题。安装/删除 docker 不会改变
resolv.conf
。 - 删除:我使用
dnsmasq
了/etc/NetworkingManager.conf
这里显示的解决方案https://github.com/moby/moby/issues/36153,这在 ubuntu 16.04 上显示了同样的问题。我全新安装的 18.04 没有此行,因此此修复不再有效。 - Docker 文档建议禁用或删除
NetworkManager
完全地如图所示https://docs.docker.com/install/linux/linux-postinstall/#dns-resolver-found-in-resolvconf-and-containers-cant-use-it但我不确定这是否与我的问题有关。我也不知道这是否会破坏其他东西。 - 这表明禁用管理为了
docker0
https://gist.github.com/lanrat/458066dbdeb460b9cef40dc2af639a24但它不能解决我的问题 - 这种方法表明了一些不同的东西https://github.com/moby/moby/issues/32836但我相信与这个问题无关
到目前为止,唯一可行的方法是将 google dns 服务器地址硬编码到 中resolv.conf
,我认为这不是一个干净的方法。我还必须在启动时自动执行此过程,这是我不喜欢的。
如何正确修复具有docker的开发机器中的NetworkingManager问题?
当前环境
我的默认设置resolv.conf
是
nameserver 127.0.0.53
并systemd-resolve --status
返回(我已与同事核实,我们有相同的输出)
Global
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
18.172.in-addr.arpa
19.172.in-addr.arpa
20.172.in-addr.arpa
21.172.in-addr.arpa
22.172.in-addr.arpa
23.172.in-addr.arpa
24.172.in-addr.arpa
25.172.in-addr.arpa
26.172.in-addr.arpa
27.172.in-addr.arpa
28.172.in-addr.arpa
29.172.in-addr.arpa
30.172.in-addr.arpa
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test
Link 4 (docker0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 3 (eno1)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 172.17.100.3
172.17.100.70
Link 2 (eno2)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
ifconfig docker0
bluesmonk@laptop:/etc/NetworkManager$ ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:86:e0:f0:94 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
以及docker service
$ sudo service docker status
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2018-07-03 10:17:35 -04; 4min 52s ago
Docs: https://docs.docker.com
Main PID: 14992 (dockerd)
Tasks: 31
CGroup: /system.slice/docker.service
├─14992 /usr/bin/dockerd -H fd://
└─15015 docker-containerd --config /var/run/docker/containerd/containerd.toml
jul 03 10:17:32 laptop dockerd[14992]: time="2018-07-03T10:17:32.981563020-04:00" level=warning msg="Your kernel does not support swap memory limit"
jul 03 10:17:32 laptop dockerd[14992]: time="2018-07-03T10:17:32.981595408-04:00" level=warning msg="Your kernel does not support cgroup rt period"
jul 03 10:17:32 laptop dockerd[14992]: time="2018-07-03T10:17:32.981603807-04:00" level=warning msg="Your kernel does not support cgroup rt runtime"
jul 03 10:17:32 laptop dockerd[14992]: time="2018-07-03T10:17:32.982040899-04:00" level=info msg="Loading containers: start."
jul 03 10:17:34 laptop dockerd[14992]: time="2018-07-03T10:17:34.403909997-04:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used
jul 03 10:17:35 laptop dockerd[14992]: time="2018-07-03T10:17:35.083366302-04:00" level=info msg="Loading containers: done."
jul 03 10:17:35 laptop dockerd[14992]: time="2018-07-03T10:17:35.458766295-04:00" level=info msg="Docker daemon" commit=9ee9f40 graphdriver(s)=overlay2 version=18.03.1-ce
jul 03 10:17:35 laptop dockerd[14992]: time="2018-07-03T10:17:35.458857295-04:00" level=info msg="Daemon has completed initialization"
jul 03 10:17:35 laptop dockerd[14992]: time="2018-07-03T10:17:35.470042819-04:00" level=info msg="API listen on /var/run/docker.sock"
jul 03 10:17:35 laptop systemd[1]: Started Docker Application Container Engine.
lines 1-20/20 (END)
与我的机器相关
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Wed Jun 20 21:43:51 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Wed Jun 20 21:42:00 2018
OS/Arch: linux/amd64
Experimental: false
码头工人信息:
docker info
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 18.03.1-ce
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 773c489c9c1b21a6d78b5c538cd395416ec50f88
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.15.0-23-generic
Operating System: Ubuntu 18.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 31.38GiB
Name: bluesmonk-ubuntu
ID: FRUH:57KI:POWV:EAHH:CY6Y:J3UH:OWBH:AIYF:BONF:DH4Q:5Y2P:RZ6T
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
关于发行版
$ cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"
NAME="Ubuntu"
VERSION="18.04 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
可能相关
- https://development.robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
- https://github.com/moby/moby/issues/23910
- https://stackoverflow.com/questions/35693117/how-can-i-give-docker-containers-access-to-a-dnsmasq-local-dns-resolver-on-the-h
谢谢!
附言:我在 docker 论坛上提出了一个问题,信息相同https://forums.docker.com/t/cant-access-internet-after-installing-docker-in-a-fresh-ubuntu-18-04-machine/53416
答案1
所以你的问题是:
Docker 已将范围分配172.17.0.1/16
给您的docker0
接口。这包括从172.17.0.1
到 的所有地址172.17.255.255
。您会注意到,此范围包括您的 DNS 服务器(172.17.100.3
和172.17.100.70
)。您遇到的是路由问题:
每当您的主机需要访问您的 DNS 服务器时,它都会发现它在同一个网络上已经有一个接口(docker0
),因此它会尝试使用该接口路由数据包......当然,这无济于事,这就是您的 DNS 停止工作的原因。
Docker 没有一个简单的机制来从其自动选择过程中排除地址范围,因此您可能需要做两件事来解决这个问题:
docker0
首先,在您的 中明确设置 的地址/etc/docker/daemon.json
。使用任何不与您的内部网络冲突的网络。例如:
{
"bip": "172.31.0.1/16"
}
您需要重新启动 Docker。
接下来,为了防止 Docker 为用户定义的网络(明确使用docker network create
或隐式使用创建的网络,例如docker-compose
或docker stack ...
)选择相同的网络范围,请创建一个新网络,然后永远不要使用它:
docker network create --subnet 172.17.0.0/16 --config-only do_not_use
这既可以解决您的问题,又可以防止其将来再次出现。
更新
Docker 实际上记录了一种更好的方法来实现这一点如何影响 Docker 在“docker network create”期间选择的网络地址范围?。
这需要在您的系统上设置持久静态路由,这在不同的 Linux 发行版中有所不同。
答案2
systemd-resolve --status
给了我一个 192.168.3.56 的 DNS 服务器,并ifconfig docker0
给了我:inet 192.168.65.2 netmask 255.255.0.0 broadcast 192.168.255.255
我所要做的就是添加 /etc/docker/daemon.json 如上所述,然后重新启动 docker
答案3
不确定是否更好接受的答案,但是无法查看更新,因为链接指向“我们无法连接到 success.docker.com 上的服务器”,无论如何,我在 openSUSE Leap 15 中结合答案解决了这个问题这里:
- 通过运行命令获取你的 IP ,例如,
ip a
查看inet
下面的行eth0
inet 42.42.42.42/24 ...
- 在文件行中添加
--bip 42.42.42.42/24
(请注意,上面的链接--
显示为单个–
,这可能会导致复制/粘贴错误的内容),使用上面的例子,更改:ExecStart=/usr/bin/dockerd ...
/usr/lib/systemd/system/docker.service
- 从
ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc$DOCKER_NETWORK_OPTIONS $DOCKER_OPTS
- 到
ExecStart=/usr/bin/dockerd --add-runtime oci=/usr/sbin/docker-runc --bip 42.42.42.42/24 $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS
- 从
- 请注意,重新启动 docker 服务对我来说是不够的,我必须重新启动。
此外,我还会docker network create --subnet 172.17.0.0/16 --config-only do_not_use
尝试接受的答案,查看更多详细信息。