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部署的时候必不可少的一个环节,明白几种网络通信方式可以更好的对容器部署进行管理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+django+mysql项目实践三(用户管理)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 用户列表展示 urls view models html <!DOCTYPE html> <html

ES面试题

前言 1、面试突击正确的学习姿势 老师在给你讲面试突击的时候&#xff0c;是有课件的&#xff0c;而且是有准备的。你在面试的时候&#xff0c;是没有笔记课件的&#xff0c;而且问题是由面试官提问的&#xff0c;具有一定的随机性面试突击课程的目标不是听懂&#xff0c;而是…

深入解析微店详情API:提升电商平台的技术实力

了解微店详情API的基本概念和功能&#xff1a; 微店详情API是用于通过商品ID获取商品详情数据的接口。它提供了丰富的商品信息&#xff0c;包括商品名称、价格、描述、规格、图片等。我们将介绍API的请求和响应结构&#xff0c;以及常见的参数和返回字段。 最佳实践&#xff1…

微服务与Nacos概述

微服务概述 软件架构的演变&#xff1a;单体架构、垂直应用架构、流式计算架构 SOA、微服务架构和服务网格。 微服务是一种软件开发架构&#xff0c;它将一个大型应用程序拆分为一系列小型、独立的服务。每个服务都可以独立开发、部署和扩展&#xff0c;并通过轻量级的通信机…

重生学c++系列第三课类和对象(上)

好的我们重生c系列的前两期已经介绍完了c祖师爷针对C语言补充的几个新功能&#xff0c;现在我们进入c的真正课题学习——类与对象: C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 比如说我们洗菜做饭&am…

sentinel---滑动窗口的实现原理

sentinel有多种规则&#xff0c;包括&#xff1a;降级、限流、热点等等规则&#xff0c;这些规则均会涉及到时间因素&#xff0c;既在单位时间内的请求量满足各种条件之后的各种动作。 这里我们一起来探针一下sentinel中滑动窗口的实现 如上是一个滑动窗口的示意图。 这里先不…

嵌入式:C高级 Day4

一、整理思维导图 二、写一个函数&#xff0c;获取用户的uid和gid并使用变量接收 三、整理冒泡排序、简单选择排序和快速排序的代码 冒泡排序 #include <myhead.h>void output(int arr[], int len); void bubble_sort(int arr[], int len);int main(int argc, const ch…

OPENCV C++(八)HOG的实现

hog适合做行人的识别和车辆识别 对一定区域的形状描述方法 可以表示较大的形状 把图像分成一个一个小的区域的直方图 用cell做单位做直方图 计算各个像素的梯度强度和方向 用3*3的像素组成一个cell 3*3的cell组成一个block来归一化 提高亮度不变性 常用SVM分类器一起使用…

Windows环境下Node.js二进制版安装教程

文章目录 前言一 下载Node.js二 设置环境变量三 配置全局安装和缓存路径四 设置仓库 前言 新版的Node.js已自带npm&#xff0c;就在Node.js下载完成解压后的文件内&#xff0c;的node_modules包中。 npm的作用&#xff1a;是对Node.js依赖的包进行管理&#xff0c;类似maven。…

如何构造一个安全的单例?

为什么要问这个问题&#xff1f; 我们知道&#xff0c;单例是一种很常用的设计模式&#xff0c;主要作用就是节省系统资源&#xff0c;让对象在服务器中只有一份。但是实际开发中可能有很多人压根没有写过单例这种模式&#xff0c;只是看过或者为了面试去写写demo熟悉一下。那…

C语言代码的x86-64汇编指令分析过程记录

先通过Xcode创建一个terminal APP&#xff0c;语言选择C。代码如下&#xff1a; #include <stdio.h>int main(int argc, const char * argv[]) {int a[7]{1,2,3,4,5,6,7};int *ptr (int*)(&a1);printf("%d\n",*(ptr));return 0; } 在return 0处打上断点&…

Linux usb设备固定端口号

Linux usb设备固定端口号 一:/sys/bus/usb/devices/二:设备信息三:固定usb设备名方法 一:/sys/bus/usb/devices/ 信息显示如下 1-0:1.0 1&#xff1a;表示 1 号总线&#xff0c;或者说 1 号 Root Hub0&#xff1a;表示端口号1&#xff1a;表示配置号0&#xff1a;表示接口号命…

错过NFT投资,你可能会后悔吗?

在过去的几年里&#xff0c;非同质化代币&#xff08;NFT&#xff09;以其独特性和创新性&#xff0c;迅速成为数字资产领域的热门话题。NFT代表了数字资产的所有权和独特性&#xff0c;为艺术、音乐、游戏和虚拟世界等领域提供了全新的可能性。然而&#xff0c;对于那些错过了…

冠达管理投资前瞻:三星加码机器人领域 大信创建设提速

上星期五&#xff0c;沪指高开高走&#xff0c;盘中一度涨超1%打破3300点&#xff0c;但随后涨幅收窄&#xff1b;深成指、创业板指亦强势震动。截至收盘&#xff0c;沪指涨0.23%报3288.08点&#xff0c;深成指涨0.67%报11238.06点&#xff0c;创业板指涨0.95%报2263.37点&…

gin框架学习

文章目录 配置go环境实现一个简单的web响应服务验证功能gin增加页面以及传递数据 配置go环境 去go官网下载对应的版本 go下载地址 tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz 我们可以编辑 ~/.bash_profile 或者 /etc/profile&#xff0c;并将以下命令添加该文件的末…

【排序算法】python之冒泡,选择,插入,快速,归并

参考资料&#xff1a; 《Python实现5大排序算法》《六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序》 --代码似乎是C语言 ———————— 本文介绍5种常见的排序算法和基于Python实现&#xff1a; 冒泡排序&#xff08;Bubble Sort&am…

pocky-request网络请求插件

插件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id468 插件&#xff1a;https://www.yuque.com/pocky/aaeyux/irx7u0#Oosbz 使用教程&#xff1a; 下载插件main.js中配置&#xff1a; // 导入 import axiosRequest from ./js_sdk/pocky-request/pocky-request…

鉴源实验室丨SOME/IP协议安全攻击

作者 | 张昊晖 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 引 言 随着汽车行业对于数据通信的需求不断增加&#xff0c;SOME/IP作为支持汽车以太网进程和设备间通信的一种通信协议应…

【Git】Git切换地址

如何切换git代码地址&#xff1f; 1、查看当前远程 url git remote -v执行命令后&#xff0c;可以看见当前有2个URL。 远程 URL 在一般情况下有两个&#xff0c;分别是 fetch 和 push。 fetch URL 是用于从远程仓库获取最新版本的数据。当您运行 git fetch 命令时&#xf…

Oracle-ORA-00600:[ktspffbmb:objdchk_kcbnew_3]

问题背景: 应用执行存储过程报错ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4], [], [], [], [], [], [], [], []&#xff0c;导致过程无法正常执行 ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4]…