Как правильно настроить сетевой Docker в Ubuntu Gnome 15.10

Как правильно настроить сетевой Docker в Ubuntu Gnome 15.10

В Ubuntu Gnome 15.10 Docker работает почти из коробки, но есть тонкость. Контейнеры, похоже, не могут получить доступ к сети, пока я не перезапущу службу docker.

После загрузки хоста интерфейс docker0 не имеет IP-адреса.

$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr ea:03:cc:9c:7a:cd
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:108 (108.0 B)

Если я затем запущу контейнер, интерфейс docker0 получит только адрес ipv6, и, насколько я могу судить, сетевое соединение из контейнера невозможно. Я не могу пинговать IP-адрес хоста, IP-адреса локальной сети или IP-адреса Интернета. Я использую образ ubuntu:trusty и запускаю bash в качестве основного процесса контейнера.

$ ifconfig docker0 
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet6 addr: fe80::7801:6eff:fe86:6dd8/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:704 (704.0 B)  TX bytes:3917 (3.9 KB)

Если я перезапускаю docker, то docker0 получает адрес ipv4 (в дополнение к адресу ipv6) и все работает так, как и ожидалось.

$ sudo service docker restart 
$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::7801:6eff:fe86:6dd8/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:704 (704.0 B)  TX bytes:3917 (3.9 KB)

Конечно, я могу перезапускать службу docker каждый раз, когда я перезагружаю свою машину, или, возможно, взломать скрипт запуска, чтобы он делал это за меня (я не пробовал). Кто-нибудь знает очистыйкак это исправить?

решение1

TL;DR: Я установил Docker с помощью "apt-get install docker.io". Установка последней версии послеhttps://docs.docker.com/installation/ubuntulinux/решает проблему.

После изучения проблемы выяснилось, что версия Docker 15.10 не может правильно создать и инициализировать интерфейс docker0. При первом запуске (запуск сервиса docker) интерфейс будет создан, но не сможет его инициализировать, а при последующем запуске (перезапуск сервиса docker) он его инициализирует. Это можно воспроизвести, последовательно добавляя и удаляя интерфейс вручную с помощью brctl. Эта ошибка была исправлена ​​в последней версии Docker.

решение2

Для меня это NetworkManager портит ситуацию. Docker-сервис создает мост, как и должен, а затем выставляет его на dbus. NetworkManager включается, видит новый интерфейс на dbus и пытается настроить его (поскольку он достаточно глуп, чтобы знать, что мост docker0 уже настроен правильно). NetworkManager иногда успешно настраивает (перенастраивает) docker0, но иногда это не удается. Поэтому иногда вы перезагружаете компьютер, и docker0 назначается IP, а иногда нет.

Чтобы NetworkManager не испортил работу, добавьте

iface docker0 inet manual

предполагая /etc/network/interfaces, что NetworkManager.confимеет

[ifupdown] managed=false

который является дефолтным на 15.10

(вероятно, следует сообщить об ошибке, чтобы не дать NetworkManager испортить специфичные для Docker интерфейсы)

Связанный контент