Контейнер Docker может получить доступ к Интернету только с --net=host

Только что установил докер 1.10.1 сегодня, используя их руководство по установке. Однако ни один из моих контейнеров не может получить доступ к Интернету, если я не использовал --net=host в команде docker run. Я пробовал различные обходные пути из этих сообщений:

  1. http://odino.org/cannot-connect-to-the-internet-from-your-docker-containers/
  2. У моего док-контейнера нет Интернета
  3. Я не могу получить доступ к Интернету у контейнеров Docker?
  4. Контейнер Docker не может получить доступ к Интернету

До сих пор ничего не работало, кроме добавления --net=host в команду запуска, но я не могу создавать образы из Dockerfile, потому что не могу использовать --net=host с командой build.

Я запустил 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"
        }
    }
]

Это ифконфиг:

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)

person wheeler    schedule 20.02.2016    source источник


Ответы (4)


Я не могу создавать образы из Dockerfile, потому что не могу использовать --net=host с командой сборки

Это работа демона докеров, чтобы иметь доступ к Интернету при сборке.

Вы можете помочь ему, передав аргументы времени сборки, такие как

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

То есть, если вы находитесь за прокси-сервером.
Если это не так, проверьте настройки DNS. (это проблема в контексте boot2docker, которая может вас здесь не касаться, но все же может дать некоторые подсказки относительно того, что проверять).
Вот еще один пример проблемы с DNS.

OP Wheeler подтверждает проблему, связанную с DNS в комментариях:

Мне пришлось отключить dnsmasq в NetworkManager, не совсем понимаю, почему это повлияло на докер, но разрешение DNS начало работать внутри контейнеров, когда я отключил dnsmasq.

Это обходной путь, увиденный ранее здесь:

  • Отключите dnsmasq, закомментировав строку «dns=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 были доступны из вашей сети.


ОП добавляет:

Это решение работало до некоторой степени, пока я не использовал свою VPN для работы из дома, и подсеть док-моста столкнулась с моей подсетью VPN.

Он рекомендует «установить IP-адрес Docker. мост с 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
person VonC    schedule 20.02.2016
comment
Я не использую прокси-сервер, и я попытался установить правильные настройки DNS, отредактировав DOCKER_OPTS как для серверов Google, так и для серверов OpenDNS, и все же я не могу выполнить ping из контейнера. - person wheeler; 22.02.2016
comment
Разобрался: мне пришлось отключить dnsmasq в NetworkManager, не совсем понимаю, почему это повлияло на докер, но разрешение DNS начало работать внутри контейнеров, когда я отключил dnsmasq. - person wheeler; 24.02.2016
comment
@wheeler Отлично! Я включил ваш обходной путь (и добавил вторую ссылку) в ответ для большей наглядности. - person VonC; 24.02.2016
comment
Это решение работало до некоторой степени, пока я не использовал свою VPN для работы из дома, и подсеть док-моста столкнулась с моей подсетью VPN. Это руководство помогло решить следующие проблемы: container-solutions .com/ - person wheeler; 26.02.2016
comment
@wheeler Интересно. Я включил ваш комментарий и соответствующий отрывок из вашей ссылки в ответ для большей наглядности. - person VonC; 26.02.2016
comment
Я отредактировал ответ, изменив 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 больше не является допустимым флагом для двоичного файла докера. - person wheeler; 26.02.2016

У меня была эта проблема в Ubuntu 16.04 Вот исправление для этого редактирование NetworkManager.conf

sudo nano /etc/NetworkManager/NetworkManager.conf

закомментируйте dns=dnsmasq, затем перезапустите NetworkManager

sudo service network-manager restart

ГОТОВО!

person IskandarG    schedule 19.10.2017

В RHEL, CentOS или Fedora отредактируйте файл <interface>.network в /usr/lib/systemd/network/ на вашем хосте Docker (например, /usr/lib/systemd/network/80-container-host0.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

person Alexey Readonly    schedule 11.11.2020

Для меня проблема заключалась в установке QEMU, которая возилась с мостом к хосту, что может быть связано с эта проблема.

Чтобы решить эту проблему, я удалил 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.

person Pierre    schedule 21.07.2021