news 2026/4/16 6:02:28

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【赵渝强老师】Docker容器的跨节点通信

在同一台宿主机上,不同的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。

视频讲解如下

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

下面以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:$PATHexport 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 $cpconf/zoo_sample.cfg conf/zoo.cfg

(6)启动ZooKeeper实例。

$ bin/zkServer.shstart

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


有了ZooKeeper注册中心的支持,就可以进一步实现Docker容器的跨节点通信了。下表显示了部署的环境信息。

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

ExecStart=/usr/bin/dockerd-current \--add-runtimedocker-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-runtimedocker-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中的注册信息,如下图所示。

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

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

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

(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

(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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 23:25:58

STM32L071双Bank实战:5分钟搞定IAP升级防变砖(附完整代码)

STM32L071双Bank实战:5分钟搞定IAP升级防变砖(附完整代码) 在嵌入式系统开发中,固件升级是一个永恒的话题。想象一下,当你的设备部署在偏远地区,突然发现一个关键bug需要修复,或者需要添加新功…

作者头像 李华
网站建设 2026/4/11 23:24:47

sfsDb与TDengine Edge比较选型

这是一个非常深刻且切中要害的技术问题。简单直接的回答是:仅靠“添加压缩功能”很难让 sfsDb 在“存储效率”和“海量数据查询”上全面超越 TDengine Edge,但在“嵌入式场景的写入与处理延迟”上,sfsDb 有潜力做到极致。要理解为什么&#x…

作者头像 李华
网站建设 2026/4/13 6:49:48

技术选型评估框架需求技术与团队匹配

技术选型评估框架:需求、技术与团队的精准匹配 在快速迭代的软件开发领域,技术选型直接决定项目的成败。如何从众多技术方案中选出最适合团队与业务需求的工具?关键在于构建一个科学的技术选型评估框架,确保需求、技术与团队能力…

作者头像 李华
网站建设 2026/4/13 4:08:55

让微信网页版重新可用:wechat-need-web浏览器插件完全攻略

让微信网页版重新可用:wechat-need-web浏览器插件完全攻略 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为微信网页版无法登录而烦恼…

作者头像 李华
网站建设 2026/4/11 23:20:16

2026年04月10日热门Model/github项目

总结 2026年4月10日 新上榜的 6个GitHub项目 和 5个HuggingFace模型,反映了当前AI领域的几个核心趋势: 关键趋势: AI编程工具链成熟化:从代码生成(Superpowers、Archon)到知识管理(Claudian&…

作者头像 李华