docker 容器多物理机不同容器通信 pipework
1.依赖软件
- util-linux:实现docker-enter命令
- pipework:整合Docker的inspect功能,指定Docker容器的IP地址、子网掩码和Gateway
2. 搭建网桥
2.1 目的
将Docker容器中的操作系统,暴露于实体网络中;实现Docker容器在多宿主间的信息交互。
2.2 删除docker自带的网桥docker0
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
由于docker0为Docker容器分配的是一个内部地址,所以需要将docker0删除。运行下述命令:
# 如果docker服务已经运行,需要停止服务
$ sudo service docker stop
#停止服务后,运行
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
2.3 建立新网桥
建立一个新网桥br0,与宿主的网卡绑定。宿主OS的差异使得新网桥br0建立的过程不同,一下分别就Ubuntu和CentOS为例进行介绍:
2.3.1 Ubuntu
仅需要修改/etc/network/interfaces一个文件。
/etc/network/interfaces原为:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.44
netmask 255.255.255.0
gateway 192.168.1.1
修改前,建议备份/etc/network/interfaces文件:
$ sudo cp interfaces interfaces.bak
建立一个新网桥,原文件改为:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
bridge_ports eth0
bridge_stp no
dns-nameserver 192.168.1.1
2.3.2 CentOS
在CentOS系统下,建立一个新网桥共需要操作两个文件:
/etc/sysconfig/network-scripts/ifcfg-eth0;
/etc/sysconfig/network-scripts/ifcfg-br0。
#修改ifcfg-eth0
#备份:
$ sudo cp ifcfg-eth0 ifcfg-eth0.bak
#将ifcfg-eth0的内容改为:
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
BRIDGE=br0
新建ifcfg-br0
$ touch ifcfg-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
2.3.3 重启宿主
修改网络参数,重启网络可能不会生效,建议重启宿主。
至此,新网桥搭建完成。
3 配置Docker后台进程参数
此部分工作主要是通过修改docker后台进程参数的方式,关闭网桥,为网络配置进行准备。
3.1 Docker配置文件位置
Docker的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致:
在Ubuntu中的位置是:/etc/default/docker;
在CentOS中的位置是:/etc/sysconfig/docker
3.2 Ubuntu
修改/etc/default/docker文件:
$ echo 'DOCKER_OPTS="-b=none"' >> /etc/default/docker
3.3 CentOs
修改/etc/sysconfig/docker-network文件:
$ echo
'DOCKER_NETWORK_OPTIONS="-b=none"' > /etc/sysconfig/docker-network
3.4 重启Docker服务
#至此,完成对Docker后台进程参数的修改,重启Docker服务:
$ sudo service docker restart
4 测试demo
经由上文操作,宿主已搭建新的网桥br0,并完成了Docker后台进程参数的设置。此时,可以通过pipework命令配置Docker容器的IP地址、Netmask和Gateway信息。以下用一个示例说明:
# 使用的镜像为:someOS:v1.0
# 建立的Docker容器名称为test000
# 启动Docker容器,指定其名称为test000,hostname:test000
$ sudo docker run –itd -h test000 –-name test000 someOS:v1.0 /bin/bash
# 使用pipework配置容器的网络:
# IP: 192.168.1.44
# Netmask: 24
# Gateway: 192.168.1.1
$ pipework br0 -i eth0 test000 192.168.1.44/24@192.168.1.1
#连接容器测试
$ sudo docker exec -it test000 /bin/bash
如果容器test000无法解析域名,可以运行,关闭宿主机防火墙,这点很重要
$ echo "echo 'nameserver 192.168.1.1' > /etc/resolv.conf" >> ~/.bashrc
并将test000 commit为新的someOS镜像。