设为首页 收藏本站
查看: 941|回复: 0

[经验分享] 解决docker不能绑定静态的外网固定ip的问题

[复制链接]

尚未签到

发表于 2018-5-30 07:23:09 | 显示全部楼层 |阅读模式
  前段时间,我一直在研究如何给docker分配静态ip,主要的用途是让thrift进来和出来都走一个ip,还有就是爬虫可以独立ip地址,这样就很好的实现了爬虫的多ip方式…  但是随着nginx tcp的加入和开发了一个基于python socket的ip轮询访问模块解决了这两个问题…  当然也不能因为这两问题,就丢弃这问题了….
  在docker run的时候,咱们可以添加-p参数来控制他的source来源ip。   下面的命令,对外来说,开放了192.168.1.200:9200的端口…  但是我们不仅仅满与此。 docker run -p 端口的实现,就是借用iptables来实现的…   我们iptables -t nat -L 的时候,就能看到docker帮我做好的nat关系…. docker做iptables的prerouting的时候,是追加了名叫docker的自定义链条…      差点又跑题了,如果是桥接模式,那么就致使当我们如果容器里面端口的变动比较大的时候,那么就会造成改动端口映射的操作的复杂性,需要每次的变更,做一个iptables prerouting映射…    但是如果你选择HOST网络模式,那么你又不好确定你的app绑定的是哪个ip地址,不是什么服务端都支持bind ip地址的… 有些搓蛋的服务端就默认绑定第一个ip地址…    这个时候,为docker容器分配一个独立的静态ip地址就显得很有必要了….  反正就一个ip地址,你可劲的折腾…..   
  

  docker run -it -p 192.168.1.200:9200:9200 redis_cluster 9200
  root@ubuntu:~# iptables -t nat -L -n
  Chain PREROUTING (policy ACCEPT)
  target     prot opt source               destination
  DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination
  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination
  DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL
  Chain POSTROUTING (policy ACCEPT)
  target     prot opt source               destination
  MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
  MASQUERADE  all  --  172.17.0.0/16       !172.17.0.0/16
  MASQUERADE  tcp  --  172.17.0.1           172.17.0.1           tcp dpt:9200
  Chain DOCKER (2 references)
  target     prot opt source               destination
  DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9200 to:172.17.0.1:9200
  

  需要注意的是,docker run创建一个容器的时候,一定要把他的网卡模式改成docker的none…  一般在docker自定义网络的时候,都会把–net=none,再通过后期的一顿折腾让docker的容器有网络…..
  

  接着,我如果想给容器,彻底的分配一个外网ip,或者管理ip,反正就一个静态的独立ip,怎么破? 用pipework是可以实现的。 但这东西稍复杂些,我们就先用系统的ip netns来解决…. 通过inspect我们知道了他的state pid .
  

  root@ubuntu:~# docker ps -a
  CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
  232621e9e9fb        redis_cluster       "/app/manage.sh 9000   41 minutes ago      Up 41 minutes                           agitated_blackwell
  root@ubuntu:~# docker inspect -f "{{.State.Pid}}" 232621e9e9fb
  4777
  root@ubuntu:~# pid=4777
  那么我们来开始绑定静态ip地址,先别看原理,暂时照着做…
  

  mkdir -p /var/run/netns
  ln -s /proc/$pid/ns/net /var/run/netns/$pid ip link add A type veth peer name B
  brctl addif docker0 A
  ip link set A up
  ip link set B netns $pid
  ip netns exec $pid ip link set dev B name eth0
  ip netns exec $pid ip link set eth0 up
  ip netns exec $pid ip addr add 192.168.1.200/24 dev eth0
  ip netns exec $pid ip route add default via 192.168.1.1
  

  bash-4.1# ip a
  1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
         valid_lft forever preferred_lft forever
      inet6 ::1/128 scope host
         valid_lft forever preferred_lft forever
  22: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
      link/ether ca:aa:87:05:c9:5a brd ff:ff:ff:ff:ff:ff
      inet 192.168.1.200/24 scope global eth0
         valid_lft forever preferred_lft forever
      inet6 fe80::c8aa:87ff:fe05:c95a/64 scope link
         valid_lft forever preferred_lft forever
  bash-4.1#
  到此为止,docker绑定固定的静态ip的方法已经说明白了….   看了文章后,会发现docker绑定ip是比较的简单..  docker的网络是不怎么好理解的,这两天我多专供下docker分配ip的整个流程 (docker iptables)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-482782-1-1.html 上篇帖子: Docker 初级教程 下篇帖子: 使用iptables管理docker容器做端口映射网络
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表