pipework是一个用软件来为linux容器定义网络的工具,pipework容许你在一个复杂的环境下把容器链接在一块儿,pipework使用cgroup和namespace来和LXC容器协同工做,固然也能够和docker来一块儿工做。linux
下载pipeworkgit
git clone https://github.com/jpetazzo/pipework.git
在下载下来的pipework目录里面有一个pipework脚本,用shell编写的,就是把建立的网络的命令自动化,行数很少,感兴趣的能够看看。github
在动手前咱们有些事要提醒一下:当你在docker中使用pipework以前,先去docker用户列表中询问一下,docker是否已经有了更加原生方法来实现相同的功能,这样你应该不用pipework,pipework后面应该被淘汰的。若是当前版本的docker真的没有办法使你的docker容器集中在一块儿,那么只能使用pipework了。docker
先看看原始网络配置:shell
下面的例子显示了pipework怎么来帮助你的容器网络
#建立两个容器 ssh11=$(docker run -d -P --name ssh1 ssh_service) ssh22=$(docker run -d -P --name ssh2 ssh_service)
建立网桥ssh
cd pipework ./pipework br8 $ssh33 192.168.1.10/24 ./pipework br8 $ssh22 192.168.1.11/24
先说说上面这个命令的做用:建立一个br8网桥,而后增长一个eth0名称的接口到$ssh11这个容器上面,配置一个192.168.1.10到该接口,而后把这个接口链接到br8上面。工具
使用brctl查看docker建立两个虚拟网卡信息spa
这时看看宿主机的网卡信息code
红色框中的是docker服务默认启动后使用docker0网桥建立容器的虚拟接口,绿色框中的是咱们使用br8做为网桥,启动容器后生成的虚拟网卡信息
利用docker ps查看容器的ssh端口都映射到docker主机的那个端口了
能够看到ssh1是49153端口,ssh2是49154端口,如今咱们登录一下容器ssh1
看起来很完美是不?注意个人登录ip,为何是172.17.42.1?这是docker0网桥的地址啊,个人容器是绑定的br8的,又不是绑定的docker0的,可是翻看上面的图,能够看到br8并无ip地址,那是由于虽然用pipework建立了br8网桥,并且把容器的ip绑定到br8了,可是你并无给br8网桥自己绑定ip,因此br8网桥确定没ip了,只要给br8再绑定一个ip,应该就能够利用br8网桥的ip地址登录了,可是为何能够利用docker0的ip来登录呢?docker ps看到的ssh映射的ip是0.0.0.0
pipework还能够解析docker容器的名称,若是pipework识别不了你输入的docker id,则docker会使用docker inspect来解析,例如
pipework br8 ssh11 192.168.1.11/24
若是想链接这些容器,而使用私网地址:
ip addr add 192.168.1.254/254 dev br1
默认状况下pipework在容器内部建立了一个eth1网络接口,若是你想改变这个接口的名称,或者设置多个接口:pipework br8 -i eht2...
传递给pipework的地址会被直接传递给ip addr工具,所以你能够直接在ip后面使用CIDR,不要忘记全部的额容器都使用相同的子网掩码
若是你有outbound的流量,好比容器须要链接外部世界,你须要改变容器的默认路由,这些都是能够被pipework自动解决的,只要在ip地址和掩码后面加上默认网关的地址便可:
pipework br1 $ssh11 192.168.1.10/24@192.168.1.254
若是你想链接容器到真实的物理网卡也是很容易的,好比你要链接容器ssh11到eth3上面:
pipework eht3 $ssh11 50.19.169.157/24
这个用到了macvlan,因此你能够把多个容器绑定到同一个物理网卡上
有时候你但愿额外的网卡在起来正常运转前你的服务已经启动,pipework脚本提供了一个参数--wait,它会直到你的网卡启动后,才会启动服务
还可使用dhcp代替指定的ip:
pipework eth1 $ssh11 dhcp
还能够指定网卡的MAC地址:
pipework eth0 $ssh11 192.168.1.6/24 xx:xx:xx:xx:xx:xx
pipework能够作的事情不少,就不一一介绍了,有兴趣的能够看官网例子。