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的所有内容。在非生产环境中尝试这些操作,以了解其工作原理。

类似文章