Docker container 不同主机之间的网络连接
Docker container Network connection between different host
我在两台主机(虚拟机)上安装了 docker。我想让不同主机上的容器能够相互连接。
这是 VM1 和 VM2 的 ifconfig 输出:
VM1
bridge0 : inet addr:172.17.52.1 Bcast:172.17.52.255 Mask:255.255.255.0
docker0 : inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
eth0 : inet addr:192.168.122.129 Bcast:192.168.122.255 Mask:255.255.255.0
VM2
bridge0 : inet addr:172.17.53.1 Bcast:172.17.53.255 Mask:255.255.255.0
docker0 : inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
eth0 : inet addr:192.168.122.77 Bcast:192.168.122.255 Mask:255.255.255.0
bridge
用于容器。我做了一些网络配置:
iptables -t nat -A POSTROUTING -s 172.17.52.0/24 ! -d 172.17.0.0/16 -j MASQUERADE (on VM1)
iptables -t nat -A POSTROUTING -s 172.17.53.0/24 ! -d 172.17.0.0/16 -j MASQUERADE (on VM2)
route add -net 172.17.52.0 netmask 255.255.255.0 gw 192.168.122.129 (on VM2)
route add -net 172.17.53.0 netmask 255.255.255.0 gw 192.168.122.77 (on VM1)
当一个容器 ping 另一个容器时我没有得到输出
(172.17.52.X ping 172.17.53.X)
VM1 可以ping VM2 成功。 VM1上的容器也可以ping通VM2,但是VM1上的容器ping VM2上的容器我没有任何输出。
实现此目的的一种非常简单的方法是使用 Weave.
您可以安装它:
sudo wget -O /usr/local/bin/weave \
https://github.com/zettio/weave/releases/download/latest_release/weave
sudo chmod a+x /usr/local/bin/weave
VM1
sudo weave launch
C=$(sudo weave run 10.2.1.1/24 -t -i busybox)
VM2
sudo weave launch 192.168.122.129
C=$(sudo weave run 10.2.1.2/24 -t -i busybox)
docker exec $C ping -c 3 10.2.1.1/24
您刚刚创建了一个带有容器的虚拟网络。美妙之处在于这些 VM 可以在任何地方,只要其中至少一个具有 public IP 并打开端口 6783。
您甚至可以通过 运行 weave launch -password "<MySecret>"
或(在 weave launch
之前导出 WEAVE_PASSWORD="<MySecret>"
)启用 NaCL crypto。
我在两台主机(虚拟机)上安装了 docker。我想让不同主机上的容器能够相互连接。
这是 VM1 和 VM2 的 ifconfig 输出:
VM1
bridge0 : inet addr:172.17.52.1 Bcast:172.17.52.255 Mask:255.255.255.0
docker0 : inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
eth0 : inet addr:192.168.122.129 Bcast:192.168.122.255 Mask:255.255.255.0
VM2
bridge0 : inet addr:172.17.53.1 Bcast:172.17.53.255 Mask:255.255.255.0
docker0 : inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
eth0 : inet addr:192.168.122.77 Bcast:192.168.122.255 Mask:255.255.255.0
bridge
用于容器。我做了一些网络配置:
iptables -t nat -A POSTROUTING -s 172.17.52.0/24 ! -d 172.17.0.0/16 -j MASQUERADE (on VM1)
iptables -t nat -A POSTROUTING -s 172.17.53.0/24 ! -d 172.17.0.0/16 -j MASQUERADE (on VM2)
route add -net 172.17.52.0 netmask 255.255.255.0 gw 192.168.122.129 (on VM2)
route add -net 172.17.53.0 netmask 255.255.255.0 gw 192.168.122.77 (on VM1)
当一个容器 ping 另一个容器时我没有得到输出
(172.17.52.X ping 172.17.53.X)
VM1 可以ping VM2 成功。 VM1上的容器也可以ping通VM2,但是VM1上的容器ping VM2上的容器我没有任何输出。
实现此目的的一种非常简单的方法是使用 Weave.
您可以安装它:
sudo wget -O /usr/local/bin/weave \
https://github.com/zettio/weave/releases/download/latest_release/weave
sudo chmod a+x /usr/local/bin/weave
VM1
sudo weave launch
C=$(sudo weave run 10.2.1.1/24 -t -i busybox)
VM2
sudo weave launch 192.168.122.129
C=$(sudo weave run 10.2.1.2/24 -t -i busybox)
docker exec $C ping -c 3 10.2.1.1/24
您刚刚创建了一个带有容器的虚拟网络。美妙之处在于这些 VM 可以在任何地方,只要其中至少一个具有 public IP 并打开端口 6783。
您甚至可以通过 运行 weave launch -password "<MySecret>"
或(在 weave launch
之前导出 WEAVE_PASSWORD="<MySecret>"
)启用 NaCL crypto。