Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当docker 0具有非默认地址时,无法访问docker容器内的Internet_Docker_Networking - Fatal编程技术网

当docker 0具有非默认地址时,无法访问docker容器内的Internet

当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

问题: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 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"
}