背景信息
我有一台运行 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 网络类型。祝你好运 :-)