赵渝强老师,Docker容器跨节点通信如何实现?
摘要:在同一台宿主机上,不同的Docker容器可以借助docker0的网桥直接进行通信。而在实际的项目中,一个复杂的系统往往需要部署多个组件。为了提高组件的运行的效率往往这些组件需要部署到不同的主机上。那么在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:$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容器的跨节点通信了。下表显示了部署的环境信息。
具体的操作步骤如下:
(1)在master节点上修改文件“/usr/lib/systemd/system/docker.service”的内容,将参数“ExecStart”改为下面的内容。
