Docker容器只能通过–net = host访问互联网
只是今天使用他们的安装指南安装docker1.10.1。 但是,除非在--net=host
docker run
命令中使用了--net=host
,否则我的容器都不能访问互联网。 我已经尝试过这些post的各种解决方法:
- http://odino.org/cannot-connect-to-the-internet-from-your-docker-containers/
- 我的docker集装箱没有互联网
- 我不能让Docker容器访问互联网?
- 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!