1

Кросспостинг здесь, так как этот вопрос был помечен как не по теме на SO.

Я видел несколько вопросов о подключении контейнеров Docker к физической сети с помощью macvlan, но мне еще не удалось найти ответ для моего текущего сценария.

Что я пытаюсь сделать:

  • Запустите контейнеры Docker внутри виртуальной машины VirtualBox под управлением Ubuntu.
  • Используя macvlan, подключите контейнеры к одной и той же сети докеров и назначьте каждому IP-адрес в подсети моей физической сети.
  • Получите доступ к каждому контейнеру через этот назначенный IP-адрес от хоста или любого другого устройства, подключенного к сети.

До сих пор я сделал следующее:

  • Создал мою ВМ с помощью Vagrant.
  • Добавлен мой интерфейс Wi-Fi в качестве мостового адаптера к виртуальной машине.
  • Установите соответствующий шлюз по умолчанию для виртуальной машины, как описано здесь, для IP-адреса моего маршрутизатора (192.168.1.1).
  • Создайте сеть Docker с помощью следующей команды: docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ip-range=192.168.1.160/27 -o parent=eth1 test_net
  • Запустите мои контейнеры, подключив их к сети, описанной выше.

Я могу убедиться, что оба контейнера работают и им назначены 192.168.1.160 и 192.168.1.161. Очевидно, что из-за того, как работает macvlan, эти адреса недоступны внутри виртуальной машины.

Но когда я пытаюсь пропинговать любой из этих адресов с моего хоста, запрос истекает. Однако после того, как я попытался пропинговать эти адреса, когда я запускаю arp -a на хосте, я вижу записи для обоих контейнеров:

? (192.168.1.160) at 2:42:c0:a8:1:a0 on en0 ifscope [ethernet] ? (192.168.1.161) at 2:42:c0:a8:1:a1 on en0 ifscope [ethernet]

Я проверил, чтобы убедиться, что брандмауэр моего маршрутизатора отключен, указанные выше IP-адреса не конфликтуют с другими устройствами в моей сети, что я могу пропинговать свою ВМ с моего хоста и что шлюз по умолчанию для моей виртуальной машины правильно установлен на 192.168 .1.1 на интерфейсе eth1. Кроме того, я проверил, что подсеть в команде docker network create соответствует настроенной подсети моего маршрутизатора.

Я видел решения, использующие флаг -p Docker, но это не вариант для меня, так как мне нужно иметь возможность ссылаться на каждый контейнер только по его IP-адресу.

У кого-нибудь был успех в достижении того, что я пытаюсь сделать? Кроме того, почему в обоих контейнерах есть записи ARP, но они недоступны, и что я могу сделать, чтобы исправить это? Или есть какое-то отношение к тому, как VirtualBox обрабатывает мостовые адаптеры?

Я подумал, что мне нужно отредактировать iptables на виртуальной машине, чтобы установить политику FORWARD по умолчанию для ACCEPT , но это тоже не сработало. Поскольку кажется, что ARP работает, я предполагаю, что пакеты просто сбрасываются виртуальной машиной, прежде чем они смогут вернуться на хост, но я не уверен, что изменить, чтобы это исправить.

1 ответ1

1

Если кто-то еще сталкивается с этой проблемой, это, кажется, связано с тем, включен ли неразборчивый режим для интерфейса, к которому подключена сеть докеров.

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

После настройки случайного режима из VirtualBox («Настройки» -> «Сеть» -> «Мостовой адаптер» -> «Дополнительно» -> «Случайный режим» -> «Разрешить все») мне также пришлось включить его в виртуальной машине:

sudo ip link set eth1 promisc on

Теперь я могу пропинговать контейнеры моей виртуальной машины по IP с моего хоста! Я смог успешно проверить это как на Ubuntu 14.04, так и на 16.04, и все это без проблем с iptables !

Опять же, как я уже упоминал выше, вы не сможете пропинговать контейнеры изнутри виртуальной машины из-за природы macvlan.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .