Недоступная сеть внутри контейнера докеров без --net = параметр хоста
Проблема: в контейнере докера нет подключения к Интернету.
Симптомы: ping 8.8.8.8
не работает. Wireshark из хост-системы возвращает:
19 10.866212113 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=0/0, ttl=64
20 11.867231972 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=1/256, ttl=64
21 12.868331353 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=2/512, ttl=64
22 13.869400083 172.17.0.2 -> 8.8.8.8 ICMP 98 Echo (ping) request id=0x0009, seq=3/768, ttl=64
Но ! Если контейнер был запущен с --net=host
Интернет работал бы отлично.
То, что я пробовал до сих пор:
- изменение DNS
- добавление
--ip-masq=true
в /etc/default/docker
(при перезапуске выключено) - все, что связано с masquerade/ip_forward
- изменение маршрута по умолчанию
- все предлагаемое здесь
Конфигурация хоста:
$ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.4.2.1 0.0.0.0 UG 0 0 0 eno1.3001
default 10.3.2.1 0.0.0.0 UG 100 0 0 eno2
10.3.2.0 * 255.255.254.0 U 100 0 0 eno2
10.4.2.0 * 255.255.254.0 U 0 0 0 eno1.3001
nerv8.i 10.3.2.1 255.255.255.255 UGH 100 0 0 eno2
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
sudo iptables -L
, cat/etc/network/interfaces
, ifconfig
, iptables -t nat -L -nv
Все в порядке, переадресация также включена:
$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
Ответы
Ответ 1
Это неполный ответ, который вы ищете. Но я хотел бы дать некоторое объяснение, почему интернет работает
Если контейнер был запущен с --net = хост-Интернет работал бы отлично.
Докер по умолчанию поддерживает три сети. В этом режиме (HOST) контейнер будет совместно использовать сетевой стек хостов, и все интерфейсы от хоста будут доступны для контейнера. Имя хоста контейнера будет соответствовать имени хоста в главной системе
# docker run -it --net=host ubuntu:14.04 /bin/bash
[email protected]:/# hostname
labadmin-VirtualBox
Even the IP configuration is same as the host system IP configuration
[email protected]:/# ip addr | grep -A 2 eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:b5:82:2f brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
[email protected]:/# exit
exit
ИСХОДНАЯ СИСТЕМА IP КОНФИГУРАЦИЯ
# ip addr | grep -A 2 eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:b5:82:2f brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
valid_lft forever preferred_lft forever
3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
Обратитесь к этому за дополнительной информацией о подключении докеров.
Ответ 2
Убедитесь, что net.ipv4.conf.all.forwarding
(не net.ipv4.ip_forward
) установлен в 1
, если нет, включите его:
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 0
$ sysctl net.ipv4.conf.all.forwarding=1
$ sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1
Ответ 3
Можете ли вы запустить "sudo ifconfig" и посмотреть, сталкивается ли диапазон IP-адресов вашего интернет-соединения (обычно wlan0) с диапазоном для интерфейса docker0 172.17.0.0?
У меня была эта проблема с моей офисной сетью (пока она работала нормально дома), что она работала на 172.17.0.X, а Docker пытался выбрать именно этот диапазон.
Это может помочь: http://jpetazzo.github.io/2013/10/16/configure-docker-bridge-network/
Я закончил создание собственной мостовой сети для Docker.