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

相关文章
|
6月前
|
Kubernetes 应用服务中间件 nginx
最全的kubectl命令用法
本文系统讲解kubectl命令行工具:详解所有子命令(创建、查询、部署、调试等)、API资源列表、自动补全配置,并通过大量实操示例(如创建/查看/编辑/删除资源、扩缩容、回滚、标签管理等)助你快速掌握Kubernetes集群管理核心技能。(239字)
1028 143
|
2月前
|
人工智能 自然语言处理 API
阿里云Token Plan团队版解析:功能、三档套餐与省钱订阅指南
阿里云百炼平台推出的Token Plan团队版,是面向企业与团队的AI大模型订阅服务,以Credits为统一计量单位,整合文本与图像生成模型,提供团队管理、数据安全、多工具兼容等核心能力,解决团队零散订阅AI服务的管理混乱、成本失控、数据安全等痛点。本文将从核心定位、套餐详情、计费规则、团队管理、工具兼容、便宜订阅技巧等方面,全面解析Token Plan团队版,帮助企业与团队高效、低成本地使用AI服务。
434 108
|
8月前
|
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的部署流程,包括文件准备、服务启动、状态验证及权限授权,为构建高可用集群奠定基础。
485 1
|
7月前
|
资源调度 Kubernetes 监控
一文掌握k8s容器的资源限制
在Kubernetes中,合理设置容器的资源请求与限制可保障集群资源高效利用。通过定义CPU和内存的requests与limits,防止资源滥用,提升应用稳定性。结合命名空间配额与工具如xkube,可实现多集群统一管理与可视化配置,优化资源调度。
902 3
|
4月前
|
关系型数据库 MySQL Java
【赵渝强老师】MySQL数据库的分库与分表
Mycat是一款开源分布式数据库中间件,支持MySQL等主流数据库,提供分库分表、读写分离、逻辑库/表抽象等功能。本文详解其核心概念(如分片表、ER表、全局序列号)、安装部署(JDK配置、服务启停)及实战配置(schema.xml/rule.xml),并演示基于三节点MySQL的分片数据路由与查询。
303 31
|
6月前
|
应用服务中间件 Shell nginx
最全的docker命令参数解释及命令用法
本文系统详解Docker核心命令,涵盖容器(run/exec/ps/start/stop等)、镜像(pull/build/push/rmi等)、网络、数据卷及全局参数,并配实操示例与可直接执行的命令,助初学者快速掌握Docker日常运维与开发应用。
2059 129
|
6月前
|
运维 Kubernetes 应用服务中间件
一文讲解kubernetes的gateway Api的功能、架构、部署、管理及使用
Gateway API是Kubernetes官方推出的下一代L4/L7网络网关标准,面向角色(基础设施商、运维、开发)、可移植、表达力强且高度可扩展。它通过GatewayClass、Gateway、HTTPRoute等资源实现权限分离与策略即代码,替代Ingress短板,已获Istio、Envoy、ASM等主流支持。
1838 119
|
5月前
|
存储 NoSQL 安全
【赵渝强老师】Redis中的字符串
本文详解Redis核心字符串结构SDS(Simple Dynamic String):相比C原生字符串,SDS以O(1)复杂度获取长度、杜绝缓冲区溢出、支持二进制数据,并通过柔性数组高效管理内存。同时系统介绍SET/GET/APPEND等12个常用字符串命令及实战示例。(239字)
192 1
|
7月前
|
Kubernetes 前端开发 调度
一文掌握pod亲和性及调度策略
Kubernetes中,Pod是调度的基本单位。通过nodeName、nodeSelector、亲和性等策略,可精细控制Pod部署位置,实现资源优化、低延迟通信与故障隔离。支持硬约束与软约束,结合标签选择器灵活配置。
676 4
|
8月前
|
运维 Kubernetes NoSQL
【k8s-1.34.2安装部署】九.k8s管理平台xkube安装部署
xkube是一款永久免费、无功能限制的云原生Kubernetes多集群管理工具,支持PC端与APP端,提供集群管理、运维监控、CI/CD发布等功能,助力企业实现跨集群统一管理与自动化运维。
780 4
【k8s-1.34.2安装部署】九.k8s管理平台xkube安装部署