Подтвердить что ты не робот

Докер 1.10 контейнер IP в локальной сети

Начиная с Docker 1.10 (и обновления libnetwork), мы можем вручную предоставить IP-адрес контейнеру внутри пользовательской сети, и это круто!

Я хочу предоставить контейнеру IP-адрес в моей локальной сети (например, мы можем работать с виртуальными машинами в режиме "моста" ). Моя локальная сеть - 192.168.1.0/24, все мои компьютеры имеют внутри нее IP-адреса. И я хочу, чтобы мои контейнеры имели IP-адреса в этом диапазоне, чтобы доставлять их из любой точки моей локальной сети (без NAT/PAT/etc...).

Я, очевидно, читаю Jessie Frazelle сообщение в блоге и много других сообщений здесь и везде, например:

и многое другое, но ничего не вышло; мои контейнеры по-прежнему имеют IP-адреса "внутри" моего хоста докеров и недоступны для других компьютеров в моей локальной сети.

Чтение сообщения Джесси Фразель, я подумал (с тех пор, как она использует публичный IP-адрес), мы можем делать то, что я хочу делать?

Изменить: действительно, если я сделаю что-то вроде:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet
docker run --rm -it --net homenet --ip 192.168.1.100 nginx

Новый интерфейс на хосте docker (br- [a-z0-9] +) принимает IP-адрес "-gateway", который является моим IP-адресом маршрутизатора. И тот же IP на двух компьютерах в сети... BOOM

Спасибо заранее.

4b9b3361

Ответ 1

EDIT: Это решение теперь бесполезно. Начиная с версии 1.12, Docker предоставляет два сетевых драйвера: macvlan и ipvlan. Они позволяют назначать статический IP-адрес из локальной сети. См. Ниже .


После поиска людей, которые имеют одинаковую проблему, мы перешли к обходному пути:

Сумма:

  • (V) LAN - 192.168.1.0/24
  • Шлюз по умолчанию (= маршрутизатор) - 192.168.1.1
  • Несколько хостов докеров
  • Примечание. У нас есть два сетевых адаптера: eth0 и eth1 (который посвящен Docker).

Что нам нужно:

Мы хотим иметь контейнеры с ip в сети 192.168.1.0/24 (например, компьютеры) без каких-либо NAT/PAT/translation/port-forwarding/etc...

Проблема

При этом:

network create --subnet 192.168.1.0/24 --gateway 192.168.1.1 homenet

мы можем предоставить контейнеры для IP-адреса, который мы хотим, , но. Мост, созданный docker (br-[a-z0-9]+), будет иметь IP 192.168.1.1, который является нашим маршрутизатором.

Решение

1. Настройка сети Docker

Используйте параметр DefaultGatewayIPv4:

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" homenet

По умолчанию Docker предоставит интерфейсу моста (br-[a-z0-9]+) первый IP-адрес, который может быть уже занят другой машиной. Решение заключается в использовании параметра --gateway, чтобы сообщить докеру назначить произвольный IP-адрес (который доступен):

docker network create --subnet 192.168.1.0/24 --aux-address "DefaultGatewayIPv4=192.168.1.1" --gateway=192.168.1.200 homenet

Мы можем указать имя моста, добавив -o com.docker.network.bridge.name=br-home-net к предыдущей команде.

2. Мостовой мост!

Теперь у нас есть мост (br-[a-z0-9]+), созданный Docker. Нам нужно подключить его к физическому интерфейсу (в моем случае у меня есть NIC, поэтому я использую eth1 для этого):

brctl addif br-home-net eth1

3. Удалить мост IP

Теперь мы можем удалить IP-адрес с моста, поскольку нам не нужен он:

ip a del 192.168.1.200/24 dev br-home-net

IP 192.168.1.200 может использоваться как мост на множестве узлов докеров, поскольку мы его не используем, и мы удаляем его.

Ответ 2

Использовать официальный драйвер Docker:

Начиная с Docker v1.12.0-rc2, новый драйвер MACVLAN теперь доступен в официальной версии Docker:

  • Драйвер MacVlan вышел из экспериментального # 23524

Эти новые драйверы были хорошо документированы авторами (-ами) с примерами использования.

В конце дня он должен обеспечивать аналогичную функциональность, быть проще в настройке и с меньшим количеством ошибок/других причуд.

Просмотр контейнеров на хосте Docker:

Только оговорка с новым официальным драйвером macvlan заключается в том, что хост-компьютер докера не может видеть/связываться с его собственными контейнерами. Что может быть желательно или нет, в зависимости от вашей конкретной ситуации.

Эта проблема может быть решена, если у вас более 1 сетевой адаптер на хост-машине докера. И оба сетевых адаптера подключены к вашей локальной сети. Затем можно либо A) выделить 1 из ваших докеров-хостов 2 nics для эксклюзивного докера. И используйте оставшийся nic для хоста для доступа к локальной сети.

Или B), добавив определенные маршруты только к тем контейнерам, которые вам нужно получить через 2-й сетевой адаптер. Например:

sudo route add -host $container_ip gw $lan_router_ip $if_device_nic2

Метод A) полезен, если вы хотите получить доступ ко всем вашим контейнерам с хоста докеров и у вас есть несколько проводных ссылок.

Wheras method B) полезен, если вам нужен только доступ к нескольким конкретным контейнерам с хоста docker. Или, если ваша вторая сетевая карта является Wi-Fi-картой и будет намного медленнее для обработки всего вашего сетевого трафика. Например, на портативном компьютере.

Установка:

Если не удается просмотреть предварительный выпуск -rc2 кандидата на ubuntu 16.04, временно добавьте или измените эту строку на ваш /etc/apt/sources.list, чтобы сказать:

deb https://apt.dockerproject.org/repo ubuntu-xenial testing

вместо main (который является стабильным выпуском).

Ответ 3

Теперь Docker поддерживает сетевые драйверы Macvlan и IPvlan. Документацию Docker для обоих сетевых драйверов можно найти здесь.

С обоими драйверами вы можете реализовать желаемый сценарий (настройте контейнер, чтобы он вел себя как виртуальная машина в режиме моста):

  • Macvlan: позволяет одному физическому сетевому интерфейсу (мастер-устройству) иметь произвольное количество подчиненных устройств, каждое из которых имеет собственные MAC-адреса.

    Требуется ядро ​​Linux v3.9-3.19 или 4.0 +.

  • IPvlan. Позволяет создать произвольное количество подчиненных устройств для вашего основного устройства, все из которых имеют один и тот же MAC-адрес.

    Требуется Linux kernel v4.2 + (поддержка предыдущих ядер существует, но является ошибкой).

    Подробнее см. kernel.org IPVLAN Driver HOWTO.

Контейнерное соединение достигается путем помещения одного из подчиненных устройств в пространство имен сети для сконфигурированного контейнера. Ведущие устройства остаются в операционной системе хоста (пространство имен по умолчанию).

Как правило, вы должны использовать драйвер IPvlan, если хост Linux, подключенный к внешнему коммутатору/маршрутизатору, имеет настроенную политику, которая позволяет использовать только один MAC на порт. Это часто случается в средах VMWare ESXi!

Еще одна важная вещь для запоминания (Macvlan и IPvlan): Трафик на ведущее устройство и с него не может быть отправлен на подчиненные устройства и с него. Если вам нужно включить связь между ведущими и ведомыми, см. Раздел "Связь с хостом (по умолчанию-ns)" в документе "IPVLAN - начало", опубликованном одним из авторов IPvlan (Mahesh Bandewar).

Ответ 5

Возможно отображение физического интерфейса в контейнер через pipework.

Подключить контейнер к локальному физическому интерфейсу

pipework eth2 $(docker run -d hipache /usr/sbin/hipache) 50.19.169.157/24
pipework eth3 $(docker run -d hipache /usr/sbin/hipache) 107.22.140.5/24

Теперь может быть родной путь, но я не рассматривал это для выпуска 1.10.