Недоступная сеть внутри контейнера докеров без --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.