前言
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来删除