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/[email protected]
#连接容器测试
$ sudo docker exec -it test000 /bin/bash

如果容器test000无法解析域名,可以运行,关闭宿主机防火墙,这点很重要

$ echo "echo 'nameserver 192.168.1.1' > /etc/resolv.conf" >> ~/.bashrc

并将test000 commit为新的someOS镜像。

你可能感兴趣的:(docker 容器多物理机不同容器通信 pipework)