文章目录
1.docker swarm 常用命令
[root@iZuf6gegyofu0xfk0fx5xwZ ~]# docker swarm -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
命令查询官网地址:https://docs.docker.com/engine/reference/commandline/docker/
命令
|
说明
|
---|---|
docker swarm init --advertise-addr 192.168.10.117 | 初始化swarm manager并绑定网卡地址 |
docker swarm join-token manager | 要获取新增管理节点 |
docker swarm join-token worker | 要获取新增工作节点 |
docker swarm join-token --rotate [manager|worker] | 使旧令牌无效并生成新令牌 |
docker swarm join-token -q [manager|worker] | 仅打印 worker/manager 的令牌 |
docker swarm init --force-new-cluster | 强制从当前状态创建一个新集群(去除本地之外的所有管理器身份) |
docker swarm leave --force | 离开当前集群,如果是 manager 则需要加 --force |
docker node rm -f [ID] | 强制删除集群,状态为 down 则可以不用 -f ,状态为 Active 则可以强制删除 |
docker node promote 主机名 | 将 worker 角色升级为 manager (在 manager 节点执行) |
docker node demote 主机名 | 将manager角色降级为worker (在 manager 节点执行) |
docker node update --availability [“active”|“pause”|“drain”] node | 更新节点的可用性(有效/暂停/耗尽) |
2. docker swarm 官网地址
3.初始化节点
3.1 初始化节点
docker swarm init --advertise-addr
# 注意:如果使用 Docker Desktop for Mac 或 Docker Desktop for Windows 来测试单节点 swarm,只需docker swarm init不带参数运行即可。--advertise-addr在这种情况下无需指定。
[root@iZuf6gegyofu0xfk0fx5xxZ ~]# docker swarm init --advertise-addr 172.29.99.157
Swarm initialized: current node (trlyrq62kqpri23442s1zoccg) is now a manager.
# 说明:现在这个节点已经添加进来为一个 manager(管理者)
To add a worker to this swarm, run the following command:
# 说明:如果想将其他的节点加入到这个 swarm 中,可以执行下面的命令
docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-algun18eflz9tq7g47yso55vd 172.29.99.157:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 说明:如果想要添加一个 manager 或者 worker 节点,也可以使用 'docker swarm join-token manager[worker]' 命令
3.2 生成 manager 或者 worker 令牌
# 生成 manager
docker swarm join-token manager
[root@iZuf6gegyofu0xfk0fx5xxZ ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-bud3cv6ae72vraxkw11c5773r 172.29.99.157:2377
# 生成 worker
docker swarm join-token worker
[root@iZuf6gegyofu0xfk0fx5xxZ ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-algun18eflz9tq7g47yso55vd 172.29.99.157:2377
3.3 查看 swarm 信息
docker info
[root@iZuf6gegyofu0xfk0fx5xxZ ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.1-docker)
scan: Docker Scan (Docker Inc., v0.17.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.14
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: trlyrq62kqpri23442s1zoccg
Is Manager: true
ClusterID: 7nn98dyh7vwb2nmz88qv5cvcq
Managers: 3
Nodes: 5
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 172.29.99.157
Manager Addresses:
172.29.99.157:2377
172.29.99.159:2377
172.29.99.160:2377
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 3df54a852345ae127d1fa3092b95168e4a88e2f8
runc version: v1.0.3-0-gf46b6ba
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1062.18.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.715GiB
Name: iZuf6gegyofu0xfk0fx5xxZ
ID: O5SO:R6J3:V5YF:CWFD:CAL7:5JQI:ZX5H:3PBD:72BU:W5EK:RHBR:BMOU
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://2oka4vlk.mirror.aliyuncs.com/
Live Restore Enabled: false
3.4 查看节点信息
docker node ls
# 注意:在 worker 节点时不能查看状态的,只能再 manager 节点查看
4.添加节点
- 将初始化得到的命令在其他节点执行,或者使用
docker swarm join-token manager[worker]
得到的命令
# 上面初始化节点时得到的命令,直接在其他节点中执行即可将节点加入当前的 swarm
[root@iZuf6gegyofu0xfk0fx5xuZ ~]# docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-algun18eflz9tq7g47yso55vd 172.29.99.157:2377
# 以一个 worker 节点加入
This node joined a swarm as a worker.
[root@iZuf6gegyofu0xfk0fx5xvZ ~]# docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-bud3cv6ae72vraxkw11c5773r 172.29.99.157:2377
# 这是一个 manager 节点
This node joined a swarm as a manager.
[root@iZuf6gegyofu0xfk0fx5xwZ ~]# docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-algun18eflz9tq7g47yso55vd 172.29.99.157:2377
# 以一个 worker 节点加入
This node joined a swarm as a worker.
5.测试集群使用
-
测试 swarm 集群在双主双从的状态下,其中一台 manager 停机后能否继续工作
-
另外一台 manager 提示没有 leader,即不可以使用
-
增加一台 manager 节点
# 将一个 worker 节点设置问 manager 节点,首先将当前节点设置为离开状态
docker swarm leave
# 使用 dockr swarm join-token manager 生成的 manager 令牌增加 manager 节点
docker swarm join --token SWMTKN-1-3op7vtz76w1rptvh9ed3rq1591157b78go2psuee4x7ml1kf6a-bud3cv6ae72vraxkw11c5773r 172.29.99.157:2377
- 再次测试关闭一台 docker 之后,查看集群是否能使用
docker node ls
Unreachable # 不可达
# 在关闭一台 manager 节点后,剩余两台仍然可以正常使用
6. Docker Swarm Raft 协议
-
当 Docker Engine 以 swarm 模式运行时,管理器节点实现 Raft 共识算法来管理全局集群状态。
-
为什么原因Docker群模式是使用一个共识算法,以确保那些负责在集群中的管理和调度任务的所有经理节点,都存储相同一致的状态。
-
在整个集群中具有相同的一致状态意味着在发生故障时,任何 Manager 节点都可以接收任务并将服务恢复到稳定状态。例如,如果集群中负责调度任务的Leader Manager意外终止,任何其他 Manager 都可以接手调度的任务并重新平衡任务以匹配所需的状态。
-
使用共识算法在分布式系统中复制日志的系统确实需要特别小心。它们通过要求大多数节点就值达成一致来确保集群状态在出现故障时保持一致。Raft 最多可以容忍(N-1)/2失败,并且需要大多数或法定人数的 (N/2)+1成员就提议给集群的值达成一致。这意味着在运行 Raft 的 5 个 Manager 的集群中,如果 3 个节点不可用,系统将无法处理更多请求以安排额外的任务。现有任务继续运行,但如果管理器集不健康,则调度程序无法重新平衡任务以应对故障。
-
群体模式下共识算法的实现意味着它具有分布式系统固有的特性:
-
容错系统中的值达成一致。
-
通过领导人选举过程相互排斥
-
集群成员管理
-
全局一致的对象排序和 CAS(比较和交换)原语