快活林资源网 Design By www.csstdc.com

最近因为工作要求需要用学习使用docker,最后卡在了网络配置这一块。默认情况下启动容器的时候,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、 启动容器:

详解docker容器分配静态IP

2、获取容器的进程号:

详解docker容器分配静态IP

3、根据进程号将容器的Net namespace打回原型:

详解docker容器分配静态IP

4、创建网桥bridge0

详解docker容器分配静态IP

5、创建veth,配置对应的veth,最后重启容器的network service

详解docker容器分配静态IP

6、在容器中可以看到静态分配的IP: 192.168.9.10

详解docker容器分配静态IP

注意,现在容器还不能与主机通信,因为主机没有到bridge的设备,如果需要和主机进行通信的话可以添加一对veth,将一端接入bridge。如果容器需要我外部通信的话,可以通过启用内核转发,并在iptables中添加相应的转发规则。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

快活林资源网 Design By www.csstdc.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
快活林资源网 Design By www.csstdc.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?