Docker Swarm用于容器编排
关于Docker Swarm以及它如何在集群中管理和编排所有容器。
Docker Swarm是什么?
Docker Swarm是一种处理Docker Engine集群的模式,因此得名Swarm。Docker主机集群以管理者和工作节点的形式运行在Swarm模式下。参与Swarm的docker-engine实例被称为节点。
生产级别的Swarm部署包括在多个服务器上分布的docker节点。
为什么使用它?—容器编排
当您在生产环境中工作时,将有数百个docker容器在其中运行多个应用程序。管理所有这些容器可能会给所有工程师带来很大的压力,这就是Docker Swarm帮助您的地方。它可以轻松管理和编排运行在集群中的多个docker容器。
以下是它的一些特点:
- 高可用性 –旨在提供无停机或停机时间。
- 负载均衡 –如果任何节点失败,则自动将资源和请求分配到集群中的其他节点。
- 去中心化 –在生产环境中运行多个管理者节点,因此集群不依赖于单个管理者节点。
- 可扩展性 –使用单个docker swarm命令,可以轻松地在集群中扩展或缩小容器。
编排Docker容器
现在您已经了解了Docker Swarm的基本知识,让我们来看一个实现示例。
在此示例中,我有三台机器在集群中运行,其详细信息如下:
manager1: 192.168.56.104
worker1: 192.168.56.105
worker2: 192.168.56.102
要在docker中初始化Swarm模式,请在管理者节点上运行以下命令。标志--advertise-addr
用于向可以加入集群的节点广告自身。
yaoweibin@manager1:~$ docker swarm init --advertise-addr 192.168.56.104
Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上述命令将生成一个令牌,其他节点将使用该令牌加入此集群。复制生成的带有令牌的命令,并在工作节点上运行它。
在worker1节点上运行令牌。
yaoweibin@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
This node joined a swarm as a worker.
在worker2节点上运行令牌。
yaoweibin@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
This node joined a swarm as a worker.
现在,在管理者节点上,您可以检查集群中运行的节点。
yaoweibin@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6
utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6
xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
让我们构建在Dockerfile Tutorial中使用的yaoweibin_mongodb
docker镜像。
yaoweibin@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jgqjo92rbq23 Mongo-Container.1 yaoweibin_mongodb:latest manager1 Running Running about a minute ago
utdr3dnngqf1 Mongo-Container.2 yaoweibin_mongodb:latest worker1 Running Running about a minute ago
lssbyfzuiuh3 Mongo-Container.3 yaoweibin_mongodb:latest worker2 Running Running about a minute ago
xs6jqp95lw4c Mongo-Container.4 yaoweibin_mongodb:latest worker1 Running Running about a minute ago
Each of the 3 nodes runs one instance of the swarm service.
If you want to remove all the services at once, use the below command. This will stop and remove all the services running on the swarm cluster.
yaoweibin@manager1:~$ docker service rm $(docker service ls -q)
Confirm by running the docker service ls command again. All the services should be removed.
yaoweibin@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
yaoweibin@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg yaoweibin_mongodb:latest worker2 运行中 运行中 约一分钟之前
3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu yaoweibin_mongodb:latest worker1 运行中 运行中 约一分钟之前
yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf yaoweibin_mongodb:latest manager1 运行中 运行中 约一分钟之前
接下来,让我展示你如何定义副本的数量。在此之前,我将删除当前正在运行的容器。
yaoweibin@manager1:~$ docker service rm Mongo-Container
Mongo-Container
使用命令中的–replicas标志,并指定您想要的swarm服务副本数。例如,我想要两个swarm服务的副本:
yaoweibin@manager1:~$ docker service create –name “Mongo-Container” -p 27017:27017 –replicas=2 yaoweibin_mongodb
image yaoweibin_mongodb:latest could not be accessed on a registry to record its digest. Each node will access yaoweibin_mongodb:latest independently, possibly leading to different nodes running different versions of the image.
4yfl41n7sfak65p6zqwwjq82c
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
检查当前运行的swarm服务。您可以看到一个副本正在manager1节点上运行,另一个副本正在worker1节点上运行。
yaoweibin@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xukodj69h79q Mongo-Container.1 yaoweibin_mongodb:latest worker1 运行中 运行中 9秒之前
e66zllm0foc8 Mongo-Container.2 yaoweibin_mongodb:latest manager1 运行中 运行中 9秒之前
转到worker1节点并检查docker容器是否正在运行swarm服务。
yaoweibin@worker1:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5042b7f161cb yaoweibin_mongodb:latest “/bin/sh -c usr/bin/…” 大约一分钟前 正在运行 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
要停止此容器,请运行以下命令。
yaoweibin@worker1:~$ docker stop 5042b7f161cb
5042b7f161cb
现在,如果您从manager1节点检查哪些节点正在运行该服务,您将看到它在manager1节点和worker2节点上运行。worker1节点的当前状态是Shutdown(因为我们停止了运行该服务的容器)。但由于该服务必须运行两个副本,因此在worker2上启动了另一个服务。
这就是您如何使用docker swarm实现高可用性。
yaoweibin@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
cd2rlv90umej Mongo-Container.1 yaoweibin_mongodb:latest worker2 Running Running 30 seconds ago
xukodj69h79q _ Mongo-Container.1 yaoweibin_mongodb:latest worker1 Shutdown Failed 38 seconds ago “task: non-zero exit (137)”
e66zllm0foc8 Mongo-Container.2 yaoweibin_mongodb:latest manager1 Running Running 3 minutes ago
非常容易扩展或缩小docker容器。下面的命令将将mongo容器扩展到5个。
yaoweibin@manager1:~$ docker service scale Mongo-Container=5
Mongo-Container已扩展到5个
整体进度: 5个任务中的5个
1/5: 运行中
2/5: 运行中
3/5: 运行中
4/5: 运行中
5/5: 运行中
验证: 服务已汇聚
检查现在运行的mongo容器副本数量,它必须是5个。
yaoweibin@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
4yfl41n7sfak Mongo-Container replicated 5/5 yaoweibin_mongodb:latest *:27017->27017/tcp
检查集群中运行这5个副本的位置。1个副本在manager1节点上运行,每个worker节点上有2个副本。
yaoweibin@manager1:~$ docker service ps Mongo-Container
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
cd2rlv90umej Mongo-Container.1 yaoweibin_mongodb:latest worker2 Running Running 2 minutes ago
xukodj69h79q _ Mongo-Container.1 yaoweibin_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)"
e66zllm0foc8 Mongo-Container.2 yaoweibin_mongodb:latest manager1 Running Running 5 minutes ago
qmp0gqr6ilxi Mongo-Container.3 yaoweibin_mongodb:latest worker2 Running Running 47 seconds ago
9ddrf4tsvnu2 Mongo-Container.4 yaoweibin_mongodb:latest worker1 Running Running 46 seconds ago
e9dhoud30nlk Mongo-Container.5 yaoweibin_mongodb:latest worker1 Running Running 44 seconds ago
在集群中,如果你不希望服务运行在manager节点上,并且只想将其用于管理节点,你可以将manager节点标记为空闲。
yaoweibin@manager1:~$ docker node update --availability drain manager1
manager1
检查manager节点的可用性。
yaoweibin@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6
utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6
xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
你会看到服务不再在manager节点上运行,而是分散在集群中的worker节点上。
那就是关于Docker Swarm以及如何在Docker Swarm模式下使用orchestrate containers的所有内容。在非生产环境中尝试这些操作,以了解其工作原理。