具有多个 VLAN 的 Docker 主机

具有多个 VLAN 的 Docker 主机

背景信息

我有一台运行 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 访问。

问题

我希望对端口和可访问性有更多控制(并非每个 docker 都应该在每个子网中都可访问)。如果我使用参数 -p(例如 -p 3777:3777),docker 将不再可访问。

本指南https://hicu.be/docker-networking-macvlan-vlan-configuration 解决类似问题,但我不想将我的 vlan 扩展到 docker 并在每个 docker 实例上分配一个 IP。这太多了。

期望的解决方案

我的服务器在每个子网/VLAN 中都有一个 IP,192.168.1.199(本机 VLAN / mgmt)192.168.2.199(VLAN2)192.168.4.199(VLAN4)

我想使用 -p 参数启动 docker,并选择可访问的接口。例如 docker run --p 9000:9000 --name portainer ... 并且它只能通过 192.168.1.199:9000 访问

也许我的 ip 路由/ip 规则设置配置不当,或者我需要为每个子网设置一个 docker 桥接器……但这就是我无法进一步解决的问题。到目前为止,如果我选择 --p 参数并且 docker 连接到默认 docker 桥接器……docker 根本无法访问。

你有什么主意吗?

问候,马克

编辑:无法通过 192.168.4.199:9001 访问容器 portainer_test

   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

答案1

对于-p参数,您可以使用ip:hostPort:containerPort格式,例如

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

有关可用格式的更多信息,请参阅文档

答案2

可能已经太晚了,但是我发布了在我这边使用 VLAN 中继进入运行 docker 的 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 网络类型。祝你好运 :-)

相关内容