【教程】docker容器间跨宿主机通信-基于overlay
docker容器间跨宿主机通信-基于overlay
- overlay网络解析
- 环境介绍
- consul安装配置
- 创建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地址。
环境介绍
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
成功通信!
【教程】docker容器间跨宿主机通信-基于overlay相关推荐
- Docker学习:跨宿主机通信 | overlay和macvlay(理论+实战篇)
前言 本讲是从Docker系列讲解课程,单独抽离出来的一个小节,带你一起 深入了解在编排工具出现前,跨宿主机通信的两大得力干将overlay.macvlay,这也会后期学好K8s做好基本功铺垫,打下一 ...
- docker容器无法访问宿主机报出 No route to host
项目场景: 提示:docker容器无法访问宿主机报出 No route to host: 例如:防火墙环境下,docker容器无法访问宿主机的其他应用端口 原因分析: 在进行docker部署的时候我们 ...
- 17.Docker 容器时间与宿主机同步
Docker容器时间与宿主机同步 BY 赫墨拉 · PUBLISHED 2018年7月10日 · UPDATED 2019年6月10日 问题描述: 在我们平时使用docker,运行我们的应用的时候,访 ...
- Docker容器时间与宿主机同步
转载地址:http://www.louisvv.com/archives/1716.html 问题描述: 在我们平时使用docker,运行我们的应用的时候,访问应用页面的时间与现在相差8个小时 无法结 ...
- docker容器端口影射宿主机端口
#将容器的8080端口映射宿主机端口8080 –name:给容器起的名称 docker run -d -p 8080:8080 --name="tomcat7" -id 1130e ...
- Docker容器时间与宿主机不一致?3个解决方案
目录 前言 更新历史 问题描述 解决方案 docker run 添加时间参数 Dockerfile解决方案 docker-compose解决方案 宿主机直接执行命令给某个容器同步时间 异常问题 Doc ...
- 【Docker】docker容器内获取宿主机的信息和执行宿主机的脚本
思路 我们可以通过在容器内远程连接宿主机,然后对宿主机进行操作. 使用 sshpass (我的是CentOS 7.9环境) 1.安装sshpass apt-get update //更新一下 apt- ...
- docker容器时区与宿主机不一致的解决方法
一般情况下,我们的宿主机服务器的时区都是在东八区,而docker容器里却是在零时区.这样就导致了时间差了8个小时,所以需要把容器的时间也设置成东八区. 在dockerfile中的设置如下: RUN l ...
- docker容器正常启动宿主机却无法正常访问
问题:重新开启linux虚拟机后有时候可以访问有时候不可以访问docker容器或者完全无法访问 原因:linux内核版本和docker版本不兼容 解决:更新linux内核版本 yum update - ...
- windows10配置Docker容器独立IP地址互相通信
Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用.一般过程是: 1.Docker进程通过监听宿主机的某个端口,将该端口的数据包发送给Docker容器 ...
最新文章
- 坑!只要年轻博士,薪资按考核结果发放, 高校的博后制度,究竟有多少门道?...
- python:未找到命令
- java 对字符串中的数值排序
- 科大星云诗社动态20210205
- Linux下boost库的安装
- 小黑小波比.git clone报错解决方案
- Java 反射(Class class相关)
- java实现团购功能_[Java教程]jquery组件团购倒计时功能
- 向架构师进军--定义需求
- 查找目录下的所有文件中是否含有某个字符串
- 用C#(asp.net)写出登录验证码!
- 强烈推荐 16 款 IDEA 插件,让你的开发速度飞起来!
- java8中class怎么用_如何在Java中使用Class T?
- ADI收发器新品-ADRV9002特性与对比(AD9361/71/ADRV9009)
- 范围管理之创建WBS
- Flink SQL Size of the state is larger than the maximum permitted memory-backed state
- Outlook 365 添加企业Exchange邮箱(亲测)
- 笔记本电脑无线Wifi热点设置工具
- 沥青路面粘弹性力学分析基础研究
- 处理数据库镜像问题的一个案例——数据库主体与镜像断开连接
热门文章
- 世界三大粮食·水稻稻米十大生产国 国稻种芯百团计划行动
- excel中看着是空单元格,使用Ctrl+G定位空值却定位不到
- dell电脑装双系统linux,戴尔电脑怎么装双系统?戴尔装win7+win10双系统详细教程
- 计算机睡眠和休眠的区别win10,win10睡眠和休眠有何不同_win10休眠和睡眠的区别...
- UserWarning: Usage of dash-separated ‘script-dir‘ will not be supported in future versions. 笔记
- VMware 的安装和破解密码
- 关于ios的ipa包的分析之link map 文件的分析
- 检测运行程序,强制电脑关机代码
- 适合客厅的挂画 山水画让家活色生香
- 三诺 n20g 微型计算机,入门级音箱再现经典 三诺N-20GIII评测