Docker Swarm用于容器编排

本文概述

  • 什么是Docker Swarm?
  • 为什么要使用它? –容器编排
  • 编排Docker容器
有关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.104worker1: 192.168.56.105worker2: 192.168.56.102

要在docker中初始化swarm模式, 请在manager节点上运行以下命令。标志– advertise-addr用于将自身通告给可以加入集群的节点。
[email  protected]:~$ docker swarm init --advertise-addr 192.168.56.104Swarm 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:2377To 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:2377This node joined a swarm as a worker.

在worker2节点上运行令牌。
[email  protected]:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377This node joined a swarm as a worker.

现在, 在管理器节点上, 你可以检查集群中正在运行的节点。
[email  protected]:~$ docker node lsID                                                      HOSTNAME                      STATUS                          AVAILABILITY              MANAGER STATUS          ENGINE VERSIONlssbyfzuiuh3sye1on63eyixf *    manager1                      Ready                            Active                          Leader                          18.09.6utdr3dnngqf1oy1spupy1qlhu        worker1                        Ready                            Active                                                                  18.09.6xs6jqp95lw4cml1i1npygt3cg        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_mongodbimage 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.kok58xa4zi05psh3uy6s5x9e6overall progress: 1 out of 1 tasks1/1: runningverify: Service converged

检查docker swarm服务是否已启动。复制MODE表示容器已在集群中的所有节点上复制, REPLICAS 1/1表示当前仅运行一个群集服务。
[email  protected]:~$ docker service lsID                                  NAME                              MODE                              REPLICAS                      IMAGE                                          PORTSkok58xa4zi05              Mongo-Container        replicated                  1/1                                geekflare_mongodb:latest    *:27017-> 27017/tcp

让我们检查单个服务正在集群中的哪个节点上运行。它在manager1节点上运行。
[email  protected]:~$ docker service ps Mongo-ContainerID                                  NAME                              IMAGE                                          NODE                              DESIRED STATE            CURRENT STATE                              ERROR                            PORTSjgqjo92rbq23              Mongo-Container.1    geekflare_mongodb:latest    manager1                      Running                        Running about a minute ago

运行docker ps命令以获取有关正在运行此swarm服务的容器的更多详细信息。
[email  protected]:~$ docker psCONTAINER ID              IMAGE                                          COMMAND                                  CREATED                        STATUS                          PORTS                            NAMES05d77e7b4850              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-ContainerMongo-Container

使用–mode标志以全局模式启动docker容器内的swarm服务。
[email  protected]:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodbimage 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.mfw8dp0zylffppkllkcjl8391overall progress: 3 out of 3 tasksutdr3dnngqf1: runninglssbyfzuiuh3: runningxs6jqp95lw4c: runningverify: Service converged

检查群集服务是否以全局模式启动。由于集群中正在运行三个节点(1个管理器, 2个工作器), 因此副本数为3。
[email  protected]:~$ docker service lsID                                  NAME                              MODE                              REPLICAS                      IMAGE                                          PORTSmfw8dp0zylff              Mongo-Container        global                          3/3                                geekflare_mongodb:latest    *:27017-> 27017/tcp

3个服务现在正在3个节点上运行, 请通过运行以下命令进行检查。
[email  protected]:~$ docker service ps Mongo-ContainerID                                  NAME                                                                              IMAGE                                          NODE                              DESIRED STATE            CURRENT STATE                              ERROR                            PORTSzj2blvptkvj6              Mongo-Container.xs6jqp95lw4cml1i1npygt3cg    geekflare_mongodb:latest    worker2                        Running                        Running about a minute ago3eaweijbbutf              Mongo-Container.utdr3dnngqf1oy1spupy1qlhu    geekflare_mongodb:latest    worker1                        Running                        Running about a minute agoyejg1o2oyab7              Mongo-Container.lssbyfzuiuh3sye1on63eyixf    geekflare_mongodb:latest    manager1                      Running                        Running about a minute ago

接下来, 让我展示如何定义副本数量。在此之前, 我将删除当前正在运行的容器。
[email  protected]:~$ docker service rm Mongo-ContainerMongo-Container

在命令中使用–replicas标志, 并提及所需的swarm服务副本数。例如, 我想拥有swarm服务的两个副本:
[email  protected]:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodbimage 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.4yfl41n7sfak65p6zqwwjq82coverall progress: 2 out of 2 tasks1/2: running2/2: runningverify: Service converged

检查当前正在运行的群服务。你可以看到一个副本在manager1节点上运行, 而另一个副本在worker1节点上运行。
[email  protected]:~$ docker service ps Mongo-ContainerID                                  NAME                              IMAGE                                          NODE                               DESIRED STATE            CURRENT STATE                    ERROR                            PORTSxukodj69h79q              Mongo-Container.1    geekflare_mongodb:latest    worker1                        Running                        Running 9 seconds agoe66zllm0foc8              Mongo-Container.2    geekflare_mongodb:latest    manager1                      Running                        Running 9 seconds ago

转到worker1节点, 检查docker容器是否正在运行swarm服务。
[email  protected]:~$ docker psCONTAINER ID              IMAGE                                          COMMAND                                  CREATED                          STATUS                          PORTS                            NAMES5042b7f161cb              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 5042b7f161cb5042b7f161cb

现在, 从manager1节点, 如果你检查所有节点都在运行服务, 你将看到它在manager1节点和worker2节点上运行。 worker1节点的” 当前状态” 为” 关闭” (因为我们停止了运行该服务的容器)。但是由于必须运行此服务的两个副本, 因此在工作程序2上启动了另一个服务。
这就是使用docker swarm实现高可用性的方式。
[email  protected]:~$ docker service ps Mongo-ContainerID                                  NAME                                      IMAGE                                          NODE                              DESIRED STATE            CURRENT STATE                      ERROR                                                PORTScd2rlv90umej              Mongo-Container.1            geekflare_mongodb:latest    worker2                        Running                        Running 30 seconds agoxukodj69h79q                \_ 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=5Mongo-Container scaled to 5overall progress: 5 out of 5 tasks1/5: running2/5: running3/5: running4/5: running5/5: runningverify: Service converged

检查mongo容器现在正在运行多少个副本, 它必须是5。
[email  protected]:~$ docker service lsID                                  NAME                              MODE                              REPLICAS                      IMAGE                                          PORTS4yfl41n7sfak              Mongo-Container        replicated                  5/5                                geekflare_mongodb:latest    *:27017-> 27017/tcp

检查这5个副本在群集中的何处运行。 1个副本在manager1节点上运行, 两个副本分别在两个工作节点上运行。
[email  protected]:~$ docker service ps Mongo-ContainerID                                  NAME                                      IMAGE                                          NODE                              DESIRED STATE            CURRENT STATE                      ERROR                                                PORTScd2rlv90umej              Mongo-Container.1            geekflare_mongodb:latest    worker2                        Running                        Running 2 minutes agoxukodj69h79q                \_ 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 agoqmp0gqr6ilxi              Mongo-Container.3            geekflare_mongodb:latest    worker2                        Running                        Running 47 seconds ago9ddrf4tsvnu2              Mongo-Container.4            geekflare_mongodb:latest    worker1                         Running                        Running 46 seconds agoe9dhoud30nlk              Mongo-Container.5            geekflare_mongodb:latest    worker1                        Running                        Running 44 seconds ago

在你的集群中, 如果你不希望服务在管理器节点上运行, 并且只希望将其保留用于管理节点, 则可以排干管理器节点。
[email  protected]:~$ docker node update --availability drain manager1manager1

检查管理器节点的可用性。
[email  protected]:~$ docker node lsID                                                      HOSTNAME                      STATUS                          AVAILABILITY              MANAGER STATUS          ENGINE VERSIONlssbyfzuiuh3sye1on63eyixf *    manager1                      Ready                            Drain                            Leader                          18.09.6utdr3dnngqf1oy1spupy1qlhu        worker1                        Ready                            Active                                                                  18.09.6xs6jqp95lw4cml1i1npygt3cg        worker2                        Ready                            Active                                                                  18.09.6

你将看到服务不再在管理器节点上运行;它们分布在群集中的工作节点上。
[email  protected]:~$ docker service ps Mongo-ContainerID                                  NAME                                      IMAGE                                          NODE                              DESIRED STATE            CURRENT STATE                        ERROR                                                PORTScd2rlv90umej              Mongo-Container.1            geekflare_mongodb:latest    worker2                        Running                        Running 5 minutes agoxukodj69h79q                \_ 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 agoe66zllm0foc8                \_ Mongo-Container.2    geekflare_mongodb:latest    manager1                      Shutdown                      Shutdown 44 seconds agoqmp0gqr6ilxi              Mongo-Container.3            geekflare_mongodb:latest    worker2                        Running                        Running 3 minutes ago9ddrf4tsvnu2              Mongo-Container.4            geekflare_mongodb:latest    worker1                        Running                        Running 3 minutes agoe9dhoud30nlk              Mongo-Container.5            geekflare_mongodb:latest    worker1                        Running                        Running 3 minutes ago

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

    推荐阅读