Как я могу отключить автоматическое присвоение IP-адреса Докера?

Я хотел бы настроить контейнеры Докера к стилю как реальная система путем присвоения им статических IP-адресов в моей сети.

В настоящее время у меня есть установка сетевого моста (br0) на хосте. Я имею DOCKER_OPTS="-b=br0" настроенный в /etc/default/docker файл. Я могу присвоить статические адреса каждому из контейнеров через их /etc/network/interface файлы.

Проблемой является Докер, продолжит присваивать IP-адреса самостоятельно. (Как я останавливаю это?) Еще больше беспокойства состоит в том, что это будет теперь использовать схему IP запараллеленной сети. Который вызовет сетевые проблемы, как это может/, присваивают адреса, которые уже используются в сети.

Проблемы:
Сетевое зависание/приостановка
Отвечающий адрес, в то время как ping'ing контейнер, может измениться.

Error messages such as this are seen in the logs of the host:
kernel: [31912.876161] br0: port 3(vethb228701) entered disabled state
kernel: [31913.441517] device veth122d9f8 left promiscuous mode
kernel: [22491.609856] audit: type=1400 audit(1434148604.621:124): apparmor="DENIED" operation="getattr" info="Failed name lookup - disconnected path" error=-13 profile="/usr/sbin/ntpd" name="var/lib/docker/aufs/diff/eb00895db3d297979df741cd560ccbea2ab4d572264bd703fc6cbc7ea2acb5c4/usr/lib" pid=30955 comm="ntpd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0

Докер также присваивает контейнеру адрес на той же подсети как моя сеть. Сначала я, хотя это просто добавляло строку к /etc/hosts файл контейнера. Который это делает, но даже после удаления его выходит, все еще замечены.

Пример:

root@myhostname:/# cat /etc/hosts  
X.X.192.3   myhostname.mydomain.com myhostname
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@myhostname:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:09:1a:c0:03  
          inet addr:X.X.X.X  Bcast:X.X.X.X  Mask:255.255.252.0
          inet6 addr: fe80::42:9ff:fe1a:c003/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:231 errors:0 dropped:26 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:23719 (23.7 KB)  TX bytes:3960 (3.9 KB)

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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Если никакое имя хоста не будет присвоено через командную строку (-h) для запуска контейнера, то она будет использовать случайным образом присвоенное имя хоста

Среда:

Host:  
OS: Ubuntu 14.04.2 
Arch: PPC64LE
Kernel: 3.16.0-30
docker version
:
Client version: 1.4.1-dev
Client API version: 1.17
Go version (client): gccgo (GCC) 5.0.0 20150118 (experimental)
Git commit (client): 7294f26
OS/Arch (client): linux/ppc64le
Server version: 1.4.1-dev
Server API version: 1.17
Go version (server): gccgo (GCC) 5.0.0 20150118 (experimental)
Git commit (server): 7294f26

Оборудование:

IBM Power 8, 8247-22L
CPUs: 192
Memory: 512GB

Контейнеры:

OS: Ubuntu 14.04.2 
Arch: PPC64LE
Kernel: 3.16.0-30

Сеть:

brctl show 
bridge name bridge id       STP enabled interfaces
br0     8000.6cae8b6aaf64   no      eth0

br0       Link encap:Ethernet  HWaddr 6c:ae:8b:6a:af:64  
          inet addr:X.X.X.X  Bcast: X.X.X.X Mask:255.255.252.0
          inet6 addr: fe80::6eae:8bff:fe6a:af64/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6750867 errors:0 dropped:80 overruns:0 frame:0
          TX packets:1586308 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1049658934 (1.0 GB)  TX bytes:6936734104 (6.9 GB)

eth0      Link encap:Ethernet  HWaddr 6c:ae:8b:6a:af:64  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7155242 errors:0 dropped:7598 overruns:0 frame:0
          TX packets:6347549 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1212526214 (1.2 GB)  TX bytes:7339350703 (7.3 GB)
          Interrupt:249 

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:238 errors:0 dropped:0 overruns:0 frame:0
          TX packets:238 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:22564 (22.5 KB)  TX bytes:22564 (22.5 KB)
4
задан 16 June 2015 в 07:07
3 ответа

Я тоже некоторое время назад пытался решить эту проблему. Я не смог найти способ изменить поведение докера в отношении назначения IP-адресов без отключения всей сетевой функциональности ( - net = none ). Итак, я назначил пока неиспользуемую подсеть интерфейсу моста докера и позволил докеру сделать это назначение. Я также написал демон, который прослушивает определенные события API-интерфейса докеров, а затем отправляет динамические обновления на наш DNS-сервер, поэтому мне не нужно заботиться об IP-адресах и я могу обращаться к контейнерам по имени.

Вот репозиторий github для Демон DNS. https://github.com/cschritt/docker-dns-daemon Я скоро внесу свои последние изменения и немного рефакторинга.

2
ответ дан 3 December 2019 в 03:41

К сожалению, похоже, что нет способа запретить Docker назначать IP-адреса контейнерам в режиме моста. В качестве обходного пути я добавляю pre-up ip addr flush dev eth0 в / etc / network / interface , чтобы отклонить IP-адрес Docker, как , описанный здесь . Вот пример того, как это можно сделать:

auto eth0
iface eth0 inet static
  pre-up ip addr flush dev eth0
  address 192.168.0.249
  netmask 255.255.255.0
  gateway 192.168.0.1

Недостаток этого подхода - использование нескольких контейнеров, когда Docker вводит свои собственные неправильные / переопределенные IP-адреса в файлы контейнеров / etc / hosts . Я нашел единственный способ исправить это - установить пакет inotify-tools и запустить следующий скрипт, чтобы вернуть / etc / hosts в предопределенное состояние, как только Docker изменяет его:

#!/bin/sh

while /usr/bin/inotifywait -e close /etc/hosts; do
  cp -v /etc/hosts.orig /etc/hosts
done

Приведенный выше сценарий требует, чтобы вы добавили в контейнер действительный файл /etc/hosts.orig .

1
ответ дан 3 December 2019 в 03:41

Начиная с Docker 1.10 , выпуск которого запланирован на ближайшие несколько дней, вы можете явно указать статический IP-адрес при запуске контейнера с помощью - ip = Параметры и - ip6 = , чтобы указать адреса IPv4 и IPv6 соответственно. Их можно использовать с docker run и docker network connect , и они сохраняются, пока существует контейнер.

0
ответ дан 3 December 2019 в 03:41

Теги

Похожие вопросы