Исходная информация
У меня есть сервер с одним физическим сетевым интерфейсом, на котором работает 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 ...
Подробнее о доступных форматах читайте в док