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