【赵渝强老师】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

相关文章
|
4月前
|
Kubernetes 应用服务中间件 nginx
最全的kubectl命令用法
本文系统讲解kubectl命令行工具:详解所有子命令(创建、查询、部署、调试等)、API资源列表、自动补全配置,并通过大量实操示例(如创建/查看/编辑/删除资源、扩缩容、回滚、标签管理等)助你快速掌握Kubernetes集群管理核心技能。(239字)
874 143
|
5月前
|
资源调度 Kubernetes 监控
一文掌握k8s容器的资源限制
在Kubernetes中,合理设置容器的资源请求与限制可保障集群资源高效利用。通过定义CPU和内存的requests与limits,防止资源滥用,提升应用稳定性。结合命名空间配额与工具如xkube,可实现多集群统一管理与可视化配置,优化资源调度。
800 3
|
6月前
|
Kubernetes 容器 API
【k8s-1.34.2安装部署】四.kubernets master组件kube-apiserver,kube-controller-manager,kube-scheduler安装
本章介绍k8s-1.34.2中master组件的安装,涵盖kube-apiserver、kube-controller-manager、kube-scheduler的部署流程,包括文件准备、服务启动、状态验证及权限授权,为构建高可用集群奠定基础。
431 1
|
2月前
|
关系型数据库 MySQL Java
【赵渝强老师】MySQL数据库的分库与分表
Mycat是一款开源分布式数据库中间件,支持MySQL等主流数据库,提供分库分表、读写分离、逻辑库/表抽象等功能。本文详解其核心概念(如分片表、ER表、全局序列号)、安装部署(JDK配置、服务启停)及实战配置(schema.xml/rule.xml),并演示基于三节点MySQL的分片数据路由与查询。
231 31
|
6月前
|
Kubernetes 负载均衡 网络协议
【k8s-1.34.2安装部署】一.系统初始化及k8s集群规划
k8s1.34.2的安装总体没什么变化,主要在于结合最新版本的containerd、gateway Api、istio、cilium进行安装,新版本的一些软件和旧的存在一些区别。本章节主要是通过搭建最新版的k8s集群,并搭建gateway Api来进行一些[xkube](https://gitee.com/eeenet/xkube)开发环境的调试和部署,现将整个k8s1.34.2的安装过程进行记录。
1425 23
|
6月前
|
Linux Docker 容器
【赵渝强老师】使用yum方式安装Docker
本文介绍如何使用yum方式在Linux系统中安装和管理Docker。通过yum可自动解决依赖问题并方便地进行软件包更新。首先测试网络连通性,然后执行yum命令安装Docker,启动并启用Docker服务,最后验证安装成功并查看版本信息。
575 5
|
8月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
695 2
|
11月前
|
人工智能 数据挖掘
阿里云联合米兰设计周全国高校设计大赛共同助力高校艺术设计AI人才培养
7月11日,第九届米兰设计周-中国高校设计学科师生优秀作品展人工智能+设计专项赛场颁奖典礼在D20全球设计院长峰会现场举办。活动以“人工智能+设计,助力新质生产力”与“AI技术助力乡村振兴”为主题,由阿里云联合江南大学、浙江理工大学、西南交通大学等高校共同发起,吸引了众多高校师生及获奖团队参与。活动旨在推动AI与设计融合,促进设计人才培养与设计范式创新,助力乡村振兴,探索AI技术在设计领域的广泛应用。
|
机器学习/深度学习 分布式计算 大数据
阿里云 EMR Serverless Spark 在微财机器学习场景下的应用
面对机器学习场景下的训练瓶颈,微财选择基于阿里云 EMR Serverless Spark 建立数据平台。通过 EMR Serverless Spark,微财突破了单机训练使用的数据规模瓶颈,大幅提升了训练效率,解决了存算分离架构下 Shuffle 稳定性和性能困扰,为智能风控等业务提供了强有力的技术支撑。
747 15
|
SQL 流计算 关系型数据库
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析
阿里云OpenLake解决方案建立在开放可控的OpenLake湖仓之上,提供大数据搜索与AI一体化服务。通过元数据管理平台DLF管理结构化、半结构化和非结构化数据,提供湖仓数据表和文件的安全访问及IO加速,并支持大数据、搜索和AI多引擎对接。本文为您介绍以Flink作为Openlake方案的核心计算引擎,通过流式数据湖仓Paimon(使用DLF 2.0存储)和EMR StarRocks搭建流式湖仓。
1443 5
基于OpenLake的Flink+Paimon+EMR StarRocks流式湖仓分析