首页 > 其他分享 >08. 容器间通信

08. 容器间通信

时间:2023-08-07 12:33:28浏览次数:35  
标签:容器 -- 08 通信 间通信 net Docker docker


目录

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

08. 容器间通信_运维

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

08. 容器间通信_运维_02

可以看到网络是互通的。

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

  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

08. 容器间通信_云原生_03

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

08. 容器间通信_容器_04

注:这里使用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

08. 容器间通信_运维_05

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

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

08. 容器间通信_docker_06

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

wget 127.0.0.1

08. 容器间通信_docker_07

http1容器内的响应:

08. 容器间通信_运维_08

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

08. 容器间通信_容器_09

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

添加以下内容,并保存:

08. 容器间通信_linux_10

  • --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变化。

08. 容器间通信_linux_11

重启docker服务。

5)启动zookeeper客户端。

./zkCli.sh

08. 容器间通信_linux_12

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

ls /docker/nodes

08. 容器间通信_linux_13

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

docker network create -d overlay my_overlay_net

08. 容器间通信_linux_14

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。

08. 容器间通信_云原生_15

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。

08. 容器间通信_linux_16

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

08. 容器间通信_docker_17

4、小结

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

标签:容器,--,08,通信,间通信,net,Docker,docker
From: https://blog.51cto.com/u_15423953/6992557

相关文章

  • 如何查看容器端口到宿主机端口的映射关系?
    使用dockerport命令进行查看 #查看容器的ID[root@nccztsjb-node-27~]#dockerps|grepnginx78e7140c0b8cgoharbor/nginx-photon:v2.6.1"nginx-g'daemonof…"2monthsagoUp2months(healthy)0.0.0.0:80->8080/tcp,:::80->......
  • UM2080F32基于ARM Cortex-M0+内核的超低功耗、高性能的、单片集成(G)FSK/OOK无线收发
    UM2080F32是基于ARMCortex-M0+内核的超低功耗、高性能的、单片集成(G)FSK/OOK无线收发机的32位SoC芯片。工作于200MHz~960MHz范围内,支持灵活可设的数据包格式,支持自动应答和自动重发功能,支持跳频操作,支持FEC功能,同时内部集成了完整的射频接收机、射频发射机、频率综合器、调制解......
  • C#.NET 国密SM2 签名验签 与JAVA互通 ver:20230807
    C#.NET国密SM2签名验签与JAVA互通ver:20230807 .NET环境:.NET6控制台程序(.netcore)。JAVA环境:JAVA8(JDK8,JAVA1.8),带maven的JAVA控制台程序。 1.最好要到对方源码(DEMO+JAR包也可以),可以用IDEA反编译(Ctrl+鼠标左键),看它过程逻辑和结果格式。2.常说的SM2签名,指的就......
  • c#MVC使用AutoFac实现IoC容器,接口多个实现的注入
    AutoFac能够实现自动注入   NetCore同接口多个实现依赖注入  相关资料AutoFac下载的引入使用nuget包管理引入AutoFac 添加打勾的3个,AutoFac容器,AutoFac的apiController支持,AutoFac的mvc支持在Global.asax中注册AutoFacprotectedvoidApplication_Start()......
  • 高性能互斥锁(2023年08月07日更新)
    互斥锁必读说明简介  本软件根据《道德经》为核心思想而设计,实现了多线程同步使用的高性能互斥锁,用汇编语言编写,支持WIndows、Cygwin、Linux、AndroidNDK平台,比系统自带的互斥锁性能要高很多。移植  1、在MutexLock文件夹里有MutexLock.h头文件和对应平台的静态库和动态......
  • 王道408--数据结构--用数组实现二叉树--并查集及其优化代码
    一、数组实现二叉树(下标从0开始)#include<stdio.h>typedefstruct_TreeNode{intdata;boolIsEmpty;//结点是否为空//因为我们的二叉树不一定是满二叉树,中间可能有一些节点不存在//值为1代表空}TreeNode;//初始化voidInitTreeNode(TreeNodet[......
  • [oeasy]python0081_[趣味拓展]ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CS
    光标位置回忆上次内容上次了解了新的转义模式\033逃逸控制字符escape这个字符让字符串退出标准输出流进行控制信息的设置可以设置光标输出的位置ASR33中的ALTMODE是今天的ESC键吗????......
  • 16-20230807
    终于明白眼睛里已经没有了光,是什么体验。没有了追求,眼里没有了光,奋斗的心也就没有了燃料。现在除了困顿迷茫,还是困顿迷茫,什么时候才能走出这阴影,什么时候才能又重拾起前两年的劲。倒计时越来越近,而我仿佛没有任何办法阻止这时光洪流匆匆驶来。 ......
  • 题解 P8085 [COCI2011-2012#4] KRIPTOGRAM
    题目链接题目问的是相对位置是否一样,即若\(s\)的第\(1,2,3\)个字符串相等,\(t\)的第\(1,2,3\)个字符串也相等,则\(s=t\)。由于\(t\)的长度是固定的,所以我们使用哈希进行快速匹配。那么如何设计哈希函数则成为本题的难点。由于问相对位置,那么可以记\(val[i]\)表示......
  • 【230806-9】三角形ABC中,内角ABC的对边分别是abc,b=2,三角形ABC的面积最大值为根号3,则角
    ......