Docker集群管理工具-Swarm部署记录

简介:

之前介绍了Docker集群管理工具-Kubernetes部署记录,下面介绍另一个管理工具Swarm的用法,Swarm是Docker原生的集群管理软件,与Kubernetes比起来比较简单。


Swarm介绍

1
2
3
Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client  in  Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。
 
Docker的Swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面就来认识下Swarm(对于Swarm管理的详细操作可以参考:https: //www .centos.bz /tag/swarm/page/3/


Swarm架构

1
Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:

Bluemix.png

Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。


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
1)Swarm
集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
  
2)Node
一个节点(node)是已加入到swarm的Docker引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着Manager
管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和群集管理功能,worker节点接收并执行来自
manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点
  
3)服务(Service)
服务是要在worker节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像
  
4)任务(Task)
任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点
  
--------------------------------------------------------------------------------------------------------
docker swarm:集群管理,子命令有init,  join , leave, update。(docker swarm --help查看帮助)
docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service--help查看帮助)
docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks,  ls rm 。(docker node --help查看帮助)
   
node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
manager nodes,也就是管理节点
worker nodes,也就是工作节点
   
1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。
3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。
    service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。


Swarm工作方式


1)Node

11.png

2)Service(服务, 任务, 容器)

Bluemix.png


3)任务与调度

11.png


4)服务副本与全局服务

Bluemix.png



Swarm调度策略

1
2
3
4
5
6
7
8
9
10
11
12
Swarm在scheduler节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
1)Random
顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
行的容器的数量来计算应该运行容器的节点。
  
2)Spread
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
  
3)Binpack
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在
一个节点上面。


Swarm Cluster模式的特性

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
1)批量创建服务
建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式
   
2)强大的集群的容错性
当容器副本中的其中某一个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,以及之前设定的值--replicas n,
在集群中剩余的空闲节点上,重新拉起容器副本。整个副本迁移的过程无需人工干预,迁移后原本的集群的load balance依旧好使!
不难看出,docker service其实不仅仅是批量启动服务这么简单,而是在集群中定义了一种状态。Cluster会持续检测服务的健康状态
并维护集群的高可用性。
   
3)服务节点的可扩展性
Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale
参数即可复制出新的副本出来。
   
仔细观察的话,可以发现所有扩展出来的容器副本都run在原先的节点下面,如果有需求想在每台节点上都run一个相同的副本,方法
其实很简单,只需要在命令中将 "--replicas n" 更换成 "--mode=global" 即可!
  
复制服务(--replicas n)
将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“--replicas 3”。
  
全局服务(--mode=global)
适用于集群内全部可用节点上的服务任务,例如“--mode global”。如果大家在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。
   
4. 调度机制
所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器
组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。
   
------------------Swarm cluster的创建过程包含以下三个步骤----------------------
1)发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化
2)初始化内部调度(scheduler)模块
3)创建并启动API监听服务模块
   
一旦创建好这个cluster,就可以用命令docker service批量对集群内的容器进行操作,非常方便!
   
在启动容器后,docker 会根据当前每个swarm节点的负载判断,在负载最优的节点运行这个task任务,用 "docker service ls"  "docker service ps + taskID"
可以看到任务运行在哪个节点上。容器启动后,有时需要等待一段时间才能完成容器创建。


Swarm集群部署实例(Swarm Cluster)

1)机器环境(均是centos7.2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
10.10.172.201      swarm的manager节点      manager-node   
10.10.172.202      swarm的node节点         node1
10.10.172.203      swarm的node节点         node2
  
设置主机名
在manager节点上
[root@manager-node ~] # hostnamectl --static set-hostname manager-node
  
在node1节点上
[root@node1 ~] # hostnamectl --static set-hostname node1
  
在node2节点上
[root@node2 ~] # hostnamectl --static set-hostname node2
  
在三台机器上都要设置hosts,均执行如下命令:
[root@manager-node ~] # vim /etc/hosts
......
10.10.172.201 manager-node
10.10.172.202 node1
10.10.172.203 node2
  
关闭三台机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377 /tcp (管理端口)、7946 /udp (节点间通信端口)、4789 /udp (overlay 网络端口)端口。
[root@manager-node ~] # systemctl disable firewalld.service
[root@manager-node ~] # systemctl stop firewalld.service


2)分别在manager节点和node节点上安装docker,并下载swarm镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@manager-node ~] # yum install -y docker
   
配置docker
[root@manager-node ~] # vim /etc/sysconfig/docker
......
OPTIONS= '-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'            // 在OPTIONS参数项后面的 '' 里添加内容
   
[root@manager-node ~] # systemctl restart docker
   
下载swarm镜像
[root@manager-node ~] # docker pull swarm
[root@manager-node ~] # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io /swarm      latest              59c0df55980b        3 months ago        15.77 MB


3)创建swarm(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)

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
[root@manager-node ~] # docker swarm init --advertise-addr 10.10.172.201
Swarm initialized: current node (7n2xyjblxb4kju906uq84e28d) is now a manager.
 
To add a worker to this swarm, run the following  command :
 
     docker swarm  join  \
     --token SWMTKN-1-1tianv52fdovpflqhnmpgle9lkvlthy5fmskfi4j61akaa6xw1-dbjzdr4r1hnrj045m1nj30q5y \
     10.10.172.201:2377
 
To add a manager to this swarm, run  'docker swarm join-token manager'  and follow the instructions.
  
上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。
其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。
  
-------------------------------------------------------------------------------------------------------------------
温馨提示:
如果再次执行上面启动swarm集群的命令,会报错说这个节点已经在集群中了
Error response from daemon: This node is already part of a swarm. Use  "docker swarm leave"  to leave this swarm and  join  another one.
  
解决办法:
[root@manager-node ~] # docker swarm leave --help           //查看帮助
[root@manager-node ~] # docker swarm leave --force
-------------------------------------------------------------------------------------------------------------------
  
使用docker info 或 docker node  ls  查看集群中的相关信息
[root@manager-node ~] # docker info
.......
Swarm: active
  NodeID: 7n2xyjblxb4kju906uq84e28d
  Is Manager:  true
  ClusterID: 8fzgiolmchtdhobzgnbpnmjlp
  Managers: 1
  Nodes: 1
  Orchestration:
   Task History Retention Limit: 5
.......
  
[root@manager-node ~] # docker node ls 
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
7n2xyjblxb4kju906uq84e28d *  manager-node  Ready   Active        Leader
  
注意上面node ID旁边那个*号表示现在连接到这个节点上。


4)添加节点到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
在docker swarm init 完了之后,会提示如何加入新机器到集群,如果当时没有注意到,也可以通过下面的命令来获知 如何加入新机器到集群。
   
登录到node1节点上,执行前面创建swarm集群时输出的命令:
[root@node1 ~] # docker swarm join --token SWMTKN-1-1tianv52fdovpflqhnmpgle9lkvlthy5fmskfi4j61akaa6xw1-dbjzdr4r1hnrj045m1nj30q5y 10.10.172.201:2377
This node joined a swarm as a worker.
   
同理在node2节点上,也执行这个命令
[root@node2 ~] # docker swarm join --token SWMTKN-1-1tianv52fdovpflqhnmpgle9lkvlthy5fmskfi4j61akaa6xw1-dbjzdr4r1hnrj045m1nj30q5y 10.10.172.201:2377
This node joined a swarm as a worker.
   
如果想要将其他更多的节点添加到这个swarm集群中,添加方法如上一致!
   
然后在manager-node管理节点上看一下集群节点的状态:
[root@manager-node ~] # docker node ls 
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
53gb1cbk4a5jzk8iad7hlfa29    node2         Ready   Active        
6pxcxk3t1x1vjbf7lnxoltg7s    node1         Ready   Active        
7n2xyjblxb4kju906uq84e28d *  manager-node  Ready   Active        Leader
  
--------------------------------------------------------------------------------------------------------------------
温馨提示:更改节点的availablity状态
swarm集群中node的availability状态可以为 active或者drain,其中:
active状态下,node可以接受来自manager节点的任务分派;
drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)。
  
[root@manager-node ~] # docker node update --availability drain node1    //将node1节点下线。如果要删除node1节点,命令是"docker node rm --force node1"
node1
[root@manager-node ~] # docker node ls 
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
53gb1cbk4a5jzk8iad7hlfa29    node2         Ready   Active        
6pxcxk3t1x1vjbf7lnxoltg7s    node1         Ready   Drain         
7n2xyjblxb4kju906uq84e28d *  manager-node  Ready   Active        Leader
  
如上,当node1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。
  
再次修改为active状态(及将下线的节点再次上线)
[root@manager-node ~] # docker node update --availability active node1


5)在Swarm中部署服务(这里以nginx服务为例)

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
Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。
  
在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式
[root@manager-node ~] # docker network create -d overlay ngx_net
do7gkto6w4xjw0ooytxamm4d3
[root@manager-node ~] # docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
64c014f61d15        bridge              bridge               local               
10d1451ecc8d        docker_gwbridge     bridge               local               
5764ade8774b        host                host                 local               
50kipkihuwxy        ingress             overlay             swarm               
do7gkto6w4xj        ngx_net             overlay             swarm               
f2af952cd27a        none                null                 local 
    
在manager-node节点上使用上面这个覆盖网络创建nginx服务:
其中,--replicas 参数指定服务由几个实例组成。
注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。
[root@manager-node ~] # docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx
bkmgnxkwvryq5s804ssr6osqc
    
就创建了一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
    
使用 docker service  ls  查看正在运行服务的列表
[root@manager-node ~] # docker service ls
ID            NAME     REPLICAS  IMAGE  COMMAND
bkmgnxkwvryq  my- test   1 /1        nginx 
    
查询Swarm中服务的信息
--pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:
[root@manager-node ~] # docker service inspect --pretty my-test
ID:             bkmgnxkwvryq5s804ssr6osqc
Name:           my- test
Mode:           Replicated
  Replicas:      1
Placement:
UpdateConfig:
  Parallelism:   1
  On failure:    pause
ContainerSpec:
  Image:         nginx
Resources:
Networks: do7gkto6w4xjw0ooytxamm4d3
Ports:
  Protocol = tcp
  TargetPort = 80
  PublishedPort = 80
    
查询到哪个节点正在运行该服务。如下该容器被调度到manager-node节点上启动了,然后访问http: //10 .10.172.201即可访问这个容器应用(如果调度到其他节点,访问也是如此)
[root@manager-node ~] # docker service ps my-test
ID                         NAME       IMAGE  NODE          DESIRED STATE  CURRENT STATE           ERROR
97g8jujp63aq2mbgiovzy2m2b  my- test .1  nginx  manager-node  Running        Running 46 seconds ago  
    
注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。
    
    
有上面命令可知,该服务在manager-node节点上运行。登陆该节点,可以查看到nginx容器在运行中
[root@manager-node ~] # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c1d3c8549c74        nginx:latest         "nginx -g 'daemon off"    3 minutes ago       Up 3 minutes        80 /tcp               my- test .1.97g8jujp63aq2mbgiovzy2m2b
    
-----------------------------------------------------------在Swarm中动态扩展服务(scale)-----------------------------------------------------------
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:
    
比如将上面的my- test 容器动态扩展到5个,命令如下:
[root@manager-node ~] # docker service scale my-test=5
my- test  scaled to 5
    
和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器
[root@manager-node ~] # docker service ps my-test
ID                         NAME       IMAGE  NODE          DESIRED STATE  CURRENT STATE               ERROR
97g8jujp63aq2mbgiovzy2m2b  my- test .1  nginx  manager-node  Running        Running 5 minutes ago       
3log3kj86b8pdui1wttp60q47  my- test .2  nginx  node2         Running        Running 20 seconds ago      
d3dhsrevv55drhgjryz06rfvl  my- test .3  nginx  node1         Running        Running 38 seconds ago      
9817bpuxud3wpdzouk4dntybm  my- test .4  nginx  node1         Running        Running 38 seconds ago      
9dmflf1ysr7k3b4x0r5qigy1g  my- test .5  nginx  manager-node  Running        Running about a minute ago
    
可以看到,之前my- test 容器只在manager-node节点上有一个实例,而现在又增加了4个实例。
这5个副本的my- test 容器分别运行在这三个节点上,登陆这三个节点,就会发现已经存在运行着的my- test 容器。
    
-----------------------------------------------------------------------------------------------------
特别需要清楚的一点:
如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。
    
比如:
将node1宕机后或将node1的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node1节点恢复后,它转移出去的task实例不会主动转移回来,
只能等别的节点出现故障后转移task实例到它的上面。使用命令 "docker node ls" ,发现node1节点已不在swarm集群中了。
    
然后过一会查询服务的状态列表
[root@manager-node ~] # docker service ps my-test
ID                         NAME           IMAGE  NODE          DESIRED STATE  CURRENT STATE                     ERROR
97g8jujp63aq2mbgiovzy2m2b  my- test .1      nginx  manager-node  Running        Running 10 minutes ago            
3log3kj86b8pdui1wttp60q47  my- test .2      nginx  node2         Running        Running 4 minutes ago             
dlb7m3q2lrfh9vlm1r6tg2nlk  my- test .3      nginx  node2         Ready          Preparing  less  than a second ago  
d3dhsrevv55drhgjryz06rfvl   \_ my- test .3  nginx  node1         Shutdown       Running 4 minutes ago             
63s3azdo71p9p3mo3yg06ct1i  my- test .4      nginx  node2         Ready          Preparing  less  than a second ago  
9817bpuxud3wpdzouk4dntybm   \_ my- test .4  nginx  node1         Shutdown       Running 4 minutes ago             
9dmflf1ysr7k3b4x0r5qigy1g  my- test .5      nginx  manager-node  Running        Running 5 minutes ago 
    
发现,node1节点出现故障后,它上面之前的两个task任务已经转移到node2节点上了。
登陆到node2节点上,可以看到这两个运行的task任务。当访问10.10.172.203节点的80端口,swarm的负载均衡会把请求路由到一个任意节点的可用的容器上。
[root@node2 ~] # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
bfa6b4e510b6        nginx:latest         "nginx -g 'daemon off"    55 seconds ago      Up 52 seconds       80 /tcp               my- test .3.dlb7m3q2lrfh9vlm1r6tg2nlk
b8b28144f968        nginx:latest         "nginx -g 'daemon off"    55 seconds ago      Up 53 seconds       80 /tcp               my- test .4.63s3azdo71p9p3mo3yg06ct1i
8bdd0608d1cd        nginx:latest         "nginx -g 'daemon off"    5 minutes ago       Up 5 minutes        80 /tcp               my- test .2.3log3kj86b8pdui1wttp60q47
    
再次在node2节点上将从node1上转移过来的两个task关闭
[root@node2 ~] # docker stop my-test.3.dlb7m3q2lrfh9vlm1r6tg2nlk my-test.4.63s3azdo71p9p3mo3yg06ct1i
my- test .3.dlb7m3q2lrfh9vlm1r6tg2nlk
my- test .4.63s3azdo71p9p3mo3yg06ct1i
    
再次查询服务的状态列表,发现这两个task又转移到node1上了(即在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上)
[root@manager-node ~] # docker service ps my-test
ID                         NAME           IMAGE  NODE          DESIRED STATE  CURRENT STATE            ERROR
97g8jujp63aq2mbgiovzy2m2b  my- test .1      nginx  manager-node  Running        Running 13 minutes ago   
3log3kj86b8pdui1wttp60q47  my- test .2      nginx  node2         Running        Running 8 minutes ago    
68oxkukpnxcisr35rg18b3hr4  my- test .3      nginx  node2         Running        Running 13 seconds ago   
dlb7m3q2lrfh9vlm1r6tg2nlk   \_ my- test .3  nginx  node2         Shutdown       Complete 20 seconds ago  
d3dhsrevv55drhgjryz06rfvl   \_ my- test .3  nginx  node1         Shutdown       Running 8 minutes ago    
81a87qt79pnlcuyulwaocbr8a  my- test .4      nginx  node2         Running        Running 14 seconds ago   
63s3azdo71p9p3mo3yg06ct1i   \_ my- test .4  nginx  node2         Shutdown       Complete 20 seconds ago  
9817bpuxud3wpdzouk4dntybm   \_ my- test .4  nginx  node1         Shutdown       Running 8 minutes ago    
9dmflf1ysr7k3b4x0r5qigy1g  my- test .5      nginx  manager-node  Running        Running 9 minutes ago  
   
----------------------------------------------------------------------------------------------------
同理,swarm还可以缩容,如下,将my- test 容器变为1个。其它全部会被Shutdown
[root@manager-node ~] # docker service scale my-test=1
[root@manager-node ~] # docker service ps my-test |grep Running
ID                         NAME           IMAGE  NODE          DESIRED STATE  CURRENT STATE                ERROR 
3log3kj86b8pdui1wttp60q47  my- test .2      nginx  node2         Running        Running 9 minutes ago  
   
登录node2节点,使用docker  ps 查看,会发现容器是up状态。
   
---------------------------------------------------------------------------------------------------
删除容器服务
[root@manager-node ~] # docker service --help       //查看帮助
[root@manager-node ~] # docker service rm my-test    //这样就会把所有节点上的所有容器(task任务实例)全部删除了
my- test
[root@manager-node ~] # docker service ps my-test
Error: No such service: my- test
    
---------------------------------------------------------------------------------------------------
除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。
[root@manager-node ~] # docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx
9wtr4fnrfflo07vyt3jd4zmhw
[root@manager-node ~] # docker service update --replicas 3 my-test
my- test
   
更新完毕以后,可以查看到REPLICAS已经变成3 /3
[root@manager-node ~] # docker service ls
ID            NAME     REPLICAS  IMAGE  COMMAND
9wtr4fnrfflo  my- test   3 /3        nginx 
   
[root@manager-node ~] # docker service ps my-test
ID                         NAME       IMAGE  NODE          DESIRED STATE  CURRENT STATE           ERROR
dsxvyuiwarky040jj7ws0wwxn  my- test .1  nginx  manager-node  Running        Running 43 seconds ago  
5zys9b8njm2mnlhumy0tl2jtn  my- test .2  nginx  node2         Running        Running 34 seconds ago  
dl274y2y4gw4ecvvn6nh9pzsi  my- test .3  nginx  manager-node  Running        Running 33 seconds ago 
   
docker service update 命令,也可用于直接 升级 镜像等。
[root@manager-node ~] # docker service update --image nginx:new my-test
my- test
[root@manager-node ~] # docker service ls
ID            NAME     REPLICAS  IMAGE      COMMAND
9wtr4fnrfflo  my- test   2 /3        nginx:new


6)Swarm中使用Volume(挂在目录,mount)

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
查看docker volume的帮助信息
[root@manager-node ~] # docker volume --help
 
Usage:  docker volume COMMAND
 
Manage Docker volumes
 
Options:
       --help   Print usage
 
Commands:
   create      Create a volume
   inspect     Display detailed information on one or  more  volumes
   ls           List volumes
   rm           Remove one or  more  volumes
 
Run  'docker volume COMMAND --help'  for  more  information on a  command .
    
[root@manager-node ~] # docker volume create --name myvolume
myvolume
   
myvolume
[root@manager-node ~] # docker volume ls
DRIVER              VOLUME NAME
local                myvolume
   
参数src写成 source 也可以;dst表示容器内的路径,也可以写成target
[root@manager-node ~] # docker service create  --replicas 2 --mount type=volume,src=myvolume,dst=/dengaosky --name test-nginx nginx
    
[root@manager-node ~] # docker service ls
ID            NAME        REPLICAS  IMAGE      COMMAND
9q85esvgj8mm   test -nginx  2 /2        nginx      
c9jud6v1tiu3  my- test      2 /3        nginx:new  
[root@manager-node ~] # docker service ps test-nginx
ID                         NAME          IMAGE  NODE          DESIRED STATE  CURRENT STATE           ERROR
7abiowztxv5lrj7opgqju5q6g   test -nginx.1  nginx  node2         Running        Running 27 seconds ago  
567id5p0xujutqi49ifl6pkc7   test -nginx.2  nginx  manager-node  Running        Running 27 seconds ago  
    
登录node2节点的 test -nginx容器查看
[root@node2 ~] # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
429f68eaf281        nginx:latest         "nginx -g 'daemon off"    About a minute ago   Up About a minute   80 /tcp               test -nginx.1.7abiowztxv5lrj7opgqju5q6g
    
[root@node2 ~] # docker exec -ti 429f68eaf281 /bin/bash
root@429f68eaf281:/ # cd /dengaosky/                                                                                                                               
root@429f68eaf281: /dengaosky # ls
root@429f68eaf281: /dengaosky # echo "hello" > dengaosky.txt
root@429f68eaf281: /dengaosky # ls
dengaosky.txt
    
[root@node2 ~] # docker volume inspect myvolume
[
     {
         "Name" "myvolume" ,
         "Driver" "local" ,
         "Mountpoint" "/var/lib/docker/volumes/myvolume/_data" ,
         "Labels" : null,
         "Scope" "local"
     }
]
[root@node2 ~] # cd /var/lib/docker/volumes/myvolume/_data/
[root@node2 _data] # ls
dengaosky.txt
[root@node2 _data] # cat dengaosky.txt 
hello
[root@node2 _data] # echo "world" > sky.txt
[root@node2 _data] # ls
dengaosky.txt  sky.txt
    
root@429f68eaf281: /dengaosky # ls
dengaosky.txt  sky.txt
root@429f68eaf281: /dengaosky # cat sky.txt 
world
    
还可以将node2节点机上的volume数据目录做成软链接
[root@node2 ~] # ln -s /var/lib/docker/volumes/myvolume/_data /dengaosky
[root@node2 ~] # cd /dengaosky/
[root@node2 dengaosky] # ls
dengaosky.txt  sky.txt
[root@node2 dengaosky] # rm -rf sky.txt 
[root@node2 dengaosky] # echo "ok" > ok.txt
    
root@429f68eaf281: /dengaosky # ls
dengaosky.txt  ok.txt
root@429f68eaf281: /dengaosky # cat ok.txt 
ok
---------------------------------------------------------------------------------
第二种方法:
  
命令格式:
docker service create -- mount  type =bind,target= /container_data/ , source = /host_data/
其中,参数target表示容器里面的路径, source 表示本地硬盘路径(所有节点都需要事先创建挂载点)
  
[root@manager-node ~] # docker service create --replicas 1 --mount type=bind,target=/usr/share/nginx/html/,source=/data/web/ --network ngx_net --name hello-nginx -p 8880:80 nginx
[root@manager-node ~] # docker service ls
ID            NAME         REPLICAS  IMAGE  COMMAND
9q85esvgj8mm   test -nginx   2 /2        nginx
9xcwvn3b5kn9  hello-nginx  1 /1        nginx       
c9jud6v1tiu3  my- test       2 /3        nginx:new 
[root@manager-node ~] # docker service ps hello-nginx
ID                         NAME           IMAGE  NODE   DESIRED STATE  CURRENT STATE               ERROR
cgemuccicakzx5t669j8rbdi2  hello-nginx.1  nginx  node1  Running        Running about a minute ago 
  
登录node1节点,在挂载目录 /data/web 下写测试数据
[root@node1 ~] # cd /data/web/
[root@node1 web] # ls
[root@node1 web] # echo "hello-nginx" > index.html
[root@node1 web] # cat index.html 
hello-nginx
  
登录容器查看,发现已经实现数据同步
[root@node1 web] # docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c272ae56d22a        nginx:latest         "nginx -g 'daemon off"    2 minutes ago       Up 2 minutes        80 /tcp               hello-nginx.1.2g65wz8dp9mqwbopr7cxyv2e1
[root@node1 web] # docker exec -ti c272ae56d22a /bin/bash
root@c272ae56d22a:/ # cd /usr/share/nginx/html/                                                                                                                    
root@c272ae56d22a: /usr/share/nginx/html # ls
1.txt
root@c272ae56d22a: /usr/share/nginx/html # cat 1.txt 
hello-nginx
root@259d604b3794: /usr/share/nginx/html # touch hello.txt
touch : cannot  touch  'hello.txt' : Permission denied
由此可见,以上设置后,在容器里的同步目录下没有写权限,更新内容时只要放到宿主机的挂在目录下即可!
 
http: //10 .10.172.202  显示的页面内容为 "hello-nginx"


总之,Swarm上手很简单,Docker swarm可以非常方便的创建类似kubernetes那样带有副本的服务,确保一定数量的容器运行,保证服务的高可用。

然而,光从官方文档来说,功能似乎又有些简单;


swarm、kubernetes、messos总体比较而言:

1)Swarm的优点和缺点都是使用标准的Docker接口,使用简单,容易集成到现有系统,但是更困难支持更复杂的调度,比如以定制接口方式定义的调度。

2)Kubernetes 是自成体系的管理工具,有自己的服务发现和复制,需要对现有应用的重新设计,但是能支持失败冗余和扩展系统。

3)Mesos是低级别 battle-hardened调度器,支持几种容器管理框架如Marathon, Kubernetes, and Swarm,现在Kubernetes和Mesos稳定性超过Swarm,在扩展性方面,Mesos已经被证明支持超大规模的系统,比如数百数千台主机,但是,如果你需要小的集群,比如少于一打数量的节点服务器数量,Mesos也许过于复杂了。




本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/2069735,如需转载请自行联系原作者

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
15天前
|
存储 测试技术 Linux
【Docker项目实战】使用Docker部署bender个人仪表板
【4月更文挑战第2天】使用Docker部署bender个人仪表板
28 1
|
24天前
|
存储 机器学习/深度学习 中间件
快速上手 Elasticsearch:Docker Compose 部署详解
本文介绍了如何使用Docker Compose快速搭建Elasticsearch学习环境。Elasticsearch是一款用于实时搜索和分析的分布式中间件,适用于多种场景,如搜索、日志分析、机器学习等。首先,创建docker网络,拉取最新版8.12.2镜像。接着,编写docker-compose.yml文件,配置单节点集群,设置端口映射、内存限制及数据卷挂载。然后,创建并配置数据卷目录,允许远程访问和跨域。最后,启动服务并验证,通过浏览器访问确认服务运行正常。本文为初学者提供了一个简便的Elasticsearch部署方法。
140 4
快速上手 Elasticsearch:Docker Compose 部署详解
|
16天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
77 0
|
1天前
|
测试技术 Linux 网络安全
【好玩的开源项目】使用Docker部署SyncTV视频同步和共享平台
【4月更文挑战第16天】使用Docker部署SyncTV视频同步和共享平台
8 0
|
5天前
|
测试技术 Linux 数据安全/隐私保护
【Docker项目实战】使用Docker部署Seatsurfing预订座位系统
【4月更文挑战第12天】使用Docker部署Seatsurfing预订座位系统
31 3
|
8天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
12天前
|
测试技术 Linux 数据安全/隐私保护
【Docker项目实战】使用Docker部署PicoShare共享文件平台
【4月更文挑战第5天】使用Docker部署PicoShare共享文件平台
46 4
|
17天前
|
测试技术 Linux Docker
Docker部署RPG网页小游戏
Docker部署RPG网页小游戏
44 2
|
19天前
|
Linux Shell 开发工具
CentOS8中Docker安装及部署
CentOS8中Docker安装及部署
67 0
|
20天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
44 1