Docker Swarm 日常运维命令笔记
之前介绍了Docker管理工具-Swarm部署记录,这里简单总结下Docker Swarm的日常维护命令,以作为平时运维笔记.
Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:
Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。Swarm架构图可以让大家对Swarm有一个初步的认识,比如Swarm的具体工作流程:Docker Client发送请求给Swarm;Swarm处理请求并发送至相应的Docker Node;Docker Node执行相应的操作并返回响应。除此之外,Swarm的工作原理依然还不够明了。深入理解Swarm的工作原理,可以先从Swarm提供的命令入手。Swarm支持的命令主要有4个:swarm create、swarm manage、swarm join、swarm list。当然还有一个swarm help命令,该命令用于指导大家如何正确使用swarm命令.
swarm create
Swarm中swarm
create命令用于创建一个集群标志,用于Swarm管理Docker集群时,Docker
Node的节点发现功能。发起该命令之后,Swarm会前往Docker
Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群。
swarm manage
Swarm中swarm
manage是最为重要的管理命令。一旦swarm
manage命令在Swarm节点上被触发,则说明用户需要swarm开始管理Docker集群。从运行流程的角度来讲,swarm经历的阶段主要有两点:启动swarm、接收并处理Docker集群管理请求。
Swarm启动的过程包含三个步骤:
► 发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;
► 初始化内部调度(scheduler)模块;
► 创建并启动API监听服务模块;
第一个步骤,Swarm发现Docker集群中的节点。发现(discovery)是Swarm中用于维护Docker集群状态的机制。既然涉及到发现(discovery),那在这之前必须先有注册(register)。Swarm中有专门负责发现(discovery)的模块,而关于注册(register)部分,不同的discovery模式下,注册(register)也会有不同的形式。
目前,Swarm中提供了5种不同的发现(discovery)机制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery。
第二个步骤,Swarm内部的调度(scheduler)模块被初始化。swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,一旦Swarm接收到具体的Docker管理请求,Swarm需要对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选(filter)决策到底哪些Docker Node满足要求,并通过一定的策略(strategy)将请求转发至具体的一个Docker Node。
第三个步骤,Swarm创建并初始化API监听服务模块。从功能的角度来讲,可以将该模块抽象为Swarm Server。需要说明的是:虽然Swarm Server完全兼容Docker的API,但是有不少Docker的命令目前是不支持的,毕竟管理Docker集群与管理单独的Docker会有一些区别。当Swarm Server被初始化并完成监听之后,用户即可以通过Docker Client向Swarm发送Docker集群的管理请求。
Swarm的swarm manage接收并处理Docker集群的管理请求,即是Swarm内部多个模块协同合作的结果。请求入口为Swarm Server,处理引擎为Scheduler,节点信息依靠Disocovery。
swarm join
Swarm的swarm
join命令用于将Docker Node添加至Swarm管理的Docker集群中。从这点也可以看出swarm
join命令的执行位于Docker Node,因此在Docker Node上运行该命令,首先需要在Docker
Node上安装Swarm,由于该Swarm只会执行swarm join命令,故可以将其当成Docker Node上用于注册的agent模块。
功能而言,swarm join可以认为是完成Docker Node在Swarm节点处的注册(register)工作,以便Swarm在执行swarm manage时可以发现该Docker Node。然而,上文提及的5种discovery模式中,并非每种模式都支持swarm join命令。不支持的discovery的模式有Node Discovery与File Discovery。
Docker Node上swarm join执行之后,标志着Docker Node向Swarm注册,请求加入Swarm管理的Docker集群中。Swarm通过注册信息,发现Docker Node,并获取Docker Node的状态以及具体信息,以便处理Docker请求时作为调度依据。
swarm list
Swarm中的swarm
list命令用以列举Docker集群中的Docker Node。Docker Node的信息均来源于Swarm节点上注册的Docker
Node。而一个Docker Node在Swarm节点上注册,仅仅是注册了Docker Node的IP地址以及Docker监听的端口号。
使用swarm list命令时,需要指定discovery的类型,类型包括:token、etcd、file、zk以及。而swarm list并未罗列Docker集群的动态信息,比如Docker Node真实的运行状态,或者Docker Node在Docker集群中扮演的角色信息。
==========================下面简单梳理了一些日常运维中用到的Swarm相关命令=============================
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
1) 初始化swarm manager并制定网卡地址 # docker swarm init --advertise-addr 182.48.115.237 2) 删除集群,强制退出需要加–force (针对manager节点). 到各个节点上执行退出集群的命令 # docker node rm swarm-node1 # docker swarm leave --force //manager节点退出集群,需要加--force 3) 查看swarm worker的连接令牌 # docker swarm join-token worker 例如: [root@manager-node ~] # docker swarm init --advertise-addr 182.48.115.237 Swarm initialized: current node (1gi8utvhu4rxy8oxar2g7h6gr) is now a manager. To add a worker to this swarm, run the following command : docker swarm join \ --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej \ 182.48.115.237:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 4) 加入docker swarm集群,作为worker节点 利用上面执行结果中的命令放在其他节点上执行,则该节点加入到swarm集群中作为worker节点 [root@node1 ~] #
docker swarm join --token
SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej
182.48.115.237:2377 This node joined a swarm as a worker. 5) 查看swarm manager的连接令牌 # docker swarm join-token manager 例如: [root@swarm-manager-node ~] # docker swarm join-token manager To add a manager to this swarm, run the following command : docker swarm join \ --token SWMTKN-1-075gaitl18z3v0p37sx7i5cmvzjjur0fbuixzp4tun0xh0cikd-0y8ttp5h0g54j10amn670w6su \ 172.16.60.220:2377 6) 加入docker swarm集群,作为manager节点 利用上面执行结果中的命令放在其他节点上执行,则该节点加入到swarm集群中作为manager管理节点,状态为reachable. [root@swarm-manager-node2 ~] #
docker swarm join --token
SWMTKN-1-075gaitl18z3v0p37sx7i5cmvzjjur0fbuixzp4tun0xh0cikd-0y8ttp5h0g54j10amn670w6su
172.16.60.220:2377 This node joined a swarm as a manager. [root@swarm-manager-node2 ~] # docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS rpbey5t1v14olke2mgtc430de swarm-node2 Ready Active u6gkfr4j19gq16ddyb76fxsl3 swarm-node1 Ready Active vwbb0imil512a1le04bnkx98u * swarm-manager-node Ready Active Leader ybjvaszg838upeqvvzswhq0tt swarm-manager-node2 Ready Active Reachable 如果之前的leader状态的manager管理节点挂了后(假如systemctl stop docker, 然后再systemctl start docker), 则新加入的manager节点状态由reachable变为leader, 之前的manager节点状态为unreachable. [root@swarm-manager-node2 ~] # docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS rpbey5t1v14olke2mgtc430de swarm-node2 Ready Active u6gkfr4j19gq16ddyb76fxsl3 swarm-node1 Ready Active vwbb0imil512a1le04bnkx98u * swarm-manager-node Ready Active Unreachable ybjvaszg838upeqvvzswhq0tt swarm-manager-node2 Ready Active Leader 7) 使旧令牌无效并生成新令牌 # docker swarm join-token --rotate 8) 查看集群中的节点 # docker node ls 9) 查看集群中节点信息 # docker node inspect swarm-node1 --pretty 10) 调度程序可以将任务分配给节点 # docker node update --availability active swarm-node1 11) 调度程序不向节点分配新任务,但是现有任务仍然保持运行 # docker node update --availability pause swarm-node1 12) 调度程序不会将新任务分配给节点。调度程序关闭任何现有任务并在可用节点上安排它们. 也就是线下节点,不参与任务分配. # docker node update --availability drain swarm-node1 13) 添加节点标签 # docker node update --label-add label1 --label-add bar=label2 swarm-node1 14) 删除节点标签 # docker node update --label-rm label1 swarm-node1 15) 将worker节点升级为manager节点 # docker node promote swarm-node1 16) 将manager节点降级为worker节点 # docker node demote swarm-manager-node 17) 查看服务列表 # docker service ls 18) 查看服务的具体信息 # docker service ps my-test 19) 创建一个不定义name,不定义replicas的服务. (如下的nginx是docker的nginx镜像名称,不是服务名称) # docker service create nginx 20) 创建一个指定name的服务 # ocker service create --name my-nginx nginx 21) 创建一个指定name、run cmd的服务 # docker service create --name my-nginx nginx ping www.baidu.com 22) 创建一个指定name、version、run cmd的服务 # docker service create --name my-redis redis:3.0.6 # docker service create --name my-nginx nginx:1.8 /bin/bash 23) 创建一个指定name、port、replicas的服务 # docker service create --name my-nginx --replicas 3 -p 80:80 nginx 24) 为指定的服务更新一个端口 # docker service update --publish-add 80:80 my-nginx 25) 为指定的服务删除一个端口 # docker service update --publish-rm 80:80 my-nginx 26) 将redis:3.0.6更新至redis:3.0.7 # docker service update --image redis:3.0.7 redis 27) 配置运行环境,指定工作目录及环境变量 # docker service create --name my-nginx --env MYVAR=myvalue --workdir /data/www --user my_user nginx ping www.baidu.com 28) 创建一个my-nginx的服务 # docker service create --name my-nginx nginx ping www.baidu.com 29) 更新my-nginx服务的运行命令 # docker service update --args "ping www.baidu.com" my-nginx 30) 删除一个服务 # docker service rm my-nginx 31) 在每个群组节点上运行web服务 # docker service create --name tomcat --mode global --publish mode=host,target=8080,published=8080 tomcat:latest 32) 创建一个overlay网络 # docker network create --driver overlay my-network # docker network create --driver overlay --subnet 10.10.10.0/24 --gateway 10.10.10.1 haha-network 33) 创建服务并将网络添加至该服务 # docker service create --name my-test --replicas 3 --network my-network redis 34) 删除群组网络 # docker service update --network-rm my-network my-test 35) 更新群组网络 # docker service update --network-add haha-network my-test 36) 创建群组并配置cpu和内存 # docker service create --name my_nginx --reserve-cpu 2 --reserve-memory 512m --replicas 3 nginx 37) 更改所分配的cpu和内存 # docker service update --reserve-cpu 1 --reserve-memory 256m my_nginx 38) 创建服务时自定义的几个参数 指定每次更新的容器数量 --update-parallelism 指定容器更新的间隔 --update-delay 定义容器启动后监控失败的持续时间 --update-monitor 定义容器失败的百分比 --update-max-failure-ratio 定义容器启动失败之后所执行的动作 --update-failure-action 比如:创建一个服务并运行3个副本,同步延迟10秒,10%任务失败则暂停 #
docker service create --name mysql_5_6_36 --replicas 3 --update-delay
10s --update-parallelism 1 --update-monitor 30s --update-failure-action
pause --update-max-failure-ratio 0.1 -e MYSQL_ROOT_PASSWORD=123456
mysql:5.6.36 39) 回滚至之前版本 # docker service update --rollback mysql 自动回滚 如果服务部署失败,则每次回滚2个任务,监控20秒,回滚可接受失败率20% #
docker service create --name redis --replicas 6 --rollback-parallelism 2
--rollback-monitor 20s --rollback-max-failure-ratio .2 redis:latest 40) 创建服务并将目录挂在至container中 #
docker service create --name mysql --publish 3306:3306 --mount
type=bind,src=/data/mysql,dst=/var/lib/mysql --replicas 3 -e
MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36 需要注意使用bind绑定宿主机目录会带来的风险 - 绑定的主机路径必须存在于每个集群节点上,否则会有问题; - 调度程序可能会在任何时候重新安排运行服务容器,如果目标节点主机变得不健康或无法访问; - 主机绑定数据不可移植,当你绑定安装时,不能保证你的应用程序开发方式与生产中的运行方式相同; 41) 添加swarm配置 # echo "this is a mysql config" | docker config create mysql - 42) 查看配置 # docker config ls 查看配置详细信息 # docker config inspect mysql 43) 删除配置 # docker config rm mysql 44) 添加配置 # docker service update --config-add mysql mysql 45) 删除配置 # docker service update --config-rm mysql mysql 46) 添加配置 # docker config create kevinpage index.html 47) 启动容器的同时添加配置(target如果报错,就使用dst或destination) #
docker service create --name nginx --publish 80:80 --replicas 3
--config src=kevinpage,target=/usr/share/nginx/html/index.html nginx |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2017-03-15 weblogic负载分发
2017-03-15 windows安装ZIP压缩版的Weblogic Server
2017-03-15 weblogic的集群与配置
2017-03-15 weblogic集群的资料
2017-03-15 深信服:Weblogic集群负载均衡技术解决方案