当docker 0具有非默认地址时,无法访问docker容器内的Internet
问题:docker容器内无法访问Internet 在我的裸机Ubuntu17.10盒子上当docker 0具有非默认地址时,无法访问docker容器内的Internet,docker,networking,Docker,Networking,问题:docker容器内无法访问Internet 在我的裸机Ubuntu17.10盒子上 $ ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=10.8 ms 但是 $ docker run --rm debian:latest ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8): 56 data bytes 92 b
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=10.8 ms
但是
$ docker run --rm debian:latest ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
92 bytes from 7911d89db6a4 (192.168.220.2): Destination Host Unreachable
我认为根本原因是我必须为docker0设置一个非默认网络,因为默认网络172.17.0.1
已经在我的组织中使用
为了让docker成功启动,我的/etc/docker/daemon.json文件需要如下所示
$ cat /etc/docker/daemon.json
{
"bip": "192.168.220.1/24",
"fixed-cidr": "192.168.220.0/24",
"fixed-cidr-v6": "0:0:0:0:0:ffff:c0a8:dc00/120",
"mtu": 1500,
"default-gateway": "192.168.220.10",
"default-gateway-v6": "0:0:0:0:0:ffff:c0a8:dc0a",
"dns": ["10.0.0.69","10.0.0.70","10.1.1.11"],
"debug": true
}
请注意,默认网关设置看起来是错误的。但是,如果我将其改为192.168.220.1
,docker服务将无法启动。在命令行中运行dockerd
可以直接生成最有用的日志记录,因此:
使用daemon.json中的“默认网关”:192.168.220.1
$ sudo dockerd
-----8<-----
many lines removed
----->8-----
Error starting daemon: Error initializing network controller: Error creating default "bridge" network: failed to allocate secondary ip address (DefaultGatewayIPv4:192.168.220.1): Address already in use
这是根本原因吗?我如何实现以下看似相互排斥的状态:
- docker0接口地址为x.x.x.1
- 网关地址相同,x.x.x.1
- dockerd运行正常
?
谢谢
韦奇·马丁问题的更长的答案。我按照您的建议更改了daemon.json
:
{
"bip": "192.168.220.2/24",
"fixed-cidr": "192.168.220.0/24",
"fixed-cidr-v6": "0:0:0:0:0:ffff:c0a8:dc00/120",
"mtu": 1500,
"default-gateway": "192.168.220.1",
"default-gateway-v6": "0:0:0:0:0:ffff:c0a8:dc0a",
"dns": ["10.0.0.69","10.0.0.70","10.1.1.11"],
"debug": true
}
所以至少守护进程启动了,但我仍然无法在容器中访问internet
$ docker run -it --rm debian:latest bash
root@bd9082bf70a0:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:dc:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.220.3/24 brd 192.168.220.255 scope global eth0
valid_lft forever preferred_lft forever
root@bd9082bf70a0:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
92 bytes from bd9082bf70a0 (192.168.220.3): Destination Host Unreachable
$docker run-it--rm debian:latest bash
root@bd9082bf70a0:/#ip地址
1:lo:mtu 65536 qdisc noqueue状态未知组默认qlen 1000
链接/环回00:00:00:00:00 brd 00:00:00:00:00:00:00
inet 127.0.0.1/8范围主机lo
永远有效\u lft首选\u lft永远有效
15: eth0@if16:mtu 1500 qdisc noqueue state UP组默认值
链路/以太02:42:c0:a8:dc:03 brd ff:ff:ff:ff:ff:ff:ff链路网络ID 0
inet 192.168.220.3/24 brd 192.168.220.255作用域全局eth0
永远有效\u lft首选\u lft永远有效
root@bd9082bf70a0:/#平8.8.8.8
PING 8.8.8.8(8.8.8.8):56个数据字节
来自bd9082bf70a0(192.168.220.3)的92个字节:无法访问目标主机
事实证明,越少越好。将daemon.json简化为以下内容解决了我的问题
{
"bip": "192.168.220.2/24"
}
如果不设置gw,docker会将其设置为网络中的第一个非网络地址,或.1,但如果设置,docker会在将网桥分配为地址时发生冲突。1正在使用。只有在其超出网络范围时,才应设置默认\u网关
现在bip可以告诉docker使用不同于.1的地址,因此设置bip可以避免冲突,但我不确定它最终是否会执行您想要的操作。可能会导致路由问题,因为非网络路由将转到没有主机响应的地址。您将无法将默认网关设置为与容器内部地址相同的IP地址。将bip设置为.2或其他值,并使用默认网关.1,该网关可能与您的正常设置相匹配。route-n看起来像是来自主机操作系统,而不是容器,对吗?没错,route-n来自主机。我正在使用的映像不支持route命令或tracert,这对解决此问题很有用。如果我将默认网关设置为.1,将bip设置为.10(这是我最初使用的方式),dockerd将启动,但无法从容器内访问Internet。{“bip”:“192.168.220.2/24”,“修复cidr”:“192.168.220.0/24”,“fixed-cidr-v6”:“0:0:0:0:0:ffff:c0a8:dc00/120”、“mtu:1500”、“默认网关”:“192.168.220.1”、“默认网关-v6”:“0:0:0:0:ffff:c0a8:dc0a”、“dns”:[“10.0.0.69”、“10.0.70”、“10.1.1.11”]、“调试”:true}在容器启动后,您应该能够在容器本身上安装一些网络实用程序。例如,对于Alpine映像,您可以使用正确的设置(.1和.10)执行ask add.Just ooc你能ping这个.1地址吗?或者从它那里得到一个arp响应吗?arp-n 192.168.220.1对我来说仍然不起作用。有了这个改变,docker服务出现了,但是容器没有任何网络连接。
$ docker run -it --rm debian:latest bash
root@bd9082bf70a0:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:dc:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.220.3/24 brd 192.168.220.255 scope global eth0
valid_lft forever preferred_lft forever
root@bd9082bf70a0:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
92 bytes from bd9082bf70a0 (192.168.220.3): Destination Host Unreachable
{
"bip": "192.168.220.2/24"
}