Docker容器只能通过–net = host访问互联网

只是今天使用他们的安装指南安装docker1.10.1。 但是,除非在--net=host docker run命令中使用了--net=host ,否则我的容器都不能访问互联网。 我已经尝试过这些post的各种解决方法:

  1. http://odino.org/cannot-connect-to-the-internet-from-your-docker-containers/
  2. 我的docker集装箱没有互联网
  3. 我不能让Docker容器访问互联网?
  4. docker集装箱不能访问互联网

没有任何工作到目前为止,除了添加运行命令 – --net=host ,但我不能build立从Dockerfile的图像,因为我不能使用--net=host命令 – --net=host

我运行docker network inspect bridge的设置,并注意到它使用(几乎)相同的子网和网关作为我的工作VPN。 这可能是一个问题吗? 这也可以解释为什么当我连接到我的工作VPN一些网站不加载。

这是docker network inspect bridge的结果:

 [ { "Name": "bridge", "Id": "6d603ebd1c437d0d1f02be8406cf362f7f36d33168e42b9883891bae99834fa9", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Containers": {}, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" } } ] 

这是ifconfig:

 docker0 Link encap:Ethernet HWaddr 02:42:9a:29:4a:c2 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:9aff:fe29:4ac2/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:36 errors:0 dropped:0 overruns:0 frame:0 TX packets:55 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2080 (2.0 KB) TX bytes:8498 (8.4 KB) enx00e09f0004bd Link encap:Ethernet HWaddr 00:e0:9f:00:04:bd UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:70948 errors:0 dropped:1 overruns:0 frame:0 TX packets:14839 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:14270948 (14.2 MB) TX bytes:3460691 (3.4 MB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:3407 errors:0 dropped:0 overruns:0 frame:0 TX packets:3407 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:326405 (326.4 KB) TX bytes:326405 (326.4 KB) tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:172.17.62.55 PtP:172.17.62.55 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1406 Metric:1 RX packets:18 errors:0 dropped:0 overruns:0 frame:0 TX packets:21 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:1773 (1.7 KB) TX bytes:1466 (1.4 KB) wlp6s0 Link encap:Ethernet HWaddr cc:3d:82:1a:1e:1d inet addr:10.250.9.73 Bcast:10.250.9.255 Mask:255.255.254.0 inet6 addr: fe80::ce3d:82ff:fe1a:1e1d/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4381 errors:0 dropped:0 overruns:0 frame:0 TX packets:4398 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2246805 (2.2 MB) TX bytes:835572 (835.5 KB) 

我不能从Dockerfile生成镜像,因为我不能在build命令中使用–net = host

这是docker守护进程在构build时能够访问互联网的工作。

你可以通过传递构build时间参数来帮助它

 docker build --build-arg HTTP_PROXY=http://... 

也就是说,如果你在代理之后。
如果你没有, 检查你的DNS设置 (这个问题是在boot2docker的情况下,这可能不关心你,但它仍然可以提供一些线索,以检查什么)。
这是DNS问题的另一个例子 。

OP惠勒 在评论中确认了与dns相关的问题:

我不得不在NetworkManager禁用dnsmasq ,不太确定为什么会影响docker,但是当禁用dnsmasq时,DNSparsing开始在容器中工作。

这是一个在这里看到的解决方法:

  • 通过在/etc/NetworkManager/NetworkManager.conf中将“ dns=dnsmasq ”行/etc/NetworkManager/NetworkManager.conf并重新启动networkingpipe理器和docker.io服务( sudo service network-manager restart && sudo service docker.io restart )来禁用dnsmasq。
  • 或者在/etc/default/docker.io启用注释掉的DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"行(并重启docker.io服务)。

后面的解决方法当然需要8.8.8.8 / 8.8.4.4服务器可以从您的networking到达。


OP增加:

这个解决scheme在一定程度上起作用,直到我使用我的VPN在家工作,并且docker桥的子网与我的VPN子网相冲突。

他build议“ 使用Systemd设置Docker桥的IP ”

/etc/systemd/system/docker.service.d/docker.conf应该包含这个:

 [Service] ExecStart= ExecStart=/usr/bin/docker daemon -H fd:// --bip=192.168.169.1/24 

和:

 systemctl stop docker # We need a program called brctl to, well, control the bridge, which is part of the bridge-utils package. sudo apt-get install bridge-utils #Bring down the docker0 interface: sudo ip link set docker0 down # And delete the bridge. sudo brctl delbr docker0 # Finally, start the Docker daemon systemctl start docker 

我在Ubuntu 16.04上遇到了这个问题, 通过编辑NetworkManager.conf来解决这个问题

 sudo nano /etc/NetworkManager/NetworkManager.conf 

注释掉dns = dnsmasq然后重新启动NetworkManager

 sudo service network-manager restart 

DONE!