前段时间,我一直在研究如何给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地址,你可劲的折腾…..   

Python

docker run -it -p 192.168.1.200:9200:9200 redis_cluster 9200
Python

root@ubuntu:~#
 iptables -t nat -L -n
ChainPREROUTING(policyACCEPT)
target  protoptsource       destination
DOCKER  all -- 0.0.0.0/0      0.0.0.0/0      ADDRTYPEmatchdst-typeLOCAL
ChainINPUT(policyACCEPT)
target  protoptsource       destination
ChainOUTPUT(policyACCEPT)
target  protoptsource       destination
DOCKER  all -- 0.0.0.0/0     !127.0.0.0/8     ADDRTYPEmatchdst-typeLOCAL
ChainPOSTROUTING(policyACCEPT)
target  protoptsource       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     tcpdpt:9200
ChainDOCKER(2references)
target  protoptsource       destination
DNAT   tcp -- 0.0.0.0/0      0.0.0.0/0      tcpdpt:9200to:172.17.0.1:9200

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

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

Python

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地址,先别看原理,暂时照着做…

Python

mkdir-p/var/run/netns
ln-s/proc/$pid/ns/net/var/run/netns/$pidiplinkaddAtypevethpeernameB
brctladdifdocker0A
iplinksetAup
iplinksetBnetns$pid
ipnetnsexec$pidiplinksetdevBnameeth0
ipnetnsexec$pidiplinkseteth0up
ipnetnsexec$pidipaddradd192.168.1.200/24deveth0
ipnetnsexec$pidiprouteadddefaultvia192.168.1.1

这些都结束了后,我们会发现容器的网卡里面从一个lo,多出一个eth0网卡,网卡的ip地址正是我们刚才绑定的192.168.1.200

Python

bash-4.1#
 ip a
1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN
  link/loopback00:00:00:00:00:00brd00:00:00:00:00:00
  inet127.0.0.1/8scopehostlo
   valid_lftforeverpreferred_lftforever
  inet6::1/128scopehost
   valid_lftforeverpreferred_lftforever
22:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscpfifo_faststateUPqlen1000
  link/etherca:aa:87:05:c9:5abrdff:ff:ff:ff:ff:ff
  inet192.168.1.200/24scopeglobaleth0
   valid_lftforeverpreferred_lftforever
  inet6fe80::c8aa:87ff:fe05:c95a/64scopelink
   valid_lftforeverpreferred_lftforever
bash-4.1#

到此为止,docker绑定固定的静态ip的方法已经说明白了….   看了文章后,会发现docker绑定ip是比较的简单..  docker的网络是不怎么好理解的,这两天我多专供下docker分配ip的整个流程 (docker iptables)

以上所述是小编给大家介绍的Docker不能绑定静态的外网固定ip的问题及解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

标签:
docker,外网,ip,docker,外网

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。