本文概述
- 什么是Docker Swarm?
- 为什么要使用它? –容器编排
- 编排Docker容器
什么是Docker Swarm?Docker swarm是一种处理Docker Engine集群的模式, 因此命名为Swarm。 Docker主机集群以管理员和工作人员组成的集群模式运行。参与集群的docker-engine实例称为节点。
生产级集群部署由分布在多个服务器上的Docker节点组成。
为什么要使用它? –容器编排在生产环境中工作时, 数百个Docker容器将在其中运行多个应用程序。对于所有DevOps工程师来说, 管理所有这些容器可能是一个很大的痛苦。这就是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模式下编排容器的全部内容。在你的非生产环境中尝试这些方法, 以了解其工作原理。
推荐阅读
- 如何使用带有apt-cacher-ng的Raspberry PI创建APT代理()
- 适用于Kubernetes的9大开源监控工具
- Docker架构及其初学者组件
- Docker与虚拟机–了解它们的差异
- 如何在Linux上设置本地DNS缓存服务器()
- Docker网络操作详解
- DevOps工具的终极清单
- make(g++:在CentOS/RHEL 7上找不到命令-已修复)
- 家庭记账本安卓版开发(第四天)