Кросспостинг здесь, так как этот вопрос был помечен как не по теме на 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 работает, я предполагаю, что пакеты просто сбрасываются виртуальной машиной, прежде чем они смогут вернуться на хост, но я не уверен, что изменить, чтобы это исправить.