Назад | Перейти на главную страницу

Хост Docker с несколькими VLAN

Исходная информация

У меня есть сервер с одним физическим сетевым интерфейсом, на котором работает Docker. Этот интерфейс настроен как магистраль 802.1Q. Чтобы избежать асимметричной маршрутизации, я настроил таблицы маршрутизации для каждой подсети. Вот мои интерфейсы / etc / network / interfaces:

auto enp3s0
iface enp3s0 inet dhcp
    post-up ip route add 192.168.1.0/24 dev enp3s0 table 1
    post-up ip route add default via 192.168.1.1 table 1
    post-up ip rule add from 192.168.1.0/24 table 1 priority 101
    post-up ip route flush cache
    pre-down ip rule del from 192.168.1.0/24 table 1 priority 101
    pre-down ip route flush table 1
    pre-down ip route flush cache

auto enp3s0.2
iface enp3s0.2 inet dhcp
        hwaddress ether 00:11:22:33:44:55
        post-up ip route add 192.168.2.0/24 dev enp3s0.2 table 2
        post-up ip route add default via 192.168.2.1 table 2
        post-up ip rule add from 192.168.2.0/24 table 2 priority 102
        post-up ip route flush cache
        pre-down ip rule del from 192.168.2.0/24 table 2 priority 102
        pre-down ip route flush table 2
        pre-down ip route flush cache

auto enp3s0.4
iface enp3s0.4 inet dhcp
        hwaddress ether 00:11:22:33:44:56
        post-up ip route add 192.168.4.0/24 dev enp3s0.4 table 4
        post-up ip route add default via 192.168.4.1 table 4
        post-up ip rule add from 192.168.4.0/24 table 4 priority 104
        post-up ip route flush cache
        pre-down ip rule del from 192.168.4.0/24 table 4 priority 104
        pre-down ip route flush table 4
        pre-down ip route flush cache
...

Эта настройка работает нормально, если я запускаю контейнер с параметром --net = host. Контейнеры доступны из каждой подсети / vlan.

Эта проблема

Я хотел бы больше контролировать порты и доступность (не все докеры должны быть доступны в каждой подсети). Если я использую параметр -p (например, -p 3777: 3777), докеры больше не будут доступны.

Это руководство https://hicu.be/docker-networking-macvlan-vlan-configuration решить аналогичную проблему, но я не хочу расширять свои vlan до докера и назначать IP для каждого экземпляра докера. Это слишком.

Желаемое решение

У моего сервера есть IP-адрес в каждой подсети / vlan, 192.168.1.199 (собственный vlan / mgmt) 192.168.2.199 (vlan2) 192.168.4.199 (vlan4)

Я хотел бы запустить докеры с параметром -p и выбрать, в каком интерфейсе он доступен. например docker run --p 9000: 9000 --name portainer ... и он должен быть доступен только через 192.168.1.199:9000

Возможно, мои настройки IP-маршрута / правила IP не настроены должным образом или / и мне нужен мост докеров для каждой подсети ... но это тот момент, когда я не могу продвинуться дальше. До сих пор, если я выбираю параметр --p и докер подключается к мосту докеров по умолчанию ... докер вообще недоступен.

Есть ли у вас какие-либо идеи?

Приветствую, Марк

Изменить: контейнер portainer_test недоступен через 192.168.4.199:9001

   mark@server:~/docker$ docker ps -a
        CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                  PORTS                          NAMES
        359ebfd027b2        portainer/portainer         "/portainer -H unix:…"   21 minutes ago      Up About a minute       192.168.4.199:9001->9000/tcp   portainer_test
        9d523a8b22e4        eclipse-mosquitto           "/docker-entrypoint.…"   10 days ago         Up 16 hours                                            mosquito
        a2eeb9582838        portainer/portainer         "/portainer"             10 days ago         Up 16 hours                                            portainer
        f4ef7570cea2        symcon/symcon:stable        "/usr/bin/symcon"        10 days ago         Up 16 hours                                            symcon
        ae43e8be871f        jacobalberty/unifi:stable   "/usr/local/bin/dock…"   10 days ago         Up 16 hours (healthy)                                  unifi
        mark@server:~/docker$ sudo netstat -tulpn | grep LISTEN
        tcp        0      0 127.0.0.1:27117         0.0.0.0:*               LISTEN      23374/bin/mongod
        tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      30474/systemd-resol
        tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1592/sshd
        tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      22212/mosquitto
        tcp        0      0 0.0.0.0:3777            0.0.0.0:*               LISTEN      22247/symcon
        tcp        0      0 192.168.4.199:9001      0.0.0.0:*               LISTEN      18622/docker-proxy
        tcp6       0      0 :::8843                 :::*                    LISTEN      22511/java
        tcp6       0      0 :::8880                 :::*                    LISTEN      22511/java
        tcp6       0      0 :::8080                 :::*                    LISTEN      22511/java
        tcp6       0      0 :::8443                 :::*                    LISTEN      22511/java
        tcp6       0      0 :::1883                 :::*                    LISTEN      22212/mosquitto
        tcp6       0      0 :::6789                 :::*                    LISTEN      22511/java
        tcp6       0      0 :::9000                 :::*                    LISTEN      22273/portainer

Может быть, уже слишком поздно, но я публикую, что сработало на моей стороне с магистралью VLAN, входящей в мой докер NAS под управлением ....

Вам необходимо создать собственную сеть BRIDGE => https://docs.docker.com/network/network-tutorial-standalone/#use-user-defined-bridge-networks Созданный мост по умолчанию связывается со всеми IP-адресами хоста (0.0.0.0), что является вашей проблемой.

Убедитесь, что вы использовали эту опцию во время его создания: com.docker.network.bridge.host_binding_ipv4 с желаемым IP-адресом сервера (в вашем случае 192.168.1.199, так что созданный мост привязывается только к этому IP)

Затем просто укажите (в вашем примере), что контейнер Portainer использует эту определенную пользователем мостовую сеть (--network при создании / запуске контейнера).

В противном случае вы также можете изучить тип сети macvlan. Удачи :-)

для -p параметр, вы можете использовать ip:hostPort:containerPort формат, например

docker run -p 192.168.1.199:9000:9000 ...

Подробнее о доступных форматах читайте в док