docker swarm mode 使用

docker swarm mode 需要docker版本高于1.12

###管理集群命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
docker swarm 
# 初始化一个swarm
- docker swarm init
# 指定初始化ip地址节点
- docker swarm init --advertise-addr 管理端IP地址
# 去除本地之外的所有管理器身份
- docker swarm init --force-new-cluster
# 将节点加入swarm集群,两种加入模式manager与worker
- docker swarm join
# 工作节点加入管理节点需要通过join-token认证
- docker swarm join-token
# 重新获取docker获取初始化命令
- docker swarm join-token worker
# 离开swarm
- docker swarm leave
# 对swarm集群更新配置
- docker swarm update

管理swarm节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker node
# 查看集群中的节点
- docker node ls
# 将manager角色降级为worker
- docker node demote 主机名
# 将worker角色升级为manager
- docker node promote 主机名
# 查看节点的详细信息,默认json格式
- docker node inspect 主机名
# 查看节点信息平铺格式
- docker node inspect --pretty 主机名
# 查看运行的一个或多个及节点任务数,默认当前节点
- docker node ps
# 从swarm中删除一个节点
- docker node rm 主机名
# 更新一个节点
- docker node update
#对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)
- docker node update --availability
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
# 服务管理
docker service
# 创建一个服务
- docker service create
# 创建的副本数
- docker service create --replicas 副本数
# 指定容器名称
- docker service create --name 名字
# 每次容器与容器之间的更新时间间隔。
- docker service create --update-delay s秒
# 更新时同时并行更新数量,默认1
- docker service create --update-parallelism 个数
# 任务容器更新失败时的模式,(“pause”停止|”continue“继续),默认pause。
- docker service create --update-failure-action 类型
# 每次容器与容器之间的回滚时间间隔。
- docker service create --rollback-monitor 20s
# 回滚故障率如果小于百分比允许运行
- docker service create --rollback-max-failure-ratio .数值(列“.2”为%20)
# 添加网络
- docker service create --network 网络名
# 创建volume类型数据卷
- docker service create --mount type=volume,src=volume名称,dst=容器目录
# 创建bind读写目录挂载
- docker service create --mount type=bind,src=宿主目录,dst=容器目录
# 创建bind只读目录挂载
- docker service create --mount type=bind,src=宿主目录,dst=容器目录,readonly
# 创建dnsrr负载均衡模式
- docker service create --endpoint-mode dnsrr 服务名
# 创建docker配置文件到容器本地目录
- docker service create --config source=docker配置文件,target=配置文件路径
# 创建添加端口
- docker service create --publish 暴露端口:容器端口 服务名
# 查看服务详细信息,默认json格式
- docker service inspect
# 查看服务信息平铺形式
- docker service inspect --pretty 服务名
# 查看服务内输出
- docker service logs
# 列出服务
- docker service ls
# 列出服务任务信息
- docker service ps    
# 查看服务启动信息
- docker service ps 服务名
# 过滤只运行的任务信息
- docker service ps -f "desired-state=running" 服务名
# 删除服务
- docker service rm
# 缩容扩容服务
- docker service scale
# 扩展服务容器副本数量
- docker service scale 服务名=副本数
# 更新服务相关配置
- docker service update
# 容器加入指令
- docker service update --args “指令” 服务名
# 更新服务容器版本
- docker service update --image 更新版本 服务名
# 回滚服务容器版本
- docker service update --rollback 回滚服务名
# 添加容器网络
- docker service update --network-add 网络名 服务名
# 删除容器网络
- docker service update --network-rm 网络名 服务名
# 服务添加暴露端口
- docker service update --publish-add 暴露端口:容器端口 服务名
# 移除暴露端口
- docker service update --publish-rm 暴露端口:容器端口 服务名
# 修改负载均衡模式为dnsrr
- docker service update --endpoint-mode dnsrr 服务名
# 添加新的配置文件到容器内
- docker service update --config-add 配置文件名称,target=/../容器内配置文件名 服务名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 管理配置文件
docker config
# 查看已创建配置文件
- docker config ls
# 将已有配置文件添加到docker配置文件中
- docker config create docker 配置文件名 本地配置文件


---更新配置文件----

# 1创建配置文件
docker config create nginx2_config nginx2.conf
# 2删除旧配置文件
docker service update --config-rm ce_nginx_config 服务名
# 3添加新配置文件到服务
ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx

# 删除配置文件
- docker service update --config-rm 配置文件名称 服务名
# 强制重启服务
- docker service update --force 服务名

以下是一些常用的指令例子:

查看集群节点

1
2
3
4
5
6
7
[root@swarm_33 jinri]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ztslcnlhxsqez9kmxfarxszjt * swarm_33 Ready Active Reachable 18.06.1-ce
x2xdwyma2mdl77nlev7d01uc2 swarm_34 Ready Active Leader 18.06.1-ce
w5efldfvjutkayqrgg0v9b8y2 swarm_44 Ready Active 18.06.1-ce
p6p2rx3bozkgvg7mkmxbu6ct0 swarm_47 Ready Active 18.06.1-ce
hfxz7ezn855cytcibql0acoym swarm_60 Ready Active 18.06.1-ce

创建tkl 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@swarm_33 jinri]# docker service create --replicas 5 -p 9235:9234 --name tkl jinri.github.io/jinri/tkl:1.2
image jinri.github.io/jinri/tkl:1.2 could not be accessed on a registry to record
its digest. Each node will access jinri.github.io/jinri/tkl:1.2 independently,
possibly leading to different nodes running different
versions of the image.

x256zxz6ifu1g61l9mw4uvqix
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged

查看服务

1
2
3
4
[root@swarm_33 jinri]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x256zxz6ifu1 tkl replicated 5/5 jinri.github.io/jinri/tkl:1.2 *:9235->9234/tcp
up28njylsn46 store1 replicated 1/1 jinri.github.io/jinri/tkl:1.2 *:9236->9234/tcp

查看服务进程信息

1
2
3
4
5
6
7
[root@swarm_33 jinri]#  docker service ps tkl 
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wxyh8c43jiu0 tkl.1 jinri.github.io/jinri/tkl:1.2 swarm_47 Running Running 25 hours ago
qz4jmu5ampsy tkl.2 jinri.github.io/jinri/tkl:1.2 swarm_60 Running Running 25 hours ago
6ai3v2h64oxm tkl.3 jinri.github.io/jinri/tkl:1.2 swarm_44 Running Running 25 hours ago
qbgglqvcwj32 tkl.4 jinri.github.io/jinri/tkl:1.2 swarm_33 Running Running 25 hours ago
gyx747gc9nkv tkl.5 jinri.github.io/jinri/tkl:1.2 swarm_34 Running Running 25 hours ago

查看服务日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@swarm_33 jinri]# docker service logs tkl
tkl.5.gyx747gc9nkv@swarm_34 | /usr/bin/supervisord -c /home/s/script/supervisord.conf
tkl.1.wxyh8c43jiu0@swarm_47 | /usr/bin/supervisord -c /home/s/script/supervisord.conf
tkl.4.qbgglqvcwj32@swarm_33 | /usr/bin/supervisord -c /home/s/script/supervisord.conf
tkl.1.wxyh8c43jiu0@swarm_47 | 2020-02-20 11:10:12,471 CRIT Supervisor running as root (no user in config file)
tkl.4.qbgglqvcwj32@swarm_33 | 2020-02-20 11:10:13,276 CRIT Supervisor running as root (no user in config file)
tkl.4.qbgglqvcwj32@swarm_33 | 2020-02-20 11:10:13,286 INFO supervisord started with pid 1
tkl.4.qbgglqvcwj32@swarm_33 | 2020-02-20 11:10:13,287 INFO spawned: 'dconf' with pid 9
tkl.5.gyx747gc9nkv@swarm_34 | 2020-02-20 11:10:13,266 CRIT Supervisor running as root (no user in config file)
tkl.4.qbgglqvcwj32@swarm_33 | 2020-02-20 11:10:13,289 INFO spawned: 'tkl' with pid 10
tkl.1.wxyh8c43jiu0@swarm_47 | 2020-02-20 11:10:12,482 INFO supervisord started with pid 1
tkl.1.wxyh8c43jiu0@swarm_47 | 2020-02-20 11:10:12,483 INFO spawned: 'dconf' with pid 9
tkl.1.wxyh8c43jiu0@swarm_47 | 2020-02-20 11:10:12,485 INFO spawned: 'tkl' with pid 10
tkl.5.gyx747gc9nkv@swarm_34 | 2020-02-20 11:10:13,275 INFO supervisord started with pid 1
tkl.4.qbgglqvcwj32@swarm_33 | 2020-02-20 11:10:14,310 INFO success: dconf entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
tkl.4.qbgglqvcwj32@swarm_33 | 2020-02-20 11:10:14,311 INFO success: tkl entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

使用docker-compose.yml部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[jinri@23v tkl]$ docker stack deploy -c docker-compose.yml tkl
Ignoring unsupported options: restart

Ignoring deprecated options:

container_name: Setting the container name is not supported.

expose: Exposing ports is unnecessary - services on the same network can access each other's containers on any port.

[jinri@23v tkl]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zgipim6rpxs3 tkl_tkl1 replicated 1/1 jinri.github.io/jinri/tkl:1.2 *:9234->9234/tcp
[jinri@23v tkl]$ docker stack ls
NAME SERVICES ORCHESTRATOR
tkl 1 Swarm

创建overlay类型的网络

1
docker network create --driver overlay tkl_overlay

创建带有本地卷挂载的服务

1
2
docker service create  --replicas  2  -p 9235:9234  --mount type=volume,src=tkl-vol,dst=/home/s/scanService/log/ --name tkl --network tkl_overlay  jinri.github.io/jinri/tkl:1.2

创建global模式的部署

1
2
3
4
5
6
7
8
9
docker service create --mode global  -p 9235:9234  --name tkl --network tkl_overlay  jinri.github.io/jinri/tkl:1.2

[jinri@swarm_34 ~]$ sudo docker service ps tkl
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
fe4z93a0qe2h tkl.ztslcnlhxsqez9kmxfarxszjt jinri.github.io/jinri/tkl:1.2 swarm_33 Running Running about a minute ago
jx7q47xhwuwr tkl.x2xdwyma2mdl77nlev7d01uc2 jinri.github.io/jinri/tkl:1.2 swarm_34 Running Running about a minute ago
pcnm3ngp354k tkl.w5efldfvjutkayqrgg0v9b8y2 jinri.github.io/jinri/tkl:1.2 swarm_44 Running Running about a minute ago
kz6o3cap0md9 tkl.p6p2rx3bozkgvg7mkmxbu6ct0 jinri.github.io/jinri/tkl:1.2 swarm_47 Running Running about a minute ago
utxyl5jgpv8x tkl.hfxz7ezn855cytcibql0acoym jinri.github.io/jinri/tkl:1.2 swarm_60 Running Running about a minute ago