Docker Swarm基础

164 阅读4分钟

前言

Docker Swarm 是 Docker 官方项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

docker swarm相关命令

docker swarm
docker node
docker service
docker stack
docker secret

swarm中一台主机就是一个节点(node),节点分为管理(manager)和工作(worker)节点。

管理节点用于swarm集群的管理。一个swarm集群可以有多个管理节点,但只有一个管理节点可以成为leader,leader通过raft协议实现。

管理节点有内置Raft数据库,他们用来存放配置等数据。而且他们之间的通信都是加密的。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。也可以通过让服务只运行在管理节点上,管理节点和工作节点只是它们的权限不同,工作节点就没有管理节点那么多权限,比如在工作节点上不能查看集群中的容器。

有了 swarm 我们就不用自己一个个的创建容器了,比如我们有 3 个主机,我们告诉 swarm 我们要创建 5 个 nginx 容器,swarm 会自己帮我们部署到不同主机上,比如那个主机部署一个那个部署两个。

启用Swarm

docker swarm init
# 我们执行这个命令,来启用 swarm,我们当前主机作为管理节点
# 它还创建了 swarm 根证书,还创建了 join token,用来让其他节点加入这个 Swarm
# 还创建了 raft 数据库。

添加节点

我们可以直接复制上面那条输出的命令,让其他节点作为 worker 加入这个 swarm

后续如果需要添加节点,找不到上述token,可以执行如下命令获取

加入为worker:

docker swarm join-token worker

加入为manager:

docker swarm join-token manager

worker与manager节点

一个swarm集群环境中,需要保证集群中有奇数个manager节点,如果涉及到分部署部署,集群中以存在个奇数个节点,需要把分部署部署(例如数据库,weboffice,中间件等)这些节点加入为worker节点,一个集群中,只有manager节点可以执行docker node ls与docker stack deploy等相关命令,在主节点使用docker-compose文件启动服务即可,服务会根据设置的节点标签,运行至相对应的节点上。

执行docker node ls

leader:当前集群的主节点

reachable:备份主节点,当前节点宕机后,会被选举为主节点

MANAGER STATUS为空的为worker节点,worker节点执行docker node ls与docker stack deploy等命令会报错

添加/删除 节点标签

设置好所有的子节点之后,我们需要进行设置tag标签用于后面部署服务,进行标识告知哪些服务部署哪些节点,这里我们使用命令

docker node update --label-add进行添加标签:

docker node update --label-add nodetype=InDrive node1

nodetype为标签的key,InDrive为标签的value,标签为key=value的格式

添加后可以通过docker node update --label-rm进行删除标签,删除标签时,只需指定标签的key即可

docker node update --label-rm nodetype node1

标签的作用

节点标签用于限定服务运行与某个特定的服务器节点

查看节点标签:

docker node ls #查看节点id   
docker node inspect pgw7zjir9dh98665lmt1hksrc --pretty | head     #标红处替换为节点id

 docker-compose中指定服务运行于符合标签要求的节点,可通过修改标签,来实现分布式部署。

部署服务

所有节点添加完成之后就可以开始部署服务了,可以通过命令进行部署

docker service create --replicas 1 --name nginx-test  nginx:latest
docker service create用来创建服务
--name表明服务名字是nginx-test
--replicas 表示期望1个服务实例
nginx:latest表示运行镜像

更改swarm节点的角色

更改manager节点为worker:

docker node update --role=worker 节点ID

更改worker节点为manager:

在其他manager节点执行如下命令:

docker node update --role=manager 节点ID

swarm集群中删除节点

登录需要删除的节点,执行命令:

docker swarm leave --force

删除后,节点状态改变为Unreachable

或使用docker node rm 节点ID来删除