Docker 容器的跨主机连接
在同一宿主机下的Docker的容器之间是默认互相联通的。通过docker inspect id或name可以查看到ip地址。在不通的容器中来执行ping是可以ping通的。
但我们通过观察发现,每一个启动容器的ip地址不是固定的,所以如果我们通过ip地址来实现互连明显是不靠谱的。但我们发现这些ip又处于同一网段中而且默认是127.0.0.X,这就是Docker容器默认跨主机之间的链接方法的第一种:网桥实现
在docker宿主机上运行ifconfig命令可以看的存在一个docker0的网桥。Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。
整体网络拓扑结构就是这样:
但是通过这种桥接,所有网卡都要在一个网段下,所以要对每个Docker守护进程对ip的分配做出限制:
下面,我们就来实现这个结构:
两台Ubuntu 的 ip:
Host1 : 10.211.55.3 网卡:eth0
Host2 :10.211.55.5 网卡 eth1
网关:10.211.55.1
对容器ip的划分:
Host1: 10.211.55.64/26
地址范围: 10.211.55.65~10.211.55.126
Host2: 10.211.55.128/26
地址范围: 10.211.55.129~10.211.55.190
需要的操作:
以下,以Host1 为例,Host2 上操作相似,只是网卡名字不一样,我在这里,没有我们不使用默认的docker0 网桥,而是自己新建一个网桥:
apt-get install bridge-utils
- 分别在Docker主机上建立虚拟网桥:
Host1: $ sudo brctl addbr br0
- 为网桥分配一个同网段ip
Host1: $ sudo ifconfig br0 10.211.55.10 netmask 255.255.255.0
Host2: $ sudo ifconfig br0 10.211.55.20 netmask 255.255.255.0
- 桥接本地网卡:
Host1: $ sudo brctl addif br0 eth0
这里,我们就准备好了网桥设置
下面我们来修改Docker的配置,使用我们新建的网桥代替docker0:
- 修改 /etc/default/docker文件
$sudo vim /etc/default/docker
- 添加守护进程的启动选项:
Host1: DOCKER_OPTS=” -b=br0 –fixed-cidr=‘10.211.55.64/26‘ “
Host2: DOCKER_OPTS=” -b=br1 –fixed-cidr=‘10.211.55.128/26‘ “
这里,-b 用来指定容器连接的网桥名字
–fixed-cidr用来限定为容器分配的IP地址范围
- 保存文件并重启Docker服务
$ sudo service docker restart
下面,就可以来验证:
1.分别在两个Host上启动一个容器
$ docker run -it ubuntu /bin/bash
2.在容器中运行ping命令查看连接情况 发现是互通的。
Docker跨主机容器链接方法二:Open vSwitch
简称OVS是一个虚拟交换软件.目的是让大规模网络自动化可以通过编程扩展。
先看一下实现这种方式的连接所具备的条件:
1.双网卡,Host-Only & NAT
2.安装Open vSwitch: apt-get install openvswitch-switch
操作步骤:
1.在虚拟机中建立ovs网桥
2.添加gre连接
3.配置docker容器虚拟网桥
4.为虚拟网桥添加ovs接口
5.添加不同Docker容器网段路由
具体执行的一些命令如下:
针对10.211.55.3设置
sudo ovs-vsctl show #ovs状态
sudo ovs-vsctl add-br obr0 #增加ovs网桥名为obr0
sudo ovs-vsctl add-port obr0 gre0 # 增加gre接口名为obr0
sudo ovs-vsctl set interface gre0 type=gre
options:remote_ip=10.211.55.5
#设置接口指定链接类型为gre 并指定远程链接的ip
sudo ovs-vsctl show
#接下来设计本机docker网桥
sudo brctl addbr br0
sudo ifconfig br0 10.211.55.1 netmask 255.255.255.0
sudo brctl addif br0 obr0#为本机网桥设置ovs网桥链接
sudo brctl show
#最后设置为docker网桥br0
#这样本机就可以链接10.211.55.5
对于10.211.55.5要联通10.221.55.3只需要对其设置路由表即可:
route
sudo ip route add 10.211.55.0/24 via 10.211.55.5 dev eth0
Docker跨主机容器链接方法三:weave
建立一个虚拟的网络,用于将运行在不同主机的Docker容器连接起来.
要实现这种方式所需要的条件如下:
双网卡,Host-Only & NAT
host1:10.0.2.6
host2:10.0.2.8
host1上应用容器1:192.168.0.2/24
host2上应用容器1:192.168.0.3/24
两台机器上均安装Docker以及weave,并均启动好weave路由容器
在两台机器上均启动一个应用容器.可以直接使用weave run命令,也可以先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址
安装好weava之后,便执行绑定:
在10.0.2.6之中:
weava launch 10.0.2.8 #配置docker处于192.168.0.2/24的网段中 c2=$(weava run 192.168.0.2/24 -ti ubuntu /bin/bash) docker attach $c2
按如上的方法做了后所以主机内的容器通常是全部可以链接成功的,但一般情况下这样很不安全:
我们会使用在/etc/default/docker中配置-icc=false (拒绝容器的所有链接)以及–iptables=true (启动宿主机防火墙规则)而对于需要互连的则使用–link来制定。–link 容器名称:自己定义的别名
使用Open vSwitch实现跨主机容器的连接
查看路由表
route
使用Weave实现跨主机容器的连接
安装weave
sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
sudo chmod a+x /usr/bin/weave
启动weave
$weave launch
连接不同主机
$weave launch 192.168.59.103
通过weave启动容器
c2=$(weave run 192.168.1.2/24 -it ubuntu /bin/bash)
echo $c2
docker attach $c2