Docker容器只能使用--net = host访问Internet

时间:2016-02-20 05:39:45

标签: docker dns dnsmasq

今天刚刚使用安装指南安装了docker 1.10.1。但是,除非我在--net=host命令中使用docker run,否则我的容器都不能访问Internet。我已尝试过这些帖子的各种解决方法:

  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
  5. 除了将--net=host添加到run命令之外,目前还没有任何工作,但我无法从Dockerfile构建图像,因为我无法使用--net=host命令build

    我运行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 个答案:

答案 0 :(得分:4)

  

我无法从Dockerfile构建图像,因为我无法使用--net = host和build命令

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

您可以通过传递构建时参数(如

)来帮助它
docker build --build-arg HTTP_PROXY=http://...

也就是说,如果你在代理人后面 如果不是,check your DNS settings(该问题在boot2docker的上下文中,这可能与您无关,但它仍然可以提供一些关于检查内容的线索)。
这是another example of DNS issue

OP wheeler确认与dns相关的问题in the comments

  

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

这是一种解决方法seen before here

  
      
  • 通过评论" dns=dnsmasq"来停用dnsmasq。 /etc/NetworkManager/NetworkManager.conf中的行,然后重新启动network-manager和docker.io服务(sudo service network-manager restart && sudo service docker.io restart)。
  •   
  • 或者在DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"中启用已注释的/etc/default/docker.io行(并重启docker.io服务)。
  •   

后一种解决方法当然需要从您的网络访问8.8.8.8 / 8.8.4.4服务器。

OP补充道:

  

此解决方案在某种程度上起作用,直到我使用我的VPN在家工作,并且docker网桥的子网与我的VPN子网冲突。

他建议" Set the ip of the Docker bridge with Systemd"

  

/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

答案 1 :(得分:1)

我在Ubuntu 16.04上遇到过这个问题 Here is the fix for this by editing the NetworkManager.conf

// the rows in the image array don't have any padding
// so set GL_UNPACK_ALIGNMENT to 1 (instead of the default of 4)
// https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glTexImage2D
    (
    GL_TEXTURE_2D, 0,
    GL_RGB, 1000, 1000, 0,
    GL_RGB, GL_UNSIGNED_BYTE, &image[0]
    );

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

sudo nano /etc/NetworkManager/NetworkManager.conf

DONE!

答案 2 :(得分:0)

在RHEL,CentOS或Fedora上,编辑Docker主机上的<interface>.network中的/usr/lib/systemd/network/文件(例如:/usr/lib/systemd/network/80-container-host0.network),然后在[Network]部分中添加以下块。

[Network]
...
IPForward=true

在我的情况下,我将IPForward=ipv4添加到/etc/systemd/network/XX-eth0.network并解决了问题

注意

sysctl -w net.ipv4.ip_forward=1

对我来说没有解决这个问题,只有更改主机上的网络接口才可以实现

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

答案 3 :(得分: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