В Ubuntu Gnome 15.10 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, и, насколько я могу судить, из контейнера невозможно подключиться к сети. Я не могу выполнить ping IP-адрес хоста, IP-адреса LAN или IP-адреса.
$ 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), и все будет работать так же, как и при работе с bash. Ожидаемый.
$ 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)
Конечно, я могу перезапустить службу докеров каждый раз, когда я перезапускаю свою машину, или, возможно, взломать сценарий запуска, чтобы сделать это для меня (я не пробовал). Кто-нибудь знает о чистом способе исправить это?
Для меня это 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 от испортить интерфейсы докеров)