集群构建
不包含在任何 Swarm 中的 Docker 节点,称为运行于单引擎(Single-Engine)模式。一旦被加入 Swarm 集群,则切换为 Swarm 模式。第一步我们要做的就是初始化 Swarm。
初始化swarm集群
将本机作为manager节点
docker swarm init --advertise-addr 192.168.xxx.xxx
docker warm init
会通知 Docker 来初始化一个新的 Swarm,并将自身设置为第一个管理节点,同时也会使该节点开Swarm 模式。
--advertise-addr
参数配置当前管理节点的发布地址,其他节点必须能连接这个地址。在机器只有一个ip的情况下可以省略,如果由多个ip则必须手动指定。
可以通过以下命令查看集群和节点的状态
docker info
节点加入集群
其它节点可以以工作节点或管理节点的方式加入集群,执行的命令,可以在管理节点运行以下命令查看:
docker swarm join-token worker # 查看工作节点加入集群的指令和令牌
docker swarm join-token manager # 查看管理节点加入集群的指令和令牌
swarm集群管理基本命令
docker swarm
- docker swarm init
初始化集群 - docker swarm join-token worker|manager
管理令牌,可查看刷新令牌,只能在管理节点执行 - docker swarm join HOST:PORT
将一个节点机器人加入集群 - docker swarm update
更新集群状态,只能在管理节点执行- -autolock:修改管理节点的自动锁定功能配置,可用值有: true、false
- -cert-expiry:验证节点之间的通讯令牌的间隔,默认时2160小时,可用单位: ns|us|ms|s|m|h
- -dispatcher-heartbeat:心跳包间隔时长,默认5秒,可用单位:ns|us|ms|s|m|h
- -task-history-limit:任务历史记录保留限制
- docker swarm leave
脱离集群,docker swarm leave -f 强制离开 - docker swarm unlock-key
管理解锁码,可查看,刷新解锁码- -q:只输出解锁码
- -rotate:刷新解锁码
- docker swarm unlock
解锁一个管理节点
docker node
docker node常用命令如下
- docker node ls
列出集群中的节点,只能在管理节点操作 - docker node inspect <节点名>
查看节点的详细信息,只能在管理节点操作 - docker node demote 节点名
对节点进行降级 - docker node promote 节点名
对节点进行升级 - docker node ps [OPTIONS] [NODE…]
查看节点上正在执行的任务,可以通过节点名称查看某一节点的任务,默认是当前节点,只能在管理节点操作 - docker node rm [OPTIONS] NODE [NODE…]
通过节点名称移除节点,只能在管理节点操作,可以一次移除多个节点,一个节点使用docker swarm leave命令脱离集群之后还可以用docker node ls命令看到,使用docker node rm移除的节点将彻底不再集群中
部署服务
基本部署操作
docker swarm 搭建好集群,我们目的在集群中部署应用。swarm集群部署应用最基本的命令是docker service,它的使用方式类似 docker container,也适用于部署单个应用,都不能进行编排(后续引入docker stack类似集群下的docker compose),只不过一个用于单机,一个用于集群
下面以在swarm集群中部署nginx为例:
默认的情况下,管理节点也是一个工作节点,服务也会部署在了管理节点上,如果我们不希望服务部署在管理节点上的话,可以将管理节点设置为darin状态。
执行以下命令将管理节点设置威darin
docker node update --availability drain server
我这里因为只有一台机子,因此我就不设置为drain了
之后执行以下命令部署nginx应用:
docker service create --name nginx-test --replicas 2 -p 8080:80 nginx:1.21.6
swarm集群中进行应用部署使用docker swarm create命令,该命令与熟悉的 docker container run 命令的许多参数是相同的,上面的命令中声明基于nginx镜像部署应用,服务名称为nginx-test,将容器内部的80端口映射到集群网络的8080端口,–replicas 2在集群节点之中保持2个服务副本(即两个容器)。
运行以下命令查看服务以及查看服务详情
docker service ls
docker service ps nginx-test
我们创建的所有服务都会被 Swarm 持续监控,Swarm 会在后台进行轮训检查(Reconciliation Loop),来持续比较服务的实际状态和期望状态是否一致。如果一致,则无须任何额外操作;如果不一致,Swarm 会使其一致。换句话说,Swarm 会一直确保实际状态能够满足期望状态的要求。
例如这里的两个nginx的容器其中一个宕机了,swarm会重新启动一个副本,让正常运行的nginx容器始终保持在两个,这使得服务在面对节点宕机等问题时具有自愈能力。
这里如果有多台机器加入了集群,每个机器的ip:8080都能访问到nginx服务
因为默认情况下swarm集群采用ingress模式发布端口,通过路由网格模式让我们发布的端口在集群每一个节点上口都可以访问,再通过内部的负载均衡自动转发到实际的运行的容器之中。具体可参考这篇文章
我们的应用在实际的应用中可能会根据访问量进行扩容、缩容,即根据实际情况调整容器启动的数量,通过docker service scale命令可以很方便得进行操作。例如下面将nginx容器扩展到4个
docker service scale nginx-test=4
有些时候我们会对服务的配置进行修改,例如增加一个映射端口:
docker service update --publish-add 8081:80 nginx-test