1. 程式人生 > >Docker ,Keepalived , 虛擬IP ,NAT,如何把Docker容器裡的虛擬 IP和 埠對映到區域網

Docker ,Keepalived , 虛擬IP ,NAT,如何把Docker容器裡的虛擬 IP和 埠對映到區域網

機器1                         機器2

192.168.1.100           IP1 :192.168.1.103

                                  IP2:172.17.0.1 (Docker bridege)    < --------------  >  Docker Container (Keepalvied and Nginx installed)

                                                                                           IP:172.17.0.2   (VIP :  172.17.0.100 )

場景:

機器1和機器 2是兩臺獨立 的機器

機器 2裡面安裝了Docker,Docker容器裡安裝 了Nginx和Keepalived,VIP 如上圖指向容器IP(非host模式啟動容器)。

需求:

在機器1通過url  http://172.17.0.100 訪問容器的80埠

解決辦法:

經過各種坑爹的搜尋和試驗後(血淚史就 別提了),得出如下方法。

首先,在機器1 ping 172.17.0.2或者172.17.0.100都是不通的,因為他們不在同一個 子網裡

但是,在機器1 ping 172.17.0.1或者192.168.1.103是通的,所以能想到的 方法是“告訴”機器1先把關於172.17.0.×的請求傳送給172.17.0.1或者192.168.1.103

1)方法一:在192.168.1.×的路由器新增靜態路由 172.17.0.0 (target)   ,255.255.0.0 (mask)  , 172.17.0.1或者192.168.1.103(gateway) 

2)  方法二:在機器1,把閘道器設成172.17.0.1或者192.168.1.103

3)方法三: 在機器1,按方法一的引數設定一個路由

linux sample:  route add -net 172.17.0.1/16 gw 192.168.1.103  或者 ip route add 172.17.0.1/16 via 192.168.1.103

sudo route add -net 172.17.0.0/24 gw 192.168.1.103

windows的自己百度啦

一番折騰後尼瑪終於ping通了,但是網址http://172.17.0.100還是用不了,然後又是一番坑爹搜尋。

網上的各種iptables的教程都沒有解決我的問題,最後我自己想出來了,在iptables的*filter里加了這麼一句就好了。

*filter
-A DOCKER -d 172.17.0.100/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

sudo iptables -t filter -A DOCKER -d 172.17.0.100/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

Docker裡安裝keepalvied注意事項:

  • 容器內要使用Keepalived,宿主機中同樣要安裝Keepalived
  • 啟動容器的時候,要用--privileged
  • e.g. sudo docker run -it --privileged ubuntu:14.04 /bin/bash