【教程】docker容器间跨宿主机通信-基于overlay

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【教程】docker容器间跨宿主机通信-基于overlay

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地址。
1.png

环境介绍

hostname ip 系统版本
cdh1 10.30.10.111 centos7
cdh2 10.30.10.112 centos7

consul安装配置

要实现overlay网络,我们会有一个服务发现。比如说consul,会定义一个ip地址池,比如10.0.2.0/24之类的。上面会有容器,容器的ip地址会从上面去获取。获取完了后,会通过ens33来进行通信,这样就可以实现跨主机的通信。
在这里插入图片描述
consul通过docker部署在cdh1,首先需要修改cdh1中的docker配置并重启

[root@cdh1 /]# vim /etc/docker/daemon.json
//添加以下配置
"live-restore":true
[root@cdh1 /]# systemctl restart docker
"live-restore":true 此配置的作用为在docker守护程序停止或重启的时候,容器依然可以保持运行

在cdh1下载consul镜像并启动

[root@cdh1 /]# docker pull consul
[root@cdh1 /]# docker run -d -p 8500:8500 -h consul --name consul consul

修改cdh1中的docker配置并重启

[root@cdh1 /]# vim /etc/docker/daemon.json
# 添加以下两行配置
"cluster-store": "consul://10.30.10.111:8500"
"cluster-advertise": "10.30.10.111:2375"
[root@cdh1 /]# systemctl restart docker

修改cdh2中的docker配置并重启

[root@cdh2 /]# vim /etc/docker/daemon.json
# 添加以下两行配置
"cluster-store": "consul://10.30.10.111:8500"
"cluster-advertise": "10.30.10.112:2375"
[root@cdh2 /]# systemctl restart docker
cluster-store指定的是consul服务地址,因为consul服务运行在cdh1的8500端口,所以两台机器的cluster-store值均为 consul://10.30.10.111:8500
cluster-advertise指定本机与consul的通信端口,所以指定为本机的2375端口

此时可以通过http://10.30.10.111:8500/访问consul地址
Key/Value菜单中的docker-nodes目录中可以看到cdh1和cdh2两个docker节点,代表consul配置成功。
在这里插入图片描述

创建overlay网络

此时我们可以创建overlay网络,首先查看目前节点中已有的网络类型

[root@cdh1 /]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ab0f335423a1        bridge              bridge              local
b12e70a8c4e3        host                host                local
0dd357f3ecae        none                null                local

然后在cdh1的docker节点创建overlay网络,因为此时consul服务发现已经正常运行,且cdh1和cdh2的docker服务已经接入,所以此时overlay网络是全局创建的,在任何一台宿主机创建一次即可。

[root@cdh1 /]#  docker network create -d overlay my_overlay
cafa97c5cf9d30dd6cef08a5e9710074c828cea3fdd72edb45315fb4b1bfd84c
[root@cdh1 /]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
ab0f335423a1        bridge              bridge              local
b12e70a8c4e3        host                host                local
cafa97c5cf9d        my_overlay          overlay             global
0dd357f3ecae        none                null                local

此时可以看到,创建的overlay网络,标识为golbal。我们可以查看cdh2的网络,可以发现overlay网络也已经创建完毕。

[root@cdh2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
90d99658ee8f        bridge              bridge              local
19f844200737        host                host                local
cafa97c5cf9d        my_overlay          overlay             global
3986fe51b271        none                null                local

网络测试

创建完成后,我们可以在cdh1和cdh2中指定overlay网络创建docker容器,并进行测试,查看是否可以跨宿主机通信。

在cdh1中创建名称为master的容器,并查看其IP

[root@cdh1 /]# docker run -itd -h master --name master --network my_overlay centos7_update /bin/bash
[root@cdh1 /]# docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}"  master
10.0.0.2

在cdh1中创建名称为slaver的容器,并查看其IP

[root@cdh2 ~]# docker run -itd -h slaver --name slaver --network my_overlay centos7_update /bin/bash
[root@cdh2 ~]# docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}"  slaver
10.0.0.3

此时进入两台容器中,互相ping对方的IP,查看是否成功通信

[root@cdh1 ~]# docker exec -it master /bin/bash
[root@master /]# ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=0.587 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.511 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=0.431 ms
64 bytes from 10.0.0.3: icmp_seq=4 ttl=64 time=0.551 ms
64 bytes from 10.0.0.3: icmp_seq=5 ttl=64 time=0.424 ms
^C
--- 10.0.0.3 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.424/0.500/0.587/0.070 ms
[root@cdh2 ~]# docker exec -it slaver /bin/bash
[root@slaver /]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.499 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.500 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.410 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.370 ms
^C
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.370/0.444/0.500/0.062 ms

成功通信!

目录
相关文章
|
18天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
161 77
|
27天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
5天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
22 4
|
20天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
63 3
|
27天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
63 3
|
27天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
35 2
|
27天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
44 1
|
3月前
|
Linux Docker 容器
Docker操作 :容器命令
Docker操作 (四)
210 56
|
2月前
|
安全 Shell Linux
docker进入容器命令
docker进入容器命令
|
3月前
|
应用服务中间件 Shell nginx
Docker容器操作基础命令
关于Docker容器操作基础命令的教程,涵盖了从启动、查看、删除容器到端口映射和容器信息获取的一系列常用命令及其使用方法。
121 14