08. 容器间通信

目录

1、前言

2、容器间通信

2.1、通过IP地址进行通信

2.2、通过DNS Server进行通信

2.3、通过Joined方式通信

3、容器跨节点通信

3.1、通过容器在宿主机上的端口映射实现

3.2、通过Docker Overlay网络实现

4、小结

1、前言

上一篇《07.Docker网络通信模式》我们初步认识了Docker中的几种网络通信模式,分别有bridge,host,container,none。通过这些不同的网络通信模式,运行在宿主机上的容器就可以相互通信。

2、容器间通信

容器之间的通信方式主要有:

  1. 通过IP地址进行通信
  2. 通过Docker DNS Server进行通信
  3. 通过joined方式进行通信

2.1、通过IP地址进行通信

当我们创建一个Docker容器时,Docker daemon进程(守护进程)会为每个容器分配一个虚拟机IP地址。但是,外部网络是无法通过这个虚拟IP地址访问容器内的应用的。

因为这个虚拟IP只提供Docker内部各个容器相互通信使用。也就是通过这恶鬼IP实现Docker内容器间的相互通信。

简单模拟以下通过虚拟IP地址进行容器间相互通信。这里使用我们上一节中创建的自定义网络:mybridge。如果没看过上一篇文章中自定义网络的,可以移步《07.Docker网络通信模式》。

1)创建两个容器,使用自定义mybridge网络模式,并指定他们的IP地址。

docker run -it --net=mybridge --ip=172.19.0.3 busybox 
docker run -it --net=mybridge --ip=172.19.0.4 busybox

2)在其中一个容器内可以执行ping命令,看看两个容器内的虚拟IP地址是否可以联通。

可以看到网络是互通的。

当然采用这种方式是有局限性的:

  1. 当容器间IP发生变更的时候,我们要经常进行切换;如果IP配置项很多,那么这些都要进行变更。
  2. 当宿主机连接的容器,需要根据环境而变化的时候。那么宿主机需要不断的变更容器IP,而且还需要重启。如宿主机测试环境中需要连接容器A,而正式环境中需要连接容器B,那么就需要不断的进行修改,而随着容器数量越多,也更加不利于管理。

2.2、通过DNS Server进行通信

通过IP进行容器间通信,上面提到了一些局限性。那么肯定就有人会提到,如果这些IP针对性配置了host,而配置文件中只需要配置固定的hostname就可以解决这个问题。没错了,这里就提到了另一种通信方式:Docker DNS Server。

从Docker1.10版本开始,Docker 引擎自带了一个内嵌的DNS Server。而我们只需要通过容器名称就可以进行通信。

简单使用DNS Server进行容器通信。

1)创建两个容器,使用自定义mybridge网络模式,并指定他们的容器名称。

# 需要指定dns,不然ping失败
docker run -it --net=mybridge --name=busybox1 --ip=172.19.0.3 --dns=8.8.8.8 busybox
docker run -it --net=mybridge --name=busybox2 --ip=172.19.0.4 --dns=8.8.8.8 busybox

2)在其中一个容器内可以执行ping 容器名称,看看两个容器内的虚拟IP地址是否可以联通。

注:这里使用DNS Server方式通信,仅在自定义bridge网络中使用,默认的bridge网络是不行的。

2.3、通过Joined方式通信

Joined是Docker引擎提供的一种特殊的容器间通信方式,其本质上使用了 container 模因为在container模式下,多个容器共享同一个网络环境,也共享网卡的配置。因此,在 containt模式下,容器之间可以直接通过 localhost 或者 127.0.0.1 进行通信。

简单使用Joined方式进行容器通信。

1)基于httpd镜像创建一个容器,名为http1。

docker run -it --name http1 httpd

2)基于busybox镜像创建一个新的容器,busybox1,并通过参数--net=container:http1,指定与“http1”容器通信。

docker run -it --net=container:http1 --name busybox1 busybox

3)在容器busybox1中,可以使用wget 127.0.0.1直接访问http1容器http服务。

wget 127.0.0.1

http1容器内的响应:

3、容器跨节点通信

上面介绍了3方式可以在同一个宿主机上访问不同的容器,借助于docker0网桥直接进行通信。而在实际项目中,一个复杂的系统往往需要部署很多个组件,而为了提高组件的运行效率,会将这些组件部署到不同主机上。那么跨主机的情况下,容器间如何通信呢?

有以下三种方式:

  1. 通过容器在宿主机上的端口映射实现。
  2. 通过Docker Overlay网络实现。
  3. 通过第三方网络,如flannel网络等来实现。

3.1、通过容器在宿主机上的端口映射实现

这个方式很简单,就是将容器内的端口映射出来,直接使用宿主机进行转发,这样通信效率比较低。但是方式也最直接。

3.2、通过Docker Overlay网络实现

Overlay 网络是在不改变现有网络的前提下,对IP 报文进行数据的封装,从而利用IP 路由协议实现数据的转发功能。在 Overlay 网络中,通过扩展标识位可以支持 16M 的用户。

Docker的 Swarm 集群便是 Overlay 网络的一个实现,而使用Overlay 网络需要注册中心支持。注册中心能够提供服务的注册与发现功能。Docker 支持的注册中心有ZooKeeper、Consu和ETCD。下面以 ZooKeepper 为例来进行介绍。

这里我新建了一台虚拟机,两台虚拟机的信息如下:

主机名

IP地址

部署服务

master

192.168.74.132

docker、zookeeper

node

192.168.74.133

docker

1)选择192.168.74.132作为master节点,自行安装Zookeeper。已有安装的忽略。

安装后启动zookeeper:

./zkServer.sh start
# 查看zookeeper状态
./zkServer.sh status

0

2)master节点修改docker.service文件。加入zookeeper注册中心的支持。

添加以下内容,并保存:

0

  • --cluster-store:表示zookeeper的ip地址和端口号。
  • --cluster-advertise:将docker注册到zookeeper中的地址信息。

3)重启Docker服务。

systemctl daemon-reload
systemctl restart docker

4)在node(192.168.74.133)机子上修改docker.service。

vi /usr/lib/systemd/system/docker.service

加入以下内容,保存,注意IP变化。

0

重启docker服务。

5)启动zookeeper客户端。

./zkCli.sh

0

6)在zookeeper客户端中,查看master和node节点在zookeeper的注册信息。

ls /docker/nodes

7)在任意节点上创建Overlay网络,这里直接在master节点上创建。

docker network create -d overlay my_overlay_net

8)在master节点,使用刚创建的网络my_overlay_net启动一个容器。

docker run -it --net=my_overlay_net --name box1 --dns 8.8.8.8 busybox

可以看到容器IP地址为10.0.0.2。

9)同样的在node节点上,也使用my_overlay_net启动一个容器。

docker run -it --net=my_overlay_net --name box2 --dns 8.8.8.8 busybox

可以看到容器IP地址为10.0.0.3。

10)现在,两个容器间就可以通过虚拟IP进行通信了,也可以通过DNS Server进行通信。

4、小结

docker容器间通信是实际项目使用docker部署的时候必不可少的一个环节,明白几种网络通信方式可以更好的对容器部署进行管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/66102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt应用开发(基础篇)——时间微调输入框 QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类,这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件,父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

24届近5年南京航空航天大学自动化考研院校分析

今天给大家带来的是南京航空航天大学控制考研分析 满满干货~还不快快点赞收藏 一、南京航空航天大学 学校简介 南京航空航天大学创建于1952年10月,是新中国自己创办的第一批航空高等院校之一。1978年被国务院确定为全国重点大学;1981年经…

TM4C123库函数学习(1)--- 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建

前言 (1) 首先,我们需要知道TM4C123是M4的内核。对于绝大多数人而言,入门都是学习STM32F103,这款芯片是采用的M3的内核。所以想必各位对M3内核还是有一定的了解。M4内核就是M3内核的升级版本,他继承了M3的的…

Vue3项目中使用原生input实现excel导入导出功能

重写input样式 首先我们先来重写input的原生样式&#xff0c;毕竟实在不好看。这里的思路很简单input外面套一层div然后让input撑满盒子然后给input隐藏了就行 <div class"bg-[#f8f8f8] w-[430px] h-[220px] rounded-md cursor-pointer relative outline-0">…

智慧影院--java开源电影票优惠券制作系统快速开发

搭建一个智慧影院可以通过使用Java开源电影票优惠券制作系统来快速开发。这个系统可以帮助影院管理电影票的销售和优惠活动&#xff0c;提供便捷的购票方式和优惠券的生成与使用功能。 首先&#xff0c;我们需要建立一个数据库来存储电影、影厅、放映计划、订单等信息。在数据…

Java并发编程(一)多线程基础概念

概述 多线程技术&#xff1a;基于软件或者硬件实现多个线程并发执行的技术 线程可以理解为轻量级进程&#xff0c;切换开销远远小于进程 在多核CPU的计算机下&#xff0c;使用多线程可以更好的利用计算机资源从而提高计算机利用率和效率来应对现如今的高并发网络环境 并发编程…

C++代码生成静态LIB链接库及其调用方法

1、在进行C代码移植时可将CPP文件封装为静态lib链接库&#xff0c;本文章讲述了如何将cpp文件封装为lib文件。 2、假设有文件a.cpp、a.h、b.cpp、b.h以及main.cpp&#xff0c;假设main调用了b&#xff0c;b调用了a。现在需要将a.cpp以及b.cpp封装为a.lib以及b.lib。 3、在VS2…

RISC-V公测平台发布 · UnixBench完整测试

简介 UnixBench是一个开源的GPLv2许可的工具&#xff0c;它提供了对类Unix系统性能的基本指标。 通过运行UnixBench&#xff0c;可以获得有关系统性能的基本指标&#xff0c;用于与其他系统进行比较&#xff0c;也可以作为改进系统性能的参考。但UnixBench并不是一个综合性能…

MySQL和钉钉单据接口对接

MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉&#xff08;DingTalk&#xff09;是阿里巴巴集团打造的企业级智能移动办公平台&#xff0c;是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…

【iOS】RunLoop

前言-什么是RunLoop&#xff1f; 什么是RunLoop? 跑圈&#xff1f;字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…

基于Echarts的大数据可视化模板:智慧物流管理

目录 引言物流管理的重要性大数据可视化在解决物流管理挑战中的作用智慧物流概述定义智慧物流的概念和特点智慧物流的关键技术和平台风险管理和预测:交通拥堵情况和风险预警Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满…

动手学深度学习Pytorch 4.4练习

1.这个多项式回归问题可以准确地解出吗&#xff1f;提⽰&#xff1a;使⽤线性代数。 可以,把多项式问题&#xff0c;用matlab的str2sym表示出来&#xff0c;再用solve求解。 2.考虑多项式的模型选择。 1. 绘制训练损失与模型复杂度&#xff08;多项式的阶数&#xff09;的关系…

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

前言 使用数组名作为函数参数&#xff0c;或者使用数组名的地址作为函数参数&#xff0c;常常出现于对于字符串的读入问题之中。 常有以下两种写法&#xff1a; 这是使用数组名作为函数参数 #include<cstdio> char s[100]; int main() {scanf("%s",s); }在…

抖音商品上架有攻略:详细介绍步骤与注意事项

抖音是一款非常流行的短视频分享平台&#xff0c;也是一个非常适合进行商品销售的平台。上架商品是在抖音上进行电商销售的重要一环&#xff0c;下面不若与众将介绍抖音商品的上架流程和注意事项。 1. 注册账号和认证&#xff1a;首先&#xff0c;你需要在抖音平台上注册一个账…

MYSQL06高级_为什么使用索引、优缺点、索引的设计、方案、聚簇索引、联合索引、注意事项

文章目录 ①. 为什么使用索引②. 索引及其优缺点③. InnoDb - 索引的设计④. InnoDb中的索引方案⑤. 索引 - 聚簇索引⑥. 索引 - 二级索引⑦. B树索引的注意事项⑧. MyISAM中索引方案 ①. 为什么使用索引 ①. 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比去图书馆…

图像 检测 - RetinaNet: Focal Loss for Dense Object Detection (arXiv 2018)

图像 检测 - RetinaNet: Focal Loss for Dense Object Detection - 密集目标检测中的焦点损失&#xff08;arXiv 2018&#xff09; 摘要1. 引言2. 相关工作3. 焦点损失3.1 平衡交叉熵3.2 焦点损失定义3.3 类别不平衡与模型初始化3.4 类别不平衡和两级检测器 4. RetinaNet检测器…

Springboot中使用过滤器校验PSOT类型请求参数内容

目录 目的 实现步骤 完整代码 目的 在Springboot中创建过滤器&#xff0c;用来过滤所有POST类型请求并获取body中的参数进行校验内容是否合法&#xff1b;该方法仅适用于POST类型请求&#xff0c;因为POST和GET请求的参数位置不一样所以处理方式也不一样&#xff0c;如果想要…

flutter 没有open android module in Android studio 插件代码爆红

参考 1.结论 其实就是缺少这个文件 2.解决方案有两个 2.1 方案一 手动创建一个,命名规则是项目名字‘_android’‘.iml’ 内容如下: <?xml version"1.0" encoding"UTF-8"?> <module type"JAVA_MODULE" version"4">&l…

IoTDB在springboot2中的(二) 查询

上一章我们处理的基本的构建接入&#xff0c;以及插入的处理&#xff0c;那么接下来我们进行查询的操作处理。 我们继续在IoTDBSessionConfig工具类中加入查询的方法处理 /*** description: 根据SQL查询最新一条数据* author:zgy* param sql sql查询语句&#xff0c;count查询…

基于Java开发的企业级数字化采购系统

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化采购管理系统&#xff0c;供应商全生命周期管控&#xff0c;公开询价管理&#xff0c;招标&#xff0c;定标&#xff0c;评审&#xff0c;生成订单&#xff0c;送货&#xff0c;收货全流程管理…