Swarm使用GO语言开发完成,是docker容器管理工具之一,和swarm一起的还有machine和compose。Swarm是一套docker容器集群管理工具,Swarm使用标准的docker
API接口作为其前端访问的入口,各种docker client均可与其通讯。 Swarm分为以下几个部分:
1、Swarm:集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可在docker初始化时启动swarm模式,或加入到已存在的swarm;
2、Node:一个节点是已加入到swarm的docker实例,当部署应用到集群,会提交服务定义到管理节点,接着Manager管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和集群管理功能,worker节点接受并执行来自manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点。
3、service:服务是在 worker节点上要执行任务的定义,他在工作节点上执行,当你创建服务时,需要指定容器镜像。
4、task:任务是在docker容器中执行的命令Manager节点根据指定数量的任务副本分配任务给worker节点task是server的执行实体。
下面开始实验创建swarm集群:
目录
一、实验环境:
操作系统 | IP | 主机名 | swarm角色 |
---|---|---|---|
CentOS7 | 192.168.1.3 | swarm | manager |
CentOS7 | 192.168.1.4 | swarm01 | node |
CentOS7 | 192.168.1.5 | swarm02 | node |
二、配置环境
1、安装docker并配置开机启动,及配置加速器:
2、修改docker监听端口:
vim /usr/lib/systemd/system/docker.service
在ExecStart加入:
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
3、重启docker:
systemctl daemon-reload ##使配置文件生效
systemctl restart docker
三、安装Swarm
1、下载swarm镜像:
docker pull swarm
2、初始化Swarm集群:
在192.168.1.3上执行:
[root@swarm ~]# docker swarm init --advertise-addr 192.168.1.3
Swarm initialized: current node (ka6kyetddfq2sss6ks6veoxlp) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3xisgjfqmlovis15jhkrxrkui417xjeytmkp2g2ybckzn4pumf-59k05oign6ne3bae4swu5io5y 192.168.1.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
这就创建了一个swarm集群,上面标黄的意思为:加入一个worker节点到这个swarm,执行下面这行命令:
docker swarm join --token SWMTKN-1-3xisgjfqmlovis15jhkrxrkui417xjeytmkp2g2ybckzn4pumf-59k05oign6ne3bae4swu5io5y 192.168.1.3:2377
这个token是全球唯一的,不会重复的。
如果需要添加一个manager节点到这个集群,使用docker swarm join-token manager命令来查看具体命令,如:
[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-007g3ba4sp1gr9pq75xgccsgjfvcp2cxtsv2q8d4z3p0irls6z-0o5ql2fuutn33mpylwyauazp7 192.168.1.3:2377
3、只需要在需要成为manager节点的主机上执行下面这台命令就可以了:
docker swarm join --token SWMTKN-1-007g3ba4sp1gr9pq75xgccsgjfvcp2cxtsv2q8d4z3p0irls6z-0o5ql2fuutn33mpylwyauazp7 192.168.1.3:2377
4、如果找不到接入集群的命令了,可以执行下列命令找出:
[root@localhost ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-007g3ba4sp1gr9pq75xgccsgjfvcp2cxtsv2q8d4z3p0irls6z-1irecgw4sbapydxcna3wb7b91 192.168.1.3:2377
5、、查看swarm集群状态:
[root@swarm ~]# docker node list
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ka6kyetddfq2sss6ks6veoxlp * swarm Ready Active Leader 19.03.2
kxsyv3cttqeiodgj8k87cjq2q swarm01 Ready Active 19.03.2
6tsqxx07gicv81gt7vtxmwt81 swarm02 Ready Active 19.03.2
可以看出,192.168.1.3节点为leader,管理节点。
6、Docker Swarm可视化管理
在集群中的manager节点上运行 portainer服务,映射端口为9000,可以通过访问IP:9000进入可视化页面:
docker service create \
--name portainer \
--publish 9000:9000 \
--constraint 'node.role == manager' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
7、在集群中的manager节点上运行可视化的visualizer服务,可以非常直观的显示整个Swarm集群的信息、状态、运行的容器等:
docker service create \
--name=viz \
--publish=8088:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
manomarks/visualizer
四 Swarm基本使用:
1、docker swarm基本命令:
docker node: 用来管理swarm节点;
docker service:用来管理swarm服务;
docker stack:用来管理swarm堆栈;
docker swarm:管理swarm;
2、docker node命令
先查看docker node有哪些命令
[root@swarm ~]# docker node --help
Usage: docker node COMMAND
Manage Swarm nodes
Commands:
demote:降级节点
inspect:查看节点的详细信息
ls:查看集群中的节点
promote:升级节点
ps:查看节点当前执行的任务
rm:从集群中删除节点
update:更新节点
(1)将192.168.1.4和192.168.1.5加入swarm集群:
将192.168.1.4作为worker节点加入集群
[root@swarm01 ~]# docker swarm join --token SWMTKN-1-3xisgjfqmlovis15jhkrxrkui417xjeytmkp2g2ybckzn4pumf-59k05oign6ne3bae4swu5io5y 192.168.1.3:2377
This node joined a swarm as a worker.
将192.168.1.5作为manager节点加入集群:
[root@localhost ~]# docker swarm join --token SWMTKN-1-007g3ba4sp1gr9pq75xgccsgjfvcp2cxtsv2q8d4z3p0irls6z-0o5ql2fuutn33mpylwyauazp7 192.168.1.3:2377
This node joined a swarm as a manager.
1、集群节点升降级:
升级:
[root@swarm ~]# docker node promote swarm01
Node swarm01 promoted to a manager in the swarm.
查看节点状态:
降级:
[root@swarm ~]# docker node demote swarm01
Manager swarm01 demoted in the swarm.
查看节点状态:
(3)改变节点角色这一点和上面类似:
将swarm02改为普通worker节点:
[root@swarm ~]# docker node update swarm02 --role worker
swarm02
查看集群状态:
将swarm01升为manager节点:
[root@swarm ~]# docker node update swarm01 --role manager
swarm01
查看集群状态:
2、退出docker swarm集群:
在节点上执行:
[root@swarm02 ~]# docker swarm leave
Node left the swarm.
在manager上执行命令,删除推出集群的节点信息:
[root@swarm ~]# docker node rm swarm02
swarm02
再次查看集群状态,swarm02节点已经不存在了:
那可不可以对未退出集群的节点进行删除操作呢?
[root@swarm ~]# docker node rm swarm01
Error response from daemon: rpc error: code = FailedPrecondition desc = node kxsyv3cttqeiodgj8k87cjq2q is not down and can't be removed
通过实验可以看出,是不可以的。
3、查看集群中节点上的任务:
[root@swarm ~]# docker node ps
或指定主机名:
[root@swarm ~]# docker node ps swarm
3、docker service命令
先查看docker service有哪些基本命令:
[root@swarm ~]# docker service --help
Usage: docker service COMMAND
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
Run 'docker service COMMAND --help' for more information on a command.
1、docker service cerate命令:
docker service create命令参数较多,不一一列举,需要详细了解可使用
docker service create --help
查看所有参数。本次只介绍常用参数:
–name 自定义服务名称
–publish 映射端口号,可简写-p
–replicas 运行实例个数
比如我们创建web服务,运行3个实例,使用nginx镜像,命名为web,映射端口80:80:
[root@master ~]# docker service create --name web --replicas=3 --publish 80:80 nginx
bg5qftsbnghibmugdmfq0b3aq
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
标黄的实例状态会从prepare转换为ready,再转换为starting,最后转换为running。只有running状态才是正常的。
2、docker service ls
创建完成后,可使用docker service ls查看当前运行了哪些服务:
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
bg5qftsbnghi web replicated 3/3 nginx:latest *:80->80/tcp
3、docker service ps
需要查看服务运行状态,可以使用docker service ps +服务ID查看。比如上面我们可以看到web服务的ID为bg5qftsbnghi,如下:
[root@master ~]# docker service ps bg5qftsbnghi
4、docker service update
update常用参数有以下:
–publish-add参数指添加或者更新一个对外端口
–publish-rm参数指添加或者更新一个对外端口
–image参数指更新镜像
–hostname 更新或指定容器名称
–force 指强制更新,即使本次更新没有任何改变
例,将上面web服务映射端口删除:
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
bg5qftsbnghi web replicated 3/3 nginx:latest *:80->80/tcp
[root@master ~]# docker service update web --publish-rm 80:80
web
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
bg5qftsbnghi web replicated 3/3 nginx:latest
增加80端口映射:
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
bg5qftsbnghi web replicated 3/3 nginx:latest
[root@master ~]# docker service update web --publish-rm 80:80
web
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
bg5qftsbnghi web replicated 3/3 nginx:latest *:80->80/tcp