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

Docker容器只能使用--net=host访问internet,docker,dns,dnsmasq,Docker,Dns,Dnsmasq,今天刚刚使用他们的安装指南安装了docker 1.10.1。但是,除非在docker run命令中使用--net=host,否则我的容器都无法访问internet。我在这些帖子中尝试了各种变通方法: 到目前为止,除了将--net=host添加到run命令外,没有任何效果,但我无法从Dockerfile生成图像,因为我无法将--net=host与build命令一起使用 我运行了docker network inspect bridge来检查docker网桥的设置,并注意到它使用(几乎)与我

今天刚刚使用他们的安装指南安装了docker 1.10.1。但是,除非在
docker run
命令中使用
--net=host
,否则我的容器都无法访问internet。我在这些帖子中尝试了各种变通方法:

  • 到目前为止,除了将
    --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)
    
    我无法从Dockerfile生成映像,因为我无法在build命令中使用--net=host

    这是docker守护进程的工作,以便在构建时能够访问internet

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

    docker build --build-arg HTTP_PROXY=http://...
    
    也就是说,如果您支持代理。
    如果您不是,(该问题与boot2docker有关,这里您可能不关心,但它仍然可以提供一些关于检查内容的线索)。
    这是

    确认与dns相关的问题:

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

    这是一个解决方法:

    • 通过注释掉
      /etc/NetworkManager/NetworkManager.conf
      中的“
      dns=dnsmasq
      ”行禁用dnsmasq,并重新启动网络管理器和docker.io服务(
      sudo service network manager restart&&sudo service docker.io restart
    • 或者,在
      /etc/default/DOCKER.io
      中启用注释掉的
      DOCKER\u OPTS=“--dns 8.8.8--dns 8.8.4.4”
      行(并重新启动DOCKER.io服务)
    当然,后一种解决方案需要从您的网络访问8.8.8.8/8.8.4.4服务器


    OP补充道:


    这个解决方案在某种程度上起了作用,直到我在家里使用VPN,docker桥的子网与我的VPN子网发生冲突

    他建议“

    /etc/systemd/system/docker.service.d/docker.conf
    应包含以下内容:

    以及:


    我在Ubuntu 16.04上遇到了这个问题

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

    sudo service network-manager restart
    

    完成了

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

    [Network]
    ...
    IPForward=true
    
    在我的例子中,我在/etc/systemd/network/XX-eth0.network中添加了
    IPForward=ipv4
    ,解决了这个问题

    注意

    sysctl -w net.ipv4.ip_forward=1
    
    并没有为我解决这个问题,只有更改主机上的网络接口才有结果


    我不支持代理,我已经尝试通过编辑google和OpenDNS服务器的
    DOCKER\u OPTS
    来设置正确的DNS设置,但仍然无法从容器中ping。我发现:我必须在NetworkManager中禁用dnsmasq,不太清楚它为什么会影响DOCKER,但当我禁用dnsmasq时,DNS解析开始在容器内工作。@wheeler太棒了!我已经在答案中包含了您的解决方法(并添加了第二个和一些链接),以提高可见性。在我使用VPN在家工作之前,此解决方案在一定程度上起到了作用,docker桥的子网与我的VPN子网发生了冲突。本指南帮助解决了以下问题:@wheeler很有趣。我已经将你的评论和你链接的相关摘录包含在答案中,以提高可视性。
    sudo service network-manager restart
    
    [Network]
    ...
    IPForward=true
    
    sysctl -w net.ipv4.ip_forward=1