本文概述
有关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模式下编排容器的全部内容。在你的非生产环境中尝试这些方法, 以了解其工作原理。
评论前必须登录!
注册