Docker容器的跨主机连接

这里指的是不同宿主机之间的容器连接

Docker网桥实现跨主机容器连接

docker网桥实现跨主机连接的网络拓扑图如下:


在同一个docker主机中,docker容器通过虚拟网桥连接(docker0),如果将连接容器的网桥docker0也桥接到宿主机提供的网卡上,将docker0分配的IP地址和宿主机的IP地址设置为同一个网段,就相当于将docker容器和宿主机连接到了一起,这样就可以实现跨主机的docker容器通信。

修改宿主机docker网桥配置(由于本机有网桥br0,所有直接将修改docker配置文件,实现网桥修改):

这里使用docker启动选项:

-b 指定使用宿主机的网桥名

--fixed-cidr 指定对docker容器分配的ip段

[root@localhost system]# vim docker.service 
ExecStart=
ExecStart=/usr/bin/dockerd -b=br0 --fixed-cidr=172.25.11.1/24 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --iptables=true --icc=false
[root@localhost system]# systemctl daemon-reload 
[root@localhost system]# systemctl restart docker.service 


测试:(启动一个容器查看IP)

[root@localhost system]# docker start dvt1
[root@localhost system]# docker attach dvt1 
root@d153e3ce4b4b:/# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 02:42:ac:19:0b:01  
          inet addr:172.25.11.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:acff:fe19:b01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)


这里使用kvm新建了一个虚拟主机,ip为172.25.11.25,测试可以ping通,则证明跨主机连接成功

root@d153e3ce4b4b:/# ping 172.25.11.25
PING 172.25.11.25 (172.25.11.25) 56(84) bytes of data.
64 bytes from 172.25.11.25: icmp_seq=1 ttl=64 time=0.213 ms
64 bytes from 172.25.11.25: icmp_seq=2 ttl=64 time=0.186 ms


网桥配置跨主机容器连接的优点:

  • 配置简单,不依赖第三方软件

网桥配置跨主机容器连接的缺点:

  • 容器和主机在同一网段,划分IP需要特别小心

  • 需要网段控制权,在生产环境中不容易实现

  • 不容易管理,兼容性不佳

Open vSwitch实现跨主机容器连接

Open vSwitch是一个高质量、多层虚拟交换机。使用Apache2.0许可协议,旨在通过编程扩展,使庞大的网络自动化(配置、管理、维护),同时还支持标准的管理接口和协议。

网络拓扑如下:


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

具体步骤:

1.在虚拟机中建立ovs网桥

2.添加gre连接

3.配置docker容器虚拟网桥

4.为虚拟网桥添加ovs接口

5.添加不同Docker容器网段路由

使用weave实现跨主机容器连接

Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,它能够创建一个虚拟网络,用于连接多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。

外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。


Weave会在主机上创建一个网桥,每一个容器通过 veth pair 连接到该网桥上,同时网桥上有个 Weave router 的容器与之连接,该router会通过连接在网桥上的接口来抓取网络包(该接口工作在Promiscuous模式)。

在每一个部署Docker的主机(可能是物理机也可能是虚拟机)上都部署有一个W(即Weave router),它本身也可以以一个容器的形式部署。Weave run的时候就可以给每个veth的容器端分配一个ip和相应的掩码。veth的网桥这端就是Weave router容器,并在Weave launch的时候分配好ip和掩码。

Weave网络是由这些weave routers组成的对等端点(peer)构成,每个对等的一端都有自己的名字,其中包括一个可读性好的名字用于表示状态和日志的输出,一个唯一标识符用于运行中相互区别,即使重启Docker主机名字也保持不变,这些名字默认是mac地址。

每个部署了Weave router的主机都需要将TCP和UDP的6783端口的防火墙设置打开,保证Weave router之间控制面流量和数据面流量的通过。控制面由weave routers之间建立的TCP连接构成,通过它进行握手和拓扑关系信息的交换通信。 这个通信可以被配置为加密通信。而数据面由Weave routers之间建立的UDP连接构成,这些连接大部分都会加密。这些连接都是全双工的,并且可以穿越防火墙。

对每一个weave网络中的容器,weave都会创建一个网桥,并且在网桥和每个容器之间创建一个veth pair,一端作为容器网卡加入到容器的网络命名空间中,并为容器网卡配置ip和相应的掩码,一端连接在网桥上,最终通过宿主机上weave router将流量转发到对端主机上。

其基本过程如下:

1,容器流量通过veth pair到达宿主机上weave router网桥上。
2,weave router在混杂模式下使用pcap在网桥上截获网络数据包,并排除由内核直接通过网桥转发的数据流量,例如本子网内部、本地容器之间的数据以及宿主机和本地容器之间的流量。捕获的包通过UDP转发到所其他主机的weave router端。
3,在接收端,weave router通过pcap将包注入到网桥上的接口,通过网桥的上的veth pair,将流量分发到容器的网卡上。


weave默认基于UDP承载容器之间的数据包,并且可以完全自定义整个集群的网络拓扑,但从性能和使用角度来看,还是有比较大的缺陷的:

  • weave自定义容器数据包的封包解包方式,不够通用,传输效率比较低,性能上的损失也比较大。

  • 集群配置比较负载,需要通过weave命令行来手工构建网络拓扑,在大规模集群的情况下,加重了管理员的负担。

Weave优劣势:

  • Weave优势

  1. 支持主机间通信加密。

  2. 支持container动态加入或者剥离网络。

  3. 支持跨主机多子网通信。

  • Weave劣势

  1. 只能通过weave launch或者weave connect加入weave网络。

配置操作
  1. 安装weave

  2. 启动weave(veave launch)

  3. 连接不同主机

  4. 通过weave启动主机

  1. 下载安装weave

    [root@localhost docker]# curl -L git.io/weave -o /usr/bin/weave
    [root@localhost docker]# chmod a+x /usr/bin/weave 
    [root@localhost docker]# weave version
    weave script 2.3.0
    weave 2.3.0
  2. 启动weave,weave默认不会下载对应容器,初次运行时会下载容器。

    [root@localhost docker]# weave launch
    2.3.0: Pulling from weaveworks/weave
    88286f41530e: Pull complete 
    ad4e50ed2c08: Pull complete 
    b3f4c952e7c2: Pull complete 
    5e27cb7f1c2b: Pull complete 
    f9dfb03c1d7b: Pull complete 
    Digest: sha256:02914df933ffd52c6daf8c4ced33e48dad36e4d4fd9e684d5004cd72236ced60
    Status: Downloaded newer image for weaveworks/weave:2.3.0
    latest: Pulling from weaveworks/weavedb
    ecb15a45f93b: Pull complete 
    Digest: sha256:7fac063be31d48980361b7020d39ff91493c0bc6c844314b3e71f447bc8dff39
    Status: Downloaded newer image for weaveworks/weavedb:latest
    Unable to find image 'weaveworks/weaveexec:2.3.0' locally
    2.3.0: Pulling from weaveworks/weaveexec
    88286f41530e: Already exists 
    ad4e50ed2c08: Already exists 
    b3f4c952e7c2: Already exists 
    5e27cb7f1c2b: Already exists 
    f9dfb03c1d7b: Already exists 
    21771db04786: Pull complete 
    5fbda086495f: Pull complete 
    80427f885b22: Pull complete 
    0c4698905755: Pull complete 
    Digest: sha256:eb8eb1d83fc58716b20621d397d63737a18f86cbed1fedb1d71671cfc486517b
    Status: Downloaded newer image for weaveworks/weaveexec:2.3.0
    afe02ac7b3654226a09328c8688c8c3e5b6e4226d600dd6120c955ba90537e54
    [root@localhost docker]# docker ps
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
    afe02ac7b365        weaveworks/weave:2.3.0   "/home/weave/weave..."   2 minutes ago       Up 2 minutes                            weave
    [root@localhost docker]# docker images |grep weave
    weaveworks/weavedb     latest              b5c2d24a7b71        6 weeks ago         282 B
    weaveworks/weaveexec   2.3.0               c2030610fb92        6 weeks ago         79.1 MB
    weaveworks/weave       2.3.0               6b9ea60b76e7        6 weeks ago         61.7 MB
    
    
    

    运行结束后,会生成一个运行的容器和两个data-only的容器,和三个镜像

    [root@localhost backup]# docker ps -a
    CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                           PORTS               NAMES
    afe02ac7b365        weaveworks/weave:2.3.0       "/home/weave/weave..."   13 minutes ago      Up 13 minutes                                        weave
    c42cc69d7cf2        weaveworks/weaveexec:2.3.0   "data-only"              13 minutes ago      Created                                              weavevolumes-2.3.0
    7ce56150aa56        weaveworks/weavedb:latest    "data-only"              13 minutes ago      Created                                              weavedb
    其中,weave的这些数据是保存在每台机器上分配的名为 weavedb 的容器上的,它是一个 data volume 容器,只负责数据的持久化。 
    
    
    

    还会生成一个名为weave的虚拟网络设备

    [root@localhost backup]# ifconfig weave
    weave: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1376
            inet6 fe80::5cec:96ff:fe30:6abc  prefixlen 64  scopeid 0x20<link>
            ether 5e:ec:96:30:6a:bc  txqueuelen 1000  (Ethernet)
            RX packets 14  bytes 920 (920.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8  bytes 648 (648.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    
    
    

    docker中也会生成一个使用weave的网桥的自定义网络。

    [root@localhost backup]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    f6bdadf61ce7        bridge              bridge              local
    1239bac87642        host                host                local
    c0c6d15cdc49        none                null                local
    37c69c2e8a78        weave               weavemesh           local
    
    
    
    

  3. 使用weave启动一个镜像

    weave2.0之后删除了run命令,所以先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址

    配置宿主机1的容器:

    [root@localhost system]# docker run -it --name weave_test ubuntu /bin/bash
    [root@localhost system]# weave attach 172.25.11.23/24 weave_test
    Address 172.25.11.23 overlaps with existing route 172.25.11.0/24 on host
    172.25.11.23
    [root@localhost system]# docker exec -it weave_test /bin/bash
    //可以看到weave添加了一个网络设备,并绑定了ip地址
    root@273bba12b3b9:/# ifconfig ethwe
    ethwe     Link encap:Ethernet  HWaddr fe:11:53:ea:3e:ba  
              inet addr:172.25.11.23  Bcast:172.25.11.255  Mask:255.255.255.0
              inet6 addr: fe80::fc11:53ff:feea:3eba/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1376  Metric:1
              RX packets:12 errors:0 dropped:0 overruns:0 frame:0
              TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:948 (948.0 B)  TX bytes:300 (300.0 B)
    
    
    
    

    配置宿主机2的容器:

    [root@localhost volumes]# docker run -it --name weave_another ubuntu /bin/bash
       [root@localhost volumes]# weave attach 172.25.11.112/24 weave_another
       Address 172.25.11.112 overlaps with existing route 172.25.11.0/24 on host
       172.25.11.112
       root@44028ad4bdc2:/# ifconfig ethwe
       ethwe     Link encap:Ethernet  HWaddr 86:ba:c8:b9:cc:eb  
    		 inet addr:172.25.11.112  Bcast:172.25.11.255  Mask:255.255.255.0
             inet6 addr: fe80::84ba:c8ff:feb9:cceb/64 Scope:Link
             UP BROADCAST RUNNING MULTICAST  MTU:1376  Metric:1
             RX packets:12 errors:0 dropped:0 overruns:0 frame:0
             TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
             collisions:0 txqueuelen:0 
             RX bytes:948 (948.0 B)  TX bytes:300 (300.0 B)
    
    
    
  4. 宿主机1的容器weave_test和宿主机2的容器weave_another可以互相访问,验证如下:

    //使用宿主机2的容器对宿主机1的容器进行ping访问
       root@44028ad4bdc2:/# ping 172.25.11.23
       PING 172.25.11.23 (172.25.11.23) 56(84) bytes of data.
       64 bytes from 172.25.11.23: icmp_seq=1 ttl=64 time=0.077 ms
       ^C
       --- 172.25.11.23 ping statistics ---
       1 packets transmitted, 1 received, 0% packet loss, time 0ms
       rtt min/avg/max/mdev = 0.077/0.077/0.077/0.000 ms
       //同样,使用宿主机1的容器对宿主机2的容器进行ping访问
       root@273bba12b3b9:/# ping 172.25.11.112
       PING 172.25.11.112 (172.25.11.112) 56(84) bytes of data.
       64 bytes from 172.25.11.112: icmp_seq=1 ttl=64 time=0.072 ms
       64 bytes from 172.25.11.112: icmp_seq=2 ttl=64 time=0.086 ms
       ^C
       --- 172.25.11.112 ping statistics ---
       2 packets transmitted, 2 received, 0% packet loss, time 999ms
       rtt min/avg/max/mdev = 0.072/0.079/0.086/0.007 ms
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐