我正在尝试在我的网络(Ubuntu 18.04)中设置一个docker主机服务器,但我在连接网络方面遇到困难。
理想情况下,我希望进行设置,以便我可以将流量路由到主机物理网络上的特定 IP 地址到 docker 网络。
因此,如果我的主机的 IP 地址是 192.168.0.10,那么我可以将流量从 192.168.0.11 路由到 docker 网络
192.168.0.10 --> [host]
192.168.0.11 --> [172.18.0.0/24]
从外部来看,整个 docker 网络看起来就像一个地址。只是不确定如何为该设置设置 NAT 规则。
我尝试在 netplan 配置中添加网桥,但是这会切断整个主机的网络访问:
bridges:
web_bridge:
addresses: [ 192.168.0.11/24 ]
gateway4: 192.168.0.1
nameservers:
search: [ ... ]
addresses:
- "8.8.8.8"
interfaces:
- ens160
parameters:
stp: false
forward-delay: 2
hello-time: 2
max-age: 12
那么,我该如何设置通信,以便将到 eth0 接口上特定 IP 地址的流量通过 NAT 路由到桥接网络?
我想我可以用 iptable 伪装规则来实现它,但我不确定如何使用它来分配新的 ip 地址
答案1
我自己设法解决了这个问题;
首先我创建了新的 docker 网络:
docker network create \
--driver=bridge \
--subnet=172.21.0.0/24 \
--gateway=172.21.0.1 \
web_bridge
接下来,我将 0.11 和 0.12 作为别名添加到 eth0 接口
然后将发往 0.11 的流量路由到该 docker 网络,并打开端口 80:
sudo iptables -t nat -A PREROUTING -d 192.168.0.11 -j DNAT --to-destination
sudo iptables -A PREROUTING -t nat -d 192.168.0.11 -p tcp --dport 80 -j DNAT --to 172.21.0.2:80
sudo iptables -A FORWARD -p tcp -d 172.21.0.2 --dport 80 -j ACCEPT 172.21.0.1
最后,我在 docker 容器配置中使用了暴露(而不是端口)来绑定到"192.178.0.11:80:80"
这使得每个 docker-compose 堆栈都有一个隔离的网络,并且可以看到主机的物理网络。