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








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值