DOCKER的内置OVERLAY网络

内置跨主机的网络通信一直是Docker备受期待的功能,在1.9版本之前,社区中就已经有许多第三方的工具或方法尝试解决这个问题,例如Macvlan、Pipework、Flannel、Weave等。

虽然这些方案在实现细节上存在很多差异,但其思路无非分为两种: 二层VLAN网络和Overlay网络

简单来说,二层VLAN网络解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。这种方案在传输效率上比Overlay网络占优,然而它也存在一些固有的问题。

这种方法需要二层网络设备支持,通用性和灵活性不如后者。

由于通常交换机可用的VLAN数量都在4000个左右,这会对容器集群规模造成限制,远远不能满足公有云或大型私有云的部署需求; 大型数据中心部署VLAN,会导致任何一个VLAN的广播数据会在整个数据中心内泛滥,大量消耗网络带宽,带来维护的困难。

相比之下,Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。

因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。

容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信;如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.2.3这个ip地址。在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

要实现overlay网络,我们会有一个服务发现。比如说consul,会定义一个ip地址池,比如10.0.2.0/24之类的。上面会有容器,容器的ip地址会从上面去获取。获取完了后,会通过ens33来进行通信,这样就实现跨主机的通信。

环境说明

[root@client1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[root@client2 ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[root@client1 ~]# docker -v 
Docker version 1.12.6, build 78d1802
[root@client2 ~]# docker -v 
Docker version 1.12.6, build 78d1802

修改docker配置

修改它的启动参数,这里的ip等要修改成自己的。

[root@client1 ~]# cat /lib/systemd/system/docker.service | grep "ExecStart=/usr/bin/dockerd"
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.6.134:8500 --cluster-advertise=ens33:2376 --insecure-registry=0.0.0.0/0 [root@client2~]# cat /lib/systemd/system/docker.service | grep "ExecStart=/usr/bin/dockerd"
ExecStart=/usr/bin/dockerd  -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.6.135:8500 --cluster-advertise=ens33:2376 --insecure-registry=0.0.0.0/0

修改完后,需要重启。

[root@client1 ~]# systemctl daemon-reload
[root@client1 ~]# systemctl restart docker [root@client2 ~]# systemctl daemon-reload
[root@client2 ~]# systemctl restart docker

查看重启后是否启动成功。

[root@client1 ~]# ps aux | grep dockerd
root     107931  0.4  2.7 507600 27908 ?        Ssl  16:52   0:00 /usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.6.134:8500 --cluster-advertise=ens33:2376 --insecure-registry=0.0.0.0/0 [root@client1 ~]# ps aux | grep dockerd
root     107931  0.4  2.7 507600 27908 ?        Ssl  16:52   0:00 /usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.6.135:8500 --cluster-advertise=ens33:2376 --insecure-registry=0.0.0.0/0

在第一台主机上创建一个consul。

[root@client1 ~]# docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul progrium/consul -server -bootstrap -ui-dir /ui

查看启动是否成功。

[root@client1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                        NAMES
561ad5f39ca5        progrium/consul     "/bin/start -server -"   27 hours ago        Up 7 seconds        53/tcp, 0.0.0.0:8400->8400/tcp, 8300-8302/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->53/udp   focused_spence

创建完后通过浏览器访问一下,可以看到这两台会自动注册上来,这样的话这两个主机之间就会进行通信。

在第一台主机上创建一个overlay网络。

[root@client1 ~]# docker network create -d overlay --subnet=10.0.2.1/24 overlay-net 
80e398c37493ec1a4132efa56572a9212ac5688b557772d295c21a0d0916120b
[root@client1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9008047151be        bridge              bridge              local                             
bd6513b8baec        host                host                local               
6aed7659391a        none                null                local               
80e398c37493        overlay-net         overlay             global  

这边自动回进行通步,因为使用的是同一个服务器发件。

[root@client2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9008047171be        bridge              bridge              local                             
bd6513b8baec        host                host                local               
6aed7449391a        none                null                local               
80e399c37493        overlay-net         overlay             global

创建一个使用overlay网络的容器。

[root@client1 ~]# docker run -d --name app1 --net=overlay-net registry
c8ec2b34c97abd2e563d236d6fe1b51686f7a9440f6eb171392ca0a6221c2b7a

查看是否创建成功。

root@client1 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                        NAMES
c8ec2b34c97a        registry            "/entrypoint.sh /etc/"   About an hour ago   Up 6 seconds        5000/tcp                                                                                                     app1

登陆进去查看ip地址是否是10.0.2.0的网段。

[root@client1 ~]# docker exec -it app1 sh
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:0A:00:02:02  
     inet addr:10.0.2.2  Bcast:0.0.0.0  Mask:255.255.255.0
     inet6 addr: fe80::42:aff:fe00:202%32683/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
     RX packets:15 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:1206 (1.1 KiB)  TX bytes:648 (648.0 B) eth1      Link encap:Ethernet  HWaddr 02:42:AC:13:00:02  
     inet addr:172.19.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
     inet6 addr: fe80::42:acff:fe13:2%32683/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     RX packets:14 errors:0 dropped:0 overruns:0 frame:0
     TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0 
     RX bytes:1217 (1.1 KiB)  TX bytes:1074 (1.0 KiB) lo        Link encap:Local Loopback  
     inet addr:127.0.0.1  Mask:255.0.0.0
     inet6 addr: ::1%32683/128 Scope:Host
     UP LOOPBACK RUNNING  MTU:65536  Metric:1
     RX packets:4 errors:0 dropped:0 overruns:0 frame:0
     TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1 
     RX bytes:379 (379.0 B)  TX bytes:379 (379.0 B)

它也具备一个nat网络模式。

/ # ping www.baidu.com
PING www.baidu.com (61.135.169.125): 56 data bytes
64 bytes from 61.135.169.125: seq=0 ttl=127 time=27.659 ms
64 bytes from 61.135.169.125: seq=1 ttl=127 time=29.027 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 27.659/28.343/29.027 ms

在另一台机器上面同样创建一个overlay网路的容器。

[root@client2 ~]# docker run -d --name app2 --net=overlay-net registry
[root@client2 ~]# docker exec -it app2 sh

查看ip地址。

UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
     RX packets:13 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:1038 (1.0 KiB)  TX bytes:648 (648.0 B) eth1      Link encap:Ethernet  HWaddr 02:42:AC:14:00:02  
     inet addr:172.20.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
     inet6 addr: fe80::42:acff:fe14:2%32667/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     RX packets:14 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:1080 (1.0 KiB)  TX bytes:648 (648.0 B) lo        Link encap:Local Loopback  
     inet addr:127.0.0.1  Mask:255.0.0.0
     inet6 addr: ::1%32667/128 Scope:Host
     UP LOOPBACK RUNNING  MTU:65536  Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1 
     RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

查看client1和client2的容器网络是否可以互通。

/ # ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2): 56 data bytes
64 bytes from 10.0.2.2: seq=0 ttl=64 time=0.748 ms
64 bytes from 10.0.2.2: seq=1 ttl=64 time=0.428 ms
64 bytes from 10.0.2.2: seq=2 ttl=64 time=1.073 ms
^C
--- 10.0.2.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.428/0.749/1.073 ms / # ping app1
PING app1 (10.0.2.2): 56 data bytes
64 bytes from 10.0.2.2: seq=0 ttl=64 time=0.418 ms
64 bytes from 10.0.2.2: seq=1 ttl=64 time=0.486 ms
64 bytes from 10.0.2.2: seq=2 ttl=64 time=0.364 ms
^C
--- app1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.364/0.422/0.486 ms

到此, 在client2主机上的容器可以直接互通。我们这里实现了跨主机通信,是通过overlay network这种网络模式进行通信的。

docker overlay网络实现的更多相关文章

  1. 049、准备overlay网络实验环境(2019-03-14 周四)

    参考https://www.cnblogs.com/CloudMan6/p/7270551.html   为了支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于Vx ...

  2. Docker原生网络技术简介

    Docker原生网络技术简介 默认网络 在宿主机部署好Docker Engine后会默认创建三种网络:Bridge.Host和None,如下: docker network ls NETWORK ID ...

  3. Kubernetes & Docker 容器网络终极之战(十四)

    目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...

  4. docker overlay原理

    周末两天研究了一下docker overlay网络的原理,因为我本身对go语言不太熟悉,直接看docker官方的libnetwork库看不太懂,看linux内核的vxlan代码又粗心大意,导致有一个环 ...

  5. Docker 新网络 overlay 网络

    Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式. 这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术 ...

  6. 准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)

    为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 ...

  7. 创建 overlay 网络 - 每天5分钟玩转 Docker 容器技术(50)

    上一节我们搭建好实验环境,配置并运行了consul,今天开始创建 overlay 网络. 在 host1 中创建 overlay 网络 ov_net1: -d overlay 指定 driver 为 ...

  8. docker应用-5(使用overlay 网络进行容器间跨物理主机通信)

    同一个主机上的Docker容器之间通信 docker 引擎会在主机上增加一个docker0网卡,该网卡具有双重身份: 1.从容器视角,网桥(交换机)身份docker0 对于运行在同一个主机上的各个容器 ...

  9. Docker Swarm 创建overlay网络

    Docker Swarm 创建overlay网络 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1. ...

随机推荐

  1. Redis配置文件各项参数说明及性能调优

    Redis配置文件参数说明: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默 ...

  2. Matlab矩阵填充--Matlab interp2

    Matlab interp2 为Matlab的矩阵填充函数, 填充关系: x=1:11; y=1:13; x1=1:0.1:12; y1=1:0.1:14; [x2,y2]=meshgrid(x1,y ...

  3. 【技术累积】【点】【java】【19】访问权限

    java中的四种访问权限 范围如下表 权限 类内 同包 不同包子类 不同包非子类 Public ✔️ ✔️ ✔️ ✔️ 默认(Default) ✔️ ✔️ ️ Protected ✔️ ✔️ ✔️ P ...

  4. PHP第四天 函数引用传值

    <?php function f1($p1,&$p2){ $p1++; $p2++; $result= $p1+ $p2; return $result;}$v1=10;$v2=20;$ ...

  5. Java中类似单元格之间的计算公式解析,如A1+B3-B4

    package net.riking.util; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; ...

  6. GFS分布式文件系统理论个人总结

    GlusterFS 两种模式 可以通过TCP/IP和RDMA高速网络互连,客户端可通过原生Gluster协议访问数据 没有GlusterFS客户端的可以通过NFS/CIFS标准协议通过存储网关访问数据 ...

  7. CF482D Random Function and Tree 树形DP + 思维 + 神题

    Code: #include<bits/stdc++.h> #define ull unsigned long long #define MOD 1000000007 #define ll ...

  8. 2018 noip 考前临死挣扎

    基础算法 倍增 贪心 分块 二分 三分 数据结构 线段树 对顶堆 数学 质数 约数 同余 组合 矩阵乘法 图论 二分图判定以及最大匹配 字符串 Tire树 KMP 最小表示法 Hash Manache ...

  9. 修改oracle数据库时间

    1.修改前需要先停止 oracle 数据库服务 2.修改 oracle 数据库所在的服务器时间 3.再次启动 oracle 数据库,即可 以上就是小编修改 oracle 数据库的时间,修改完之后,其他 ...

  10. HDU 4456 Crowd

    Crowd Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...