个性化阅读
专注于IT技术分析

Docker Swarm用于容器编排

本文概述

有关Docker Swarm的所有信息, 以及它如何管理和协调集群中的所有容器。

什么是Docker Swarm?

Docker swarm是一种处理Docker Engine集群的模式, 因此命名为Swarm。 Docker主机集群以管理员和工作人员组成的集群模式运行。参与集群的docker-engine实例称为节点。

生产级集群部署由分布在多个服务器上的Docker节点组成。

为什么要使用它? –容器编排

在生产环境中工作时, 数百个Docker容器将在其中运行多个应用程序。对于所有DevOps工程师来说, 管理所有这些容器可能是一个很大的痛苦。这就是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模式, 请在manager节点上运行以下命令。标志–advertise-addr用于将自身通告给可以加入集群的节点。

[email protected]:~$ 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节点上运行令牌。

[email protected]:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

This node joined a swarm as a worker.

在worker2节点上运行令牌。

[email protected]:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377

This node joined a swarm as a worker.

现在, 在管理器节点上, 你可以检查集群中正在运行的节点。

[email protected]:~$ 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教程中使用的geekflare_mongodb Docker映像。

docker build -t geekflare_mongodb .

通过创建群集服务来运行MongoDB docker映像的容器。 27017是MongoDB暴露的端口号。

[email protected]:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb

image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image.

kok58xa4zi05psh3uy6s5x9e6

overall progress: 1 out of 1 tasks

1/1: running

verify: Service converged

检查docker swarm服务是否已启动。复制MODE表示容器已在集群中的所有节点上复制, REPLICAS 1/1表示当前仅运行一个群集服务。

[email protected]:~$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS

kok58xa4zi05        Mongo-Container     replicated          1/1                 geekflare_mongodb:latest   *:27017->27017/tcp

让我们检查单个服务正在集群中的哪个节点上运行。它在manager1节点上运行。

[email protected]:~$ docker service ps Mongo-Container

ID                  NAME                IMAGE                      NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS

jgqjo92rbq23        Mongo-Container.1   geekflare_mongodb:latest   manager1            Running             Running about a minute ago

运行docker ps命令以获取有关正在运行此swarm服务的容器的更多详细信息。

[email protected]:~$ docker ps

CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS               NAMES

05d77e7b4850        geekflare_mongodb:latest   "/bin/sh -c usr/bin/…"   2 minutes ago       Up 2 minutes        27017/tcp           Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx

你也可以在”全局”模式下而不是默认的”复制”模式下运行群集服务。全局模式在集群的所有节点上运行swarm服务的一项任务。

在以全局模式运行服务之前, 让我删除现有的正在运行的容器。

[email protected]:~$ docker service rm Mongo-Container

Mongo-Container

使用–mode标志以全局模式启动docker容器内的swarm服务。

[email protected]:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb

image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image.

mfw8dp0zylffppkllkcjl8391

overall progress: 3 out of 3 tasks

utdr3dnngqf1: running

lssbyfzuiuh3: running

xs6jqp95lw4c: running

verify: Service converged

检查群集服务是否以全局模式启动。由于集群中正在运行三个节点(1个管理器, 2个工作器), 因此副本数为3。

[email protected]:~$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS

mfw8dp0zylff        Mongo-Container     global              3/3                 geekflare_mongodb:latest   *:27017->27017/tcp

3个服务现在正在3个节点上运行, 请通过运行以下命令进行检查。

[email protected]:~$ docker service ps Mongo-Container

ID                  NAME                                        IMAGE                      NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS

zj2blvptkvj6        Mongo-Container.xs6jqp95lw4cml1i1npygt3cg   geekflare_mongodb:latest   worker2             Running             Running about a minute ago

3eaweijbbutf        Mongo-Container.utdr3dnngqf1oy1spupy1qlhu   geekflare_mongodb:latest   worker1             Running             Running about a minute ago

yejg1o2oyab7        Mongo-Container.lssbyfzuiuh3sye1on63eyixf   geekflare_mongodb:latest   manager1            Running             Running about a minute ago

接下来, 让我展示如何定义副本数量。在此之前, 我将删除当前正在运行的容器。

[email protected]:~$ docker service rm Mongo-Container

Mongo-Container

在命令中使用–replicas标志, 并提及所需的swarm服务副本数。例如, 我想拥有swarm服务的两个副本:

[email protected]:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb

image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_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

检查当前正在运行的群服务。你可以看到一个副本在manager1节点上运行, 而另一个副本在worker1节点上运行。

[email protected]:~$ docker service ps Mongo-Container

ID                  NAME                IMAGE                      NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS

xukodj69h79q        Mongo-Container.1   geekflare_mongodb:latest   worker1             Running             Running 9 seconds ago

e66zllm0foc8        Mongo-Container.2   geekflare_mongodb:latest   manager1            Running             Running 9 seconds ago

转到worker1节点, 检查docker容器是否正在运行swarm服务。

[email protected]:~$ docker ps

CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS               NAMES

5042b7f161cb        geekflare_mongodb:latest   "/bin/sh -c usr/bin/…"   About a minute ago   Up About a minute   27017/tcp           Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv

要停止此容器, 请运行以下命令。

[email protected]:~$ docker stop 5042b7f161cb

5042b7f161cb

现在, 从manager1节点, 如果你检查所有节点都在运行服务, 你将看到它在manager1节点和worker2节点上运行。 worker1节点的”当前状态”为”关闭”(因为我们停止了运行该服务的容器)。但是由于必须运行此服务的两个副本, 因此在工作程序2上启动了另一个服务。

这就是使用docker swarm实现高可用性的方式。

[email protected]:~$ docker service ps Mongo-Container

ID                  NAME                    IMAGE                      NODE                DESIRED STATE       CURRENT STATE            ERROR                         PORTS

cd2rlv90umej        Mongo-Container.1       geekflare_mongodb:latest   worker2             Running             Running 30 seconds ago

xukodj69h79q         \_ Mongo-Container.1   geekflare_mongodb:latest   worker1             Shutdown            Failed 38 seconds ago    "task: non-zero exit (137)"

e66zllm0foc8        Mongo-Container.2       geekflare_mongodb:latest   manager1            Running             Running 3 minutes ago

放大或缩小Docker容器非常容易。下面的命令会将mongo容器放大到5。

[email protected]:~$ docker service scale Mongo-Container=5

Mongo-Container scaled to 5

overall progress: 5 out of 5 tasks

1/5: running

2/5: running

3/5: running

4/5: running

5/5: running

verify: Service converged

检查mongo容器现在正在运行多少个副本, 它必须是5。

[email protected]:~$ docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                      PORTS

4yfl41n7sfak        Mongo-Container     replicated          5/5                 geekflare_mongodb:latest   *:27017->27017/tcp

检查这5个副本在群集中的何处运行。 1个副本在manager1节点上运行, 两个副本分别在两个工作节点上运行。

[email protected]:~$ docker service ps Mongo-Container

ID                  NAME                    IMAGE                      NODE                DESIRED STATE       CURRENT STATE            ERROR                         PORTS

cd2rlv90umej        Mongo-Container.1       geekflare_mongodb:latest   worker2             Running             Running 2 minutes ago

xukodj69h79q         \_ Mongo-Container.1   geekflare_mongodb:latest   worker1             Shutdown            Failed 2 minutes ago     "task: non-zero exit (137)"

e66zllm0foc8        Mongo-Container.2       geekflare_mongodb:latest   manager1            Running             Running 5 minutes ago

qmp0gqr6ilxi        Mongo-Container.3       geekflare_mongodb:latest   worker2             Running             Running 47 seconds ago

9ddrf4tsvnu2        Mongo-Container.4       geekflare_mongodb:latest   worker1             Running             Running 46 seconds ago

e9dhoud30nlk        Mongo-Container.5       geekflare_mongodb:latest   worker1             Running             Running 44 seconds ago

在你的集群中, 如果你不希望服务在管理器节点上运行, 并且只希望将其保留用于管理节点, 则可以排干管理器节点。

[email protected]:~$ docker node update --availability drain manager1

manager1

检查管理器节点的可用性。

[email protected]:~$ 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

你将看到服务不再在管理器节点上运行;它们分布在群集中的工作节点上。

[email protected]:~$ docker service ps Mongo-Container

ID                  NAME                    IMAGE                      NODE                DESIRED STATE       CURRENT STATE             ERROR                         PORTS

cd2rlv90umej        Mongo-Container.1       geekflare_mongodb:latest   worker2             Running             Running 5 minutes ago

xukodj69h79q         \_ Mongo-Container.1   geekflare_mongodb:latest   worker1             Shutdown            Failed 5 minutes ago      "task: non-zero exit (137)"

qo405dheuutj        Mongo-Container.2       geekflare_mongodb:latest   worker1             Running             Running 41 seconds ago

e66zllm0foc8         \_ Mongo-Container.2   geekflare_mongodb:latest   manager1            Shutdown            Shutdown 44 seconds ago

qmp0gqr6ilxi        Mongo-Container.3       geekflare_mongodb:latest   worker2             Running             Running 3 minutes ago

9ddrf4tsvnu2        Mongo-Container.4       geekflare_mongodb:latest   worker1             Running             Running 3 minutes ago

e9dhoud30nlk        Mongo-Container.5       geekflare_mongodb:latest   worker1             Running             Running 3 minutes ago

这就是有关Docker Swarm以及如何在docker swarm模式下编排容器的全部内容。在你的非生产环境中尝试这些方法, 以了解其工作原理。

赞(1)
未经允许不得转载:srcmini » Docker Swarm用于容器编排

评论 抢沙发

评论前必须登录!