【问题标题】:cannot access Internet inside docker container when docker0 has non-default address当 docker0 具有非默认地址时,无法访问 docker 容器内的 Internet
【发布时间】:2019-11-14 14:47:20
【问题描述】:

问题:在 docker 容器内无法访问 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 已在我的组织内使用。

我的 /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 会产生最有用的日志记录,因此:

"default-gateway": 192.168.220.1daemon.json...

$ 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 运行正常

?

谢谢!

对 Wedge Martin 问题的更长回答。我按照您的建议对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

【问题讨论】:

  • 您无法将默认网关设置为与容器内部地址相同的 IP 地址。将您的 bip 设置为 .2 或其他值,并使用可能与您的正常设置匹配的默认网关 0.1。那条路线 -n 看起来像是来自您的主机操作系统,而不是容器,对吗?
  • 那是正确的 - route - n 来自主机。我正在使用的图像不支持 route 命令,或在解决此问题时有用的 tracert。
  • 如果我将默认网关设置为 .1,并将 bip 设置为 .10(我最初的设置方式),dockerd 将启动,但无法从容器内部访问 Internet。
  • { "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,“默认网关”:“192.168.220.1”,“默认网关-v6”:“0:0:0:0:0: ffff:c0a8:dc0a", "dns": ["10.0.0.69","10.0.0.70","10.1.1.11"], "debug": true }
  • 在容器启动后,您应该能够在容器本身上安装一些网络实用程序。 IE。对于 Alpine 图像,您可以要求添加 。只是 ooc,使用正确的设置( .1 和 .10 )你可以 ping .1 地址吗?或者从它那里得到一个arp响应? arp -n 192.168.220.1

标签: docker networking


【解决方案1】:

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

{
  "bip": "192.168.220.2/24"
}

【讨论】:

  • 它仍然对我不起作用。通过此更改,docker 服务启动,但容器没有任何网络连接。
【解决方案2】:

如果不设置gw,docker会将其设置为网络中的第一个非网络地址,即0.1,但如果设置了,docker会在分配网桥时发生冲突,因为地址为0.1利用。如果 default_gateway 在网络范围之外,您应该只设置它。

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

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2020-08-10
    • 2020-06-05
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多