跨宿主机Docker网络访问

使用网桥实现跨主机网络连接

      跨主机使用网桥连接示意图如下,在不同的主机中分别创建网桥,并且使用这个网桥来分别连接docker宿主机的物理网卡和docker容器,这就意味着不同宿主机下的容器,都分配在同一网段下。 

      跨宿主机Docker网络访问_第1张图片

      我们需要修改宿主机的/etc/default/docker文件

      1)指定使用的自定义网桥

           -b=b0

      2)限制ip地址的分配范围

         --fixed-cidr

      默认情况下,在docker启动时,会在主机中添加docker0的网桥。在此次的配置中,我们不再使用docker0,而是使用我们自定义的网桥。下面的interfaces文件最后一步是把网桥连接了本地的物理网卡eth0。

sudo vim /etc/network/interfaces

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 10.211.55.5
netmask 255.255.255.0
gateway 10.211.55.1
bridge_ports eth0

wq!

sudo vim /etc/default/docker


DOCKER_OPTS="-b=br0 --fixed-cidr=10.211.55.128/26"

wq!

sudo reboot

       在重启完成后,使用ifconfig命令可以看出,因为我们定义了br0网桥,系统就不再使用docker0网桥。同时因为我们为原来的物理网卡设置了ip地址,并把网卡连接到网桥上,那么eth0也不再有自己的ip地址,这个ip地址被指定给了br0,即这个我们自定义的网桥。

      跨宿主机Docker网络访问_第2张图片

      执行查看docker选项的命令,可以看到参数已设置生效。

      

      此时启动docker容器,然后查看docker内ip地址,可以看到其ip地址已经在所定义的范围内了。

      通过相同方式设置另外的宿主机,确保宿主机的网桥的网段在同一个地址段内,则验证测试,可以相互ping通。

      该方法在parallel虚拟机中设置相对简单,但是在vbox和wmvare中设置就存在兼容性问题,故不建议使用。

 

使用Open vSwitch实现跨主机网络连接

      Open vSwitch是个开源的软件,它实际上就是一个高质量的多层虚拟交换机,使用开源Apache2.0许可协议,主要实现代码为可移植的C代码。该软件的目的之一就是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议。

      下图展示了使用Open vSwtich跨主机连接的原理,图中蓝色的部分是虚拟网桥,容器通过虚拟网桥实现同主机之间的连接,虚拟网桥的上一次,就是黄色的部分,为Open vSwitch创建的ovs网桥,ovs网桥通过gre隧道协议的接口,实现跨主机的网络连接。

      跨宿主机Docker网络访问_第3张图片

      GRE为通用路由协议封装,它使用了一种隧道技术,隧道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据可以是不同协议的数据帧。隧道协议将其他协议的数据帧或包重新封装后通过隧道发送。新的帧头提供路由信息,以便通过互联网传递被封装的负载数据。

      使用该方法需要安装网桥管理工具和Open vSwitch,见下:

apt-get install openvswitch-switch
apt-get install bridge-utils

      配置Open vSwitch的步骤如下:

      跨宿主机Docker网络访问_第4张图片

      首先,使用ovs-vsctl命令,查看ovs的版本号,然后依次进行添加ovs网桥、添加gre接口、设置gre接口,在设置gre接口时,指定接口连接的类型,就是gre,在选项中指定远程连接的ip地址,我们设置为另一台Ubuntu虚拟机的地址。在设置完毕后我们可以通过show命令查看

      跨宿主机Docker网络访问_第5张图片

      然后,我们设置docker容器所需虚拟网桥。我们分别通过增加网桥br0、设置网桥br0的ip、将br0网桥添加ovs网桥的连接,即让ovs网桥成为虚拟网桥br0的一个端口,在设置完后,我们通过show命令查看网桥的状态,我们可以看到,ovs已经被连接到br0上。

      跨宿主机Docker网络访问_第6张图片

      最后,设置用新建的网桥来代替docker0。

vim /etc/default/docker

DOCKER_OPTS="-b=br0"

qw!

sudo service docker restart

      在网络设置完成后,我们运行一个Ubuntu的容器,并查看其ip,并ping另外一台宿主机,可以看到,可以ping通,本宿主机设置完成。

docker run -it ubuntu /bin/bash
ifconfig
ping 192.168.59.104

      如果两台宿主上的docker的网段不同,比如宿主机1上的docker的ip为192.168.2.4,宿主机ip为192.168.59.104,宿主机2上的docker的ip为192.168.1.4,宿主机ip为192.168.59.103,则从宿主机1的docker到宿主机2的docker是不通的,如果要通,则需要添加路由。在宿主机2上查看和添加路由的命令如下。

      跨宿主机Docker网络访问_第7张图片

     在完成如上配置后,从宿主机2上的docker就可以正常访问宿主机1上的docker了。

 

使用weave实现跨主机网络连接

      weave是一个github上的项目,使用该软件可以建立一个虚拟的网络,可以将运行在不同宿主机里的容器连接起来,weave在github上的地址如下:

https://github.com/weaveworks/weave#readme

      跨宿主机Docker网络访问_第8张图片

      如上为weave的工作机制图,通过weave,我们可以忽略容器的所在位置,而直接通过配置的网络进行连接。通过weave方式创建网络的步骤如下:

      跨宿主机Docker网络访问_第9张图片

      如下是下载、赋权限和启动的命令,完成后就可以开始使用weave了。在初次执行“weave launch”命令的时候会从镜像库中下载weave的镜像并运行,其实weave是个docker容器。

sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
sudo chmod a+x /usr/bin/weave
weave launch

      在完成首个宿主机的weave安装后,就可以连接不同的主机,在其他的主机中通过weave来启动容器,如下为其中一个宿主机的示例。首先在执行weave lanch命令时,将首个宿主机的ip传入,从而将该宿主机加入到weave网络中,然后,通过“weave run 192.168.1.2/24 -it ubuntu /bin/bash” 命令创建一个指定ip的容器,使用weave run创建容器和docker run创建容器的方式类似,在容器创建完成后被赋值给一个变量,从而可以方便的通过该变量操作容器,在登录新创建的容器中查看ip,我们可以看到有个ethwe网络设备,在这个设备中使用的ip地址就是我们在运行容器时所指定的ip地址。

      跨宿主机Docker网络访问_第10张图片

      通过该方法所创建宿主机之间的docker可以进行访问。

 

 

 

如果您喜欢这篇文章,别忘了点赞和评论哦!

你可能感兴趣的:(Docker从入门到进阶)