这篇文章主要介绍“docker容器如何分配静态IP”,在日常操作中,相信很多人在docker容器如何分配静态IP问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”docker容器如何分配静态IP”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联专业为企业提供芜湖县网站建设、芜湖县做网站、芜湖县网站设计、芜湖县网站制作等企业网站建设、网页设计与制作、芜湖县企业网站模板建站服务,10多年芜湖县做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
默认情况下启动容器的时候,docker容器使用的是bridge策略比如:
docker run -ti ubuntu:latest /bin/bash
等效于
docker run -ti --net=bridge ubuntu:latest /bin/bash
bridge策略下,docker容器自动为我们分配了一个ip地址,并连接到docker0的网桥上。但这里有一个问题,这个ip地址并不是静态分配的,这对我们的对容器的实例的网络管理造成一了些困难。这里笔者并不想直接给出解决方案,因为那样子并没有什么卵用,理解原理,一步一步踏实走才是。
相信看过docker介绍的读者都知道docker是借助于cgroup和namespace技术来实现资源控制和隔离的。在开始之前读者需要去看一下linux上namespace的使用,本文并不想带入太多的其它不相关的主题。好了现在假设你已经了解namespace了,那你肯定想知道docker在网络上是怎么利用namespace来做手脚的。大致过程应该和下面的一致:(下面只是个人猜测,因为笔者并没有太多时间去研究它的源码)
1、创建一个net namespace netns1。
2、创建一对veth,将peer加入到netns1,将别一端接入到网桥bridge0中。
3、为这两个veth分配ip。
4、用netns1启动容器中的程序比如/bin/bash。
可惜的是,docker run并没有一个选项让我们去指定所分配的ip,因为网络的确是个大难题。那就得自己动手丰衣足食了。
从上面我们知道,docker在网络这里用到了net namespace,veth和网桥bridge。注意如果你意图使用ip netns list去查看docker在启动容器的时候使用了那个netns,你会失望地发现没有对应netns。其实并不是没有,而是docker为了掩盖一些细节,在做完初始化工作后,docker便将这个netns从/var/run/netns中删除了,我们完全可以用下面的方式让它打回原形:
ln -s /proc/${container's pid}/ns/net /var/run/netns/${the's name you want to display} ip netns list
好了,现在说一下我们给容器分配静态ip的思路:
1、用--net=none方式启动容器,这样容器有了自己的namespace(这一步我们无法干预的,so let it go!)
2、获取容器的进程号pid,然后根据pid将它的net namespace打回原型。
3、创建一个bridge0,用brctl工具(可以通过安装bridge-utils工具来实现)。
4、创建一对veth:vethbridge,vethcontainer,将peer端vethcontainer加入到窗口的net namespace中,将vethbridge接入到bridge0中:brctl add...
5、设置vethcontainer的ip。
6、重启容器的network service。
下面以我机器为例(deepin 2015 kernel 4.5.0)
1、 启动容器:
2、获取容器的进程号:
3、根据进程号将容器的net namespace打回原型:
4、创建网桥bridge0
5、创建veth,配置对应的veth,最后重启容器的network service
6、在容器中可以看到静态分配的ip: 192.168.9.10
注意,现在容器还不能与主机通信,因为主机没有到bridge的设备,如果需要和主机进行通信的话可以添加一对veth,将一端接入bridge。如果容器需要我外部通信的话,可以通过启用内核转发,并在iptables中添加相应的转发规则。
到此,关于“docker容器如何分配静态IP”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!
网页标题:docker容器如何分配静态IP
文章路径:http://lswzjz.com/article/jihgep.html