上一篇在阅读官文的过程中发现官方推荐了一个pipework的shell脚本来帮助你自动打通容器之间的网络连接,pipework是一个用软件来为linux容器定义网络的工具,pipework允许你在一个复杂的环境下把容器连接在一起,pipework使用cgroup和namespace来和LXC容器协同工作,当然也可以和docker来一起工作。
下载pipework
git clone https://github.com/jpetazzo/pipework.git
在下载下来的pipework目录里面有一个pipework脚本,用shell编写的,就是把创建的网络的命令自动化,行数不多,感兴趣的可以看看。
在动手前我们有些事要提醒一下:当你在docker中使用pipework之前,先去docker用户列表中询问一下,docker是否已经有了更加原生方法来实现相同的功能,这样你应该不用pipework,pipework后面应该被淘汰的。如果当前版本的docker真的没有办法使你的docker容器集中在一起,那么只能使用pipework了。
先看看原始网络配置:
下面的例子显示了pipework怎么来帮助你的容器
#创建两个容器 ssh11=$(docker run -d -P --name ssh1 ssh_service) ssh22=$(docker run -d -P --name ssh2 ssh_service)创建网桥
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创建两个虚拟网卡信息
这时看看宿主机的网卡信息
红色框中的是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/[email protected]如果你想连接容器到真实的物理网卡也是很容易的,比如你要连接容器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