Сеть докеров через определенный физический интерфейс

Итак, я пытаюсь создать сеть (docker network create), чтобы ее трафик проходил через определенный физический сетевой интерфейс (NIC); У меня их два: <iface1> (внутренний) и <iface2> (внешний).

Мне нужно, чтобы трафик обоих сетевых адаптеров был физически разделен.


МЕТОД 1:

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

docker network create -d macvlan \
    --subnet 192.168.0.0/16 \
    --ip-range 192.168.2.0/24 \
    -o parent=wlp8s0.1 \
    -o macvlan_mode=bridge \
    macvlan0

Затем, чтобы контейнер был виден с хоста, мне нужно сделать это на хосте:

sudo ip link add macvlan0 link wlp8s0.1 type macvlan mode bridge
sudo ip addr add 192.168.2.10/16 dev macvlan0
sudo ifconfig macvlan0 up

Теперь контейнер и хост видят друг друга :) НО контейнер не может получить доступ к локальной сети. Идея состоит в том, что контейнер имеет доступ в Интернет.


МЕТОД 2.:

Поскольку я буду использовать <iface2> вручную, все в порядке, если по умолчанию трафик идет через <iface1>. Но независимо от того, в каком порядке я подключаю сетевые адаптеры (я также пробовал временно удалить LKM для <iface2>); весь трафик всегда перехватывается внешним сетевым адаптером <iface2>. И я обнаружил, что это происходит потому, что таблица маршрутов обновляется автоматически в какое-то «случайное» время. Чтобы заставить трафик проходить через <iface1>, я должен (на хосте):

sudo route del -net <net> gw 0.0.0.0 netmask 255.0.0.0 dev <iface2>
sudo route del default <iface2>

Теперь я могу проверить (несколькими способами), что трафик проходит только через <iface1>. Но в тот момент, когда таблица маршрутов обновляется (автоматически), весь трафик перемещается на <iface2>. Проклятие! Я уверен, что есть способ сделать таблицу маршрутов «статической» или «постоянной».


РЕДАКТИРОВАТЬ (18 июля 2018 г.): Основная идея состоит в том, чтобы иметь доступ к Интернету через контейнер докеров, используя единственный двух доступных физических сетевых интерфейсов.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
0
5 310
1

Ответы 1

Моя среда:

На хосте, созданном для моста vm virbr0 с IP-адресом 192.168.122.1 и выше, экземпляр vm с интерфейсом ens3 и IP-адресом 192.168.122.152.

192.168.122.1 - шлюз для сети 192.168.122.0/24.

В vm:

Создать сеть:

 # docker network create --subnet 192.168.122.0/24 --gateway 192.168.122.1 --driver macvlan -o parent=ens3 vmnet

Создайте контейнер докера:

# docker run -ti --network vmnet alpine ash

Проверять:

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
12: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:c0:a8:7a:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.2/24 brd 192.168.122.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # ping 192.168.122.152
PING 192.168.122.152 (192.168.122.152): 56 data bytes
^C
--- 192.168.122.152 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
/ # ping 192.168.122.1
PING 192.168.122.1 (192.168.122.1): 56 data bytes
64 bytes from 192.168.122.1: seq=0 ttl=64 time=0.471 ms
^C
--- 192.168.122.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.471/0.471/0.471 ms

Хорошо, я использую другую виртуальную машину с IP-адресом 192.168.122.73 и проверяю из докера:

/ # ping 192.168.122.73 -c2
PING 192.168.122.73 (192.168.122.73): 56 data bytes
64 bytes from 192.168.122.73: seq=0 ttl=64 time=1.630 ms
64 bytes from 192.168.122.73: seq=1 ttl=64 time=0.984 ms

--- 192.168.122.73 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.984/1.307/1.630 ms

Из экземпляра докера я не могу пинговать интерфейс на виртуальной машине, но могу получить доступ к локальной сети.

/ # ip n|grep 192.168.122.152
192.168.122.152 dev eth0  used 0/0/0 probes 6 FAILED

На vm добавляю macvlan0 nic:

# ip link add macvlan0 link ens3 type macvlan mode bridge
# ip addr add 192.168.122.100/24 dev macvlan0
# ip l set macvlan0 up

Из докера я могу пинговать 192.168.122.100:

/ # ping 192.168.122.100 -c2
PING 192.168.122.100 (192.168.122.100): 56 data bytes
64 bytes from 192.168.122.100: seq=0 ttl=64 time=0.087 ms
64 bytes from 192.168.122.100: seq=1 ttl=64 time=0.132 ms

--- 192.168.122.100 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.109/0.132 ms

Другие вопросы по теме