学科分类
目录
Docker

Docker Swarm使用

Docker Swarm是Docker原生的,同时也是最简单、最易学、最节省资源的,本节将通过一个具体的示例来演示Docker Swarm集群的基本使用。

使用Docker Swarm集群的具体步骤如下。

1. 环境搭建

(1)准备3台Ubuntu系统主机(即用于搭建集群的3个Docker机器),每台机器上都需要安装Docker并且可以连接网络,同时要求Docker版本都必须是1.12及以上,因为老版本不支持Docker Swarm。

(2)集群管理节点Docker机器的IP地址必须固定,集群中的所有节点都能够访问该管理节点;

(3)集群节点之间必须使用相应的协议并保证其以下端口号可用

● 用于集群管理通信的TCP端口2377;

● TCP和UDP端口7946,用于节点间的通信;

● UDP端口4789,用于覆盖网络流量。

为了进行本节示例的演示,此处按照要求在虚拟机中分别安装了3台使用Ubuntu16.04系统的机器,这三台机器的主机名称分别为manager1(作为管理节点)、worker1(作为工作节点)和worker2(作为工作节点),其IP地址分别如下。

manager1:192.168.197.143
worker1:192.168.197.144
worker2:192.168.197.145

2. 创建Docker Swarm集群

(1)在名为manager1的Docker机器上创建Docker Swarm集群,具体操作指令如下。

$ docker swarm init --advertise-addr 192.168.197.143

执行上述指令后,Docker就会自动在IP为192.168.197.143的机器上(也就是manager1机器上)创建一个Swarm集群,并将该IP地址的机器设置为集群管理节点。需要说明的是,如果只是测试单节点的集群,直接使用docker swarm init指令即可。

执行上述指令后,效果如图1所示。

图1 Docker Swarm创建效果图

执行创建指令后,如果出现图1中所示的信息,就表示Docker Swarm集群创建成功。从图8-12中可以看到,创建集群后显示了两条指令,这两条指令分别是在添加工作节点和管理节点时使用的。

(2)在管理节点上,使用docker node ls指令查看集群节点信息,效果如图2所示。

图2 Docker Swarm节点列表

从图2可以看出,此时只创建了一个集群节点(默认为管理节点),而没有其他工作节点,因此只显示一条节点信息。

3. 向Docker Swarm集群添加工作节点

(1)启动另外两台Docker机器worker1和worker2,分别打开终端窗口,执行向集群中加入工作节点的指令,具体操作指令如下。

$ docker swarm join --token **SWMTKN-1-1ycomzfybfpjtcsiz7ny3ossylmfg9jz07kyjqrek0o3ryncyk-64fm06l4vv2knjbdtx8ez500c** 192.168.197.143:2377

需要特别注意的是,上述指令中的--token参数表示向指定集群中加入工作节点的认证信息。读者在进行学习时,一定要使用自己在前面创建Docker Swarm集群时返回的向集群中添加工作节点的指令,而不是直接使用本书中的指令。如果已忘记添加到Docker Swarm集群的指令,可以在集群管理节点上执行“docker swarm join-token worker”指令进行查看。

(2)再次在集群管理节点上使用docker node ls指令查看集群节点信息,效果如图3所示。

图3 Docker Swarm节点列表

从图3可以看出,集群节点列表中显示出了1个管理节点和2个工作节点,这说明Swarm集群搭建成功。

4. 向Docker Swarm集群部署服务

在Docker Swarm集群中部署服务时,既可以使用Docker Hub上自带的镜像来启动服务,也可以使用自己通过Dockerfile构建的镜像来启动服务。如果使用自己通过Dockerfile构建的镜像来启动服务那么必须先将镜像推送到Docker Hub中心仓库。

为了方便读者的学习,这里以使用Docker Hub上自带的alpine镜像为例来部署集群服务,具体操作指令如下。

$ docker service create --replicas 1 --name helloworld alpine ping docker.com

上述部署服务指令中各参数的具体说明如下。

● docker service create指令:用于在Swarm集群中创建一个基于alpine镜像的服务;

● --replicas参数:指定了该服务只有一个副本实例;

● --name参数:指定创建成功后的服务名称为helloworld;

● ping docker.com指令:表示服务启动后执行的命令。

Docker Swarm集群中的服务管理与容器操作基本类似,只不过服务管理指令是以“docker service”开头,而容器管理指令是以“docker container”开头。个别指令除外,如--replicas。

5. 查看Docker Swarm集群中的服务

(1)当服务部署完成后,在管理节点上可以通过docker service ls指令查看当前集群中的服务列表信息,具体操作指令如下。

$ docker service ls

(2)可以使用docker service inspect指令,查看部署的服务具体详情,具体操作指令如下。

$ docker service inspect helloworld

(3)可以使用docker service ps指令查看指定服务在集群节点上的分配和运行情况,具体操作指令如下。

$ docker service ps helloworld

6. 更改Docker Swarm集群服务副本数量

在集群中部署的服务,如果只运行一个副本,就无法体现出集群的优势,并且一旦该机器或副本崩溃,该服务将无法访问,所以通常一个服务会启动多个服务副本。

在管理节点manager1上,更改服务副本数量的指令如下。

$ docker service scale helloworld=5

更改完成后,就可以使用docker service ps指令查看这5个服务副本在3个节点上的具体分布和运行情况,效果如图4所示。

图4 Docker Swarm服务副本运行状态

从图4可以看出,helloworld服务的5个副本实例被随机分配到了manager1、worker1和worker2这三个节点上运行,并且他们的状态都是Running,表示服务正常运行。

需要说明的是,在集群环境下,服务副本是随机均衡分配到不同节点上的,读者在演示时可能与图中分配效果不同,但只要都正常运行即可。另外,由于有些镜像较大,所以其他工作节点在拉取镜像运行服务实例时可能需要一定的时间,这时该服务副本就会处于Preparing状态。

执行docker service ps helloworld指令查看服务的运行情况后,我们还可以在有服务副本分配的节点机器上使用docker ps指令查看任务运行情况。

7. 删除服务

对于不需要的服务,我们可以进行删除,具体操作指令如下。

$ docker service rm helloworld

在集群管理节点manager1上执行上述删除服务指令后(需要指定删除服务的名称),该服务就会在集群中彻底删除。

需要说明的是,执行上述指令删除服务后,在集群中有该服务副本运行的节点上,这些服务副本仍需要一定的时间清除,此时我们可以使用docker ps查看具体清除情况。

8. 访问服务

前面部署的服务都没有直接向外界暴露服务端口,外界也无法正常访问服务。接下来我们就通过自定义overlay驱动网络为例来讲解集群下的网络管理与服务访问,具体的实现过程如下。

(1)在集群管理节点manager1上,执行docker network ls指令查看网络列表,效果如图5所示。

图5 Docker Swarm网络列表

从图5可以看出,与非集群环境下的Docker网络对比,Docker Swarm集群网络列表中分别增加了一个以bridge和overlay为驱动的网络。在集群中发布服务时,如果没有指定网络,那么默认都是使用名为ingress网络连接的,而在实际开发中,则会使用自定义的overlay驱动网络进行服务管理。

(2)在集群管理节点manager1上,创建以overlay为驱动的自定义网络,具体操作指令如下。

$ docker network create \
 --driver overlay \
 my-multi-host-network

上述指令以overlay为驱动创建了一个名为my-multi-host-network的网络。

(3)在集群管理节点manager1上,再次部署服务,具体操作指令如下。

$ docker service create \
 --network my-multi-host-network \
 --name my-web \
 --publish 8080:80 \
 --replicas 2 \
 nginx

上述部署服务的指令中,--network参数用于指定服务使用自定义的overlay驱动网络my-multi-host-network连接;--name参数用于指定服务启动后的名称;--publish(也可以使用-p)参数用于映射对外服务端口;--replicas参数用于指定该服务的副本数量;nginx表示是基于nginx镜像构建的服务。

小提示:

前面几步虽然只是在集群管理节点上创建了自定义的overlay驱动网络,但是当管理节点的任务分配到某个集群中的工作节点时,该工作节点会自动创建对应的自定义网络;而当在该工作节点上的任务被移除后,该自定义网络也会随之移除。

(4)在集群管理节点manager1上,使用docker service ps my-web指令查看服务的两个服务副本运行情况,结果如图6所示。

图6 Docker Swarm服务副本运行状态

从图6可以看出,该服务的两个副本任务被随机分配到了manager1和worker2两台节点机器上,并已正常运行。

需要注意的是,由于是随机分配,实际操作中的显示可能并不与图8-17中的完全相同,也可能会分配到其他两台节点机器上,如worker1和worker2。

(5)外界访问服务

打开浏览器,使用任意一台节点机器的“IP+8080”端口进行服务访问,都可以正常显示,具体效果如图7所示。

图7 Docker Swarm服务副本运行状态

从图7可以看出,当在任意节点上访问服务时,都可以正常访问部署的服务。这是由于集群负载均衡器将请求路由到一个活动容器,从而实现容器内部服务的正常访问,这也体现出了Docker Swarm负载均衡这一特点。

点击此处
隐藏目录