Docker0具有非默认地址时,无法访问Docker容器中的Internet



问题:码头容器中无法访问Internet。

在我的裸金属Ubuntu上17.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 bytes from 7911d89db6a4 (192.168.220.2): Destination Host Unreachable

我认为根本原因是我必须为Docker0设置一个非默认网络,因为默认一个172.17.0.1已经在我的组织中使用。

my/etc/docker/daemon.json文件需要看起来像这样,以使Docker成功开始。

$ 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中的"default-gateway": 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 ...

的信息
$ ip addr show docker0
10: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:10:bc:66:fd brd ff:ff:ff:ff:ff:ff
    inet 192.168.220.1/24 brd 192.168.220.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:10ff:febc:66fd/64 scope link 
       valid_lft forever preferred_lft forever

和路由表...

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.62.131.1     0.0.0.0         UG    100    0        0 enp14s0
10.62.131.0     0.0.0.0         255.255.255.0   U     100    0        0 enp14s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp14s0
192.168.220.0   0.0.0.0         255.255.255.0   U     0      0        0 docker0

这是根本原因吗?我如何实现:

的看似相互排斥的状态
  • 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
}

所以至少守护程序开始了,但是我仍然在容器中没有互联网访问...

$ 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

事实证明,更少的是更多。将daemon.json简化为以下问题解决了我的问题。

{
  "bip": "192.168.220.2/24"
}

如果您不设置GW,Docker将将其设置为网络中的第一个非网络地址或.1,但是如果将其设置为.1桥梁作为地址.1正在使用。您只应在网络范围内的外部设置Default_gateway。

现在,BIP可以告诉Docker使用与.1不同的地址,因此设置BIP可以避免冲突,但我不确定它最终会做您想要的事情。可能会导致路由问题,因为非网络路线将转到没有主机响应的地址。

最新更新