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

13
今天我按照Docker的安装指南成功地安装了版本为1.10.1的Docker。但是,如果我没有在docker run命令中使用--net=host,则我的所有容器都无法访问互联网。我已尝试了以下这些帖子中的各种解决方法:
  1. http://odino.org/cannot-connect-to-the-internet-from-your-docker-containers/
  2. My docker container has no internet
  3. I can't get Docker containers to access the internet?
  4. Docker container cannot access internet
目前为止,除了在运行命令时添加--net=host之外,没有任何方法起作用。但是,由于无法在build命令中使用--net=host,因此我无法从Dockerfile构建镜像。
我运行了docker network inspect bridge来查看Docker网络桥的设置,并注意到它使用与我的工作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  P-t-P: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)
4个回答

5

我无法通过Dockerfile构建镜像,因为我不能在构建命令中使用--net=host参数。

这是Docker守护程序的工作,在构建时能够访问互联网。

您可以通过传递构建时参数来帮助它,例如

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

也就是说,如果你使用代理,在此情况下需要检查 DNS设置(该问题与boot2docker有关,可能与您无关,但仍可提供一些有关如何检查的线索)。

这里是另一个DNS问题的例子

OP wheeler在评论中确认了与DNS相关的问题 in the comments:

我不得不在NetworkManager中禁用dnsmasq,不太确定为什么它会影响docker,但当我禁用dnsmasq时,容器内的DNS解析开始工作。

这是一种已经在此处看到过的解决方法

禁用dnsmasq,方法是在/etc/NetworkManager/NetworkManager.conf中注释掉"dns=dnsmasq"行,并重新启动network-manager和docker.io服务 (sudo service network-manager restart && sudo service docker.io restart)。或者启用/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服务器可以从您的网络访问。

楼主补充道:

这个解决方案在我使用VPN远程办公时起到了一定的作用,但是docker bridge的子网与我的VPN子网发生了冲突。

他建议使用 "通过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

我没有使用代理,而且我已经尝试通过编辑DOCKER_OPTS将正确的DNS设置为谷歌和OpenDNS的服务器,但是我仍然无法在容器内进行ping测试。 - wheeler
搞定了:我必须在NetworkManager中禁用dnsmasq,不太确定为什么它会影响docker,但是当我禁用dnsmasq时,容器内的DNS解析开始工作。 - wheeler
@wheeler 太棒了!我已经在答案中包含了你的解决方法(并添加了第二个以及一些链接),以便更加明显。 - VonC
这个解决方案在我使用VPN在家工作时有一定的效果,但是docker桥接的子网与我的VPN子网发生了冲突。这篇指南帮助解决了这个问题:http://container-solutions.com/set-the-ip-of-the-docker-bridge-with-systemd/ - wheeler
@wheeler 有趣。为了更好的可见性,我已经将您的评论和相关链接摘录包含在答案中。 - VonC
我编辑了答案,将 docker ExecStart=/usr/bin/docker -d -H fd:// --bip=192.168.169.1/24 更改为 ExecStart=/usr/bin/docker daemon -H fd:// --bip=192.168.169.1/24,因为 -d 不再是 docker 二进制文件的有效标志。 - wheeler

1

1
在RHEL、CentOS或Fedora上,编辑位于Docker主机上(例如:/usr/lib/systemd/network/80-container-host0.network)的<interface>.network文件,在[Network]部分内添加以下块。请保留HTML标签。
[Network]
...
IPForward=true

在我的情况下,我在 /etc/systemd/network/XX-eth0.network 中添加了 IPForward=ipv4,问题得到了解决。
请注意:
sysctl -w net.ipv4.ip_forward=1

这个问题对我没有解决,只有更改主机上的网络接口才会产生结果。

https://docs.docker.com/engine/install/linux-postinstall/#ip-forwarding-problems


0

对我来说,问题出在 QEMU 安装上,它可能会影响到与主机的桥接,这可能与 this issue 有关。

为了解决这个问题,我卸载了 QEMU 和 libvirt:

sudo apt-get purge qemu qemu-block-extra qemu-slof qemu-system qemu-system-arm qemu-system-common qemu-system-mips qemu-system-misc qemu-system-ppc qemu-system-sparc qemu-system-x86 qemu-user qemu-user-binfmt qemu-utils libvirt-bin libvirt-daemon libvirt0:amd64


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接