【赵渝强老师】Docker容器的跨节点通信

简介: 本文详解Docker容器跨主机通信的三种方案,重点介绍基于Overlay网络的实现:通过ZooKeeper注册中心配置Docker集群,创建overlay网络,使不同主机上的容器能用虚拟IP直接互通,并提供完整部署步骤与验证方法。(239字)

b439.png

在同一台宿主机上,不同的Docker容器可以借助docker0的网桥直接进行通信。而在实际的项目中,一个复杂的系统往往需要部署多个组件。为了提高组件的运行的效率往往这些组件需要部署到不同的主机上。那么在Docker中如何实现容器的跨主机通信呢?目前主要可以通过3种不同的方式来实现Docker容器跨主机通信的功能:


  • 方式一:通过容器在宿主机上的端口映射来完成通信。


但使用这种方式在跨主机通信时,由于需要宿主机的转发,使用起来会非常不方便。


  • 方式二:通过借助Docker Overlay网络来实现。


这种方式可以直接使用容器本身的虚拟IP地址进行相互通信,这与运行在同一台宿主机上的不同容器通信方式完全一样。Docker原生的Overlay网络则是这样的一个解决方案,它也是目前实现容器跨节点通信的主流的数据传输和路由方案。要使用Overlay网络还需要有注册中心的支持。


  • 方式三:通过借助第三方网络来实现容器的跨节点通信,如flannel网络等。


下面着重介绍方式二的实现过程。


Overlay网络是在不改变现有网络的前提下,对IP报文上进行数据格式的封装,从而利用IP路由协议实现了数据的转发功能。在Overlay网络中通过扩展标识位,可以支持高达16M的用户。Docker的Swarm集群便是Overlay网络的一个实现,而使用Overlay网络需要注册中的支持。注册中心能够提供服务的注册与发现功能。Docker支持的注册中心有ZooKeeper、Consul和Etcd。


视频讲解如下:


下面以ZooKeepper为例来进行介绍。在ZooKeeper网站上提供了ZooKeeper的安装介质。由于ZooKeeper基于的Java语言,因此,在安装ZooKeeper之前需要先安装Java的JDK环境。下面的步骤将部署一个单节点的ZooKeeper实例。


(1)解压缩JDK的安装介质,这里使用的版本是jdk-8u181-linux-x64.tar.gz。

$ tar -zxvf jdk-8u181-linux-x64.tar.gz -C /root/


(2)编辑文件“/root/.bash_profile”设置Java的环境变量。输入下面的内容:

JAVA_HOME=/root/jdk1.8.0_181
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH


(3)生效Java的环境变量。

$ source /root/.bash_profile


(4)解压缩ZooKeeper的安装介质,这里使用的版本是zookeeper-3.4.10.tar.gz。

$ tar -zxvf zookeeper-3.4.10.tar.gz -C /root


(5)进入ZooKeeper目录生成ZooKeeper的配置文件。

$ cd zookeeper-3.4.10
$ cp conf/zoo_sample.cfg conf/zoo.cfg


(6)启动ZooKeeper实例。

$ bin/zkServer.sh start


(7)查看ZooKeeper实例的状态,如下图所示。这时ZooKeeper是standalone状态,说明这是一个单节点的ZooKeeper实例。

有了ZooKeeper注册中心的支持,就可以进一步实现Docker容器的跨节点通信了。 image.png

下表显示了部署的环境信息。

image.png

具体的操作步骤如下:


(1)在master节点上修改文件“/usr/lib/systemd/system/docker.service”的内容,将参数“ExecStart”改为下面的内容。

ExecStart=/usr/bin/dockerd-current \
  --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
  --default-runtime=docker-runc \
  --exec-opt native.cgroupdriver=systemd \
  --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
  --init-path=/usr/libexec/docker/docker-init-current \
  --seccomp-profile=/etc/docker/seccomp.json \
  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
  --cluster-store zk://192.168.79.11:2181 \
  --cluster-advertise 192.168.79.11:2375 \
  $OPTIONS \
  $DOCKER_STORAGE_OPTIONS \
  $DOCKER_NETWORK_OPTIONS \
  $ADD_REGISTRY \
  $BLOCK_REGISTRY \
  $INSECURE_REGISTRY \
  $REGISTRIES
  
# 其中增加的主要参数如下。
# --cluster-store:指定ZooKeeper的地址和端口。
# --cluster-advertise:将Docker注册到ZooKeeper中的地址信息。


(2)重启master节点上的Docker服务。

$ systemctl daemon-reload
$ systemctl restart docker


(3)在node1节点上修改文件“/usr/lib/systemd/system/docker.service”的内容,将参数“ExecStart”改为下面的内容。

ExecStart=/usr/bin/dockerd-current \
  --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
  --default-runtime=docker-runc \
  --exec-opt native.cgroupdriver=systemd \
  --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
  --init-path=/usr/libexec/docker/docker-init-current \
  --seccomp-profile=/etc/docker/seccomp.json \
  -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \
  --cluster-store zk://192.168.79.11:2181 \
  --cluster-advertise 192.168.79.12:2375 \
  $OPTIONS \
  $DOCKER_STORAGE_OPTIONS \
  $DOCKER_NETWORK_OPTIONS \
  $ADD_REGISTRY \
  $BLOCK_REGISTRY \
  $INSECURE_REGISTRY \
  $REGISTRIES


(4)重启node1节点上的Docker服务。

$ systemctl daemon-reload
$ systemctl restart docker


(5)进入ZooKeeper目录,启动ZooKeeper命令行客户端。

$ cd /root/zookeeper-3.4.10
$ bin/zkCli.sh


(6)查看master和node1在ZooKeeper中的注册信息,如下图所示。

image.png


(7)在任意节点上创建overlay网络,例如在master上执行下面的语句。

$ docker network create -d overlay my_multi_hosts
# 其中的参数-d 用于指定创建网络的类型,这里指定的是overlay。
# 在node1节点上此时会自动同步新创建的网络my_multi_hosts。


(8)在master或者node1上查看Docker的网络信息,如下图所示。这时可以看到新创建的网络“my_multi_hosts”。

image.png


(9)在master节点上,使用my_multi_hosts的overlay网络启动一个容器,并确定容器的IP地址,如下图所示。从图中可以看成box1的IP地址是“10.0.0.2”。

$ docker run -it --net=my_multi_hosts --name box1 busybox
$ ifconfig eth0

image.png

(10)在node1节点上,使用my_multi_hosts的overlay网络启动一个容器,并确定容器的IP地址,如下图所示。从图中可以看成box2的IP地址是“10.0.0.3”。

$ docker run -it --net=my_multi_hosts --name box2 busybox
$ ifconfig eth0

image.png


(11)现在box1和box2既可以通过虚拟IP地址进行通信,也可以通过DNS Server进行通信,如下图所示。

image.png

(12)使用ZooKeeper的图形化工具ZooInspector登录ZooKeeper。这时就可以完整看到Overlay网络在ZooKeeper中的注册信息,如下图所示。

image.png

相关文章
|
存储 编解码 Cloud Native
FFmpeg修复受损视频
FFmpeg修复受损视频
|
1月前
|
存储 缓存 应用服务中间件
手把手教你 Nexus 配置 Docker 镜像源|内网提速超简单
在团队开发和内网部署场景中,反复从公网拉取Docker镜像不仅耗时耗流量,还容易受网络波动影响效率。Nexus私服+轩辕镜像的组合,既能实现内网镜像缓存复用,又能借助稳定的镜像源解决拉取慢、失败的问题,堪称内网镜像管理的最优解。
500 5
手把手教你 Nexus 配置 Docker 镜像源|内网提速超简单
|
23天前
|
数据库 对象存储
2026年 | 4月云大使推广奖励规则
云大使推广返利活动,新增后付费产品返利最高返利45%。企业新用户下单返佣加码5%。新老用户都可参与返利活动。
|
29天前
|
存储 NoSQL 安全
【赵渝强老师】Redis中的字符串
本文详解Redis核心字符串结构SDS(Simple Dynamic String):相比C原生字符串,SDS以O(1)复杂度获取长度、杜绝缓冲区溢出、支持二进制数据,并通过柔性数组高效管理内存。同时系统介绍SET/GET/APPEND等12个常用字符串命令及实战示例。(239字)
|
人工智能 关系型数据库 分布式数据库
PolarDB支撑悠悠有品多地域业务,实现库存毫秒级智能检索
悠悠有品作为国内最大CS:GO饰品交易平台,面临亿级数据毫秒检索、多地域强一致、智能排序等挑战。依托 PolarDB MySQL 版,集成PolarSearch(一体化搜索)、GDN(全球数据库网络)和 PolarDB for AI,实现存储-检索-推荐全链路升级,大幅提升转化率与系统弹性。
|
3月前
|
资源调度 Kubernetes 监控
一文掌握k8s容器的资源限制
在Kubernetes中,合理设置容器的资源请求与限制可保障集群资源高效利用。通过定义CPU和内存的requests与limits,防止资源滥用,提升应用稳定性。结合命名空间配额与工具如xkube,可实现多集群统一管理与可视化配置,优化资源调度。
529 3
|
6月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
761 6
|
6月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
605 2
|
搜索推荐 安全 前端开发
满血上阵!DeepSeek x 魔笔低代码平台创造专属知识空间
本文介绍了如何结合阿里云百炼和多端低代码开发平台魔笔,快速构建一个基于 DeepSeek 的智能化专属知识空间应用。通过使用DeepSeek R1等先进推理模型,该应用能够实现精准的知识推理与智能问答,极大提升信息处理效率。教程涵盖了从创建百炼智能体、获取必要配置参数到在魔笔平台上搭建及发布应用的全过程,并展示了如何对应用进行内容客制化以满足特定需求。此外,还探讨了未来扩展方向,如生产环境部署、多租户隔离以及多样化的用户身份认证方案,旨在为企业和个人提供更加安全、便捷的知识管理解决方案。
满血上阵!DeepSeek x 魔笔低代码平台创造专属知识空间