docker 服务启动时默认会创建一个 docker0 网桥,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器通过桥接和本地主机都放到同一个物理网络。但是在使用docker的过程中,有时候我们会有将docker容器配置到和主机同一网段的需求。要实现这个需求,我们只要将docker容器和主机的网卡桥接起来,再给docker容器配上ip就可以了。我们使用pipework工具可以实现这一需求。
1.首先安装bridge-utils网桥管理工具
# yum install bridge-utils
2.在centos系统下,创建一个网桥 br0:
device=br0
type=bridge
onboot=yes
bootproto=static
userctl=no
ipaddr=192.168.1.3
netmask=255.255.255.0
gateway=192.168.1.1
prefix=24
delay=0
dns1=192.168.1.1
3.在centos系统下,编辑/etc/sysconfig/network-scripts/ifcfg-eth0:
device=eth0
type=ethernet
onboot=yes
nm_controlled=no
bootproto=none
bridge=br0
4.在/etc/sysconfig/docker 文件中,添加如下docker参数:
other_args=-b br0
5. 重启网络服务
$ sudo service docker restart
6.pipework安装
$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp pipework/pipework /usr/local/bin/
7.启动两个测试容器
docker run -itd –name test1 –net=none centos /bin/bash
docker run -itd –name test2 –net=none centos /bin/bash
8.设置容器ip
pipework br0 test2 192.168.1.22/24@192.168.1.1
pipework br0 test1 192.168.1.33/24@192.168.1.1
容器con1和con2内部可以看到有一个网卡地址分别如上,并且可以ping通,设置完成。
使用pipework自建桥接网络优点是可以每个容器都有独立ip,对外提供服务,如nginx php,nginx resin,都可以使用默认的80端口,并且由于容器暴露端口都可以使用80端口,因此前端路由层nginx配置(proxy_pass)里可以使用dns的方式。缺点是使用pipework绑定的ip物理机,虚拟机,docker容器的ip都在同一网段,重启后将失效,这在实际生产环境中是很难实现的,并且不适合数量多的容器,分配配置麻烦。