机器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