【docker】docker之swarm集群(二)

如何安装docker,参阅 docker centos7上的安装

现在系统架构强调的是高可用,显然单机版的docker只能玩玩,无法胜任生产任务。那么docker怎么 进行集群呢?

使用Swarm

从docker入门到实践一书中找点swarm相关概念

Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。
使用 Swarm 集群之前需要了解以下几个概念。

-------------------基本概念-------------
节点
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 ( node ) 。


节点分为管理 ( manager ) 节点和工作 ( worker ) 节点。
管理节点用于 Swarm 集群的管理, docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader , leader 通过 raft 协议实现。


工作节点是任务执行节点,管理节点将服务 ( service ) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。


来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

服务和任务
任务 ( Task )是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 ( Services ) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
         replicated services 按照一定规则在各个工作节点上运行指定个数的任务。                                                                                    global services 每个工作节点上运行一个任务

两种模式通过 docker service create 的 --mode 参数指定。
来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。

-------------------准备-------------

环境:

         docker版本:18.09.6

          操作系统:centos7 64位
          操作系统权限:root

 

三台装有docker的服务器:192.168.157.134(管理节点)、 192.168.157.131(工作节点)、 192.168.157.132(工作节点)

-------------------创建Swarm集群-------------

1. 确保所有服务器上的docker均已启动,如未启动,在root权限下用如下命令启动

systemctl start docker

2. 初始化swarm集群,创建主节点,服务器ip地址为192.168.157.134。为了便于初始化swarm前后进行对比,在执行初始化命令docker swarm init之前,用docker info命令查看swarm的相关信息。下图中信息显示swarm未被启用

下面来执行如下命令进行swarm初始化

$ docker swarm init 

Swarm initialized: current node (jmlk4z4np9pzd9m2yg5s6t6tt) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-11lzbs0646hms49rdb223kkto75vm1qxr3h2n5h1bxgbt3401y-9utzokk6mu6ddte5k42obpomu 192.168.157.134:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面的信息也告诉如何进行工作节点的增加: docker swarm join --token SWMTKN-1-11lzbs0646hms49rdb223kkto75vm1qxr3h2n5h1bxgbt3401y-9utzokk6mu6ddte5k42obpomu 192.168.157.134:2377

上述token一定要保存好,以后增加节点要用的!!!!

如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP。如:docker swarm init --advertise-addr 192.168.99.100
执行 docker swarm init 命令的节点自动成为管理节点。

下面再用docker info命令查看docker swarm状态,显示了swarm处于启用状态,当前服务器为管理节点,仅有1个管理节点和工作节点

3. 添加工作节点(服务器ip地址192.168.157.131),执行如下命令

[root@bogon ~]# docker swarm join --token SWMTKN-1-11lzbs0646hms49rdb223kkto75vm1qxr3h2n5h1bxgbt3401y-9utzokk6mu6ddte5k42obpomu 192.168.157.134:2377
This node joined a swarm as a worker.

 出现This node joined a swarm as a worker表明工作节点添加成功,在该工作节点服务器上使用docker info命令查看信息。

可以看到当前工作节点的服务器地址为:192.168.157.131,该节点不是管理节点,管理节点的地址为:192.168.157.134:2377

现在切换到管理节点192.168.157.134服务器上,运行docker info查看有什么变化,发现工作节点为2

用同样的方法将192.168.157.132也加到工作节点

4.  管理节点退出 Swarm 集群

如果 管理节点想要退出 Swarm 集群, 在 Manager Node 上执行如下命令:

docker swarm leave  

就可以退出集群,如果集群中还存在其它的 Worker Node,还希望 Manager 退出集群,则加上一个强制选项,命令行如下所示:

docker swarm leave --force

 

至此swarm集群部署完毕,下面是docker swarm集群常用命令

-------------------Docker Swarm集群常用命令,这些命令只能运行在管理节点上-------------

接着上面的步骤进行

1. 查看集群节点。hostname相同时因为我本地的linux系统是通过虚拟软件克隆了三份

#该命令用于查询swarm集群工作节点,且命令必须在管理节点上运行


[root@bogon ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
jmlk4z4np9pzd9m2yg5s6t6tt *   bogon               Ready               Active              Leader              18.09.6
q35e63xnq55uy4zi4swrig4u5     bogon               Ready               Active                                  18.09.6
q5xzaozvi4a5vckn6mtaczmrm     bogon               Ready               Active                                  18.09.6



#下面是docker node命令
[root@bogon ~]# docker node --help

Usage:  docker node COMMAND

Manage Swarm nodes

Commands:
  demote      Demote one or more nodes from manager in the swarm 将管理节点降级为工作节点
  inspect     Display detailed information on one or more nodes 查看节点详细信息
  ls          List nodes in the swarm 列出swarm集群中的素有节点
  promote     Promote one or more nodes to manager in the swarm 将工作节点升级为管理节点
  ps          List tasks running on one or more nodes, defaults to current node 列出节点上运行的任务,默认是当前节点
  rm          Remove one or more nodes from the swarm 从swarm集群中移除某个节点
  update      Update a node 更新某个节点

2. 部署服务。使用 docker service 命令来管理 Swarm 集群中的服务

#新建服务

[root@bogon ~]# docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

上述命令中,如果镜像nginx不存在,则会自动从docker仓库进行下载

--replicas 任务数量即服务运行的个数。本例子为3个
-p         设置节点端口。 本例子端口为80
--name     服务名称。本例子服务名称为nginx 

nginx:1.13.7-alpine  为镜像。格式为:镜像名称:tag


如果想看create用法,可以使用命令 docker service create --help

接下来可以通过docker container ls命令,可以看到刚才的3台docker节点中都已启动了nginx容器

[root@bogon ~]# docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
8d64b2e77d09        nginx:1.13.7-alpine   "nginx -g 'daemon of…"   28 minutes ago      Up 28 minutes       80/tcp              nginx.3.vtofowd9du942qn6547kdzbkn

#查看服务

#使用 docker service ls 来查看当前 Swarm 集群运行的服务。
#REPLICAS 3/3   前面的3表示运行中的服务数量,后面的3表示总的服务数量
[root@bogon ~]# docker service ls       
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          3/3                 nginx:1.13.7-alpine   *:80->80/tcp


#使用 docker service ps 来查看某个服务的详情(如部署在哪个节点,服务状态,镜像等等),nginx为服务名称
[root@bogon ~]# docker service ps nginx
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE                ERROR                              PORTS
vrr8jqjixy34        nginx.1             nginx:1.13.7-alpine   bogon               Running             Running about an hour ago                                       
cjdf4zf09n4z         \_ nginx.1         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
s7v4xqx1f4jd         \_ nginx.1         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
slydwoksuwye         \_ nginx.1         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
728g11dbvwqh        nginx.2             nginx:1.13.7-alpine   bogon               Running             Running 43 minutes ago                                          
6hzkwzofdl7i         \_ nginx.2         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
h7d88zvj8du4         \_ nginx.2         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
vtofowd9du94        nginx.3             nginx:1.13.7-alpine   bogon               Running             Running about an hour ago                                       
qmn5hvrwtkh6         \_ nginx.3         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
ne0wrosgtmhy         \_ nginx.3         nginx:1.13.7-alpine   bogon               Shutdown            Rejected about an hour ago   "No such image: nginx:1.13.7-a…"   
[root@bogon ~]# 


#查看正在运行的某个服务在每个节点的运行情况
[root@manager ~]# docker service ps -f "DESIRED-STATE=Running" nginx 
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
sk8xr6an4btt        nginx.1             nginx:1.13.7-alpine   node2               Running             Running 13 minutes ago                       
f8oon9lvw09a        nginx.2             nginx:1.13.7-alpine   manager             Running             Running 14 minutes ago                       
to1tilzsomjb        nginx.3             nginx:1.13.7-alpine   node1               Running             Running 13 minutes ago                       
849634w1moma        nginx.4             nginx:1.13.7-alpine   node2               Running             Running 13 minutes ago                       
0t9sgrtd8kiy        nginx.5             nginx:1.13.7-alpine   manager             Running             Running 13 minutes ago                       
shz0rlutr8c3        nginx.6             nginx:1.13.7-alpine   node1               Running             Running 14 minutes ago     


#使用 docker service logs 来查看某个服务的日志。nginx为服务名称
[root@bogon ~]# docker service logs nginx

#删除服务

#使用 docker service rm 来从 Swarm 集群移除某个服务。

#移除服务之前,先看下当前有什么服务
[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
rb529p6g55ya        mongo               replicated          1/2                 mongo:latest          
io27pypwapy4        nginx               replicated          3/3                 nginx:1.13.7-alpine   *:80->80/tcp

#删除mongo服务
[root@bogon ~]# docker service rm mongo
mongo

#再次查看服务,发现mongo已被删除
[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          3/3                 nginx:1.13.7-alpine   *:80->80/tcp
[root@bogon ~]# 

#调整服务数量

docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
#本例子将原来nginx服务个数由3个调整为2个
#查看下原来的服务数
[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          3/3                 nginx:1.13.7-alpine   *:80->80/tcp

#调整服务为2
[root@bogon ~]# docker service scale nginx=2
nginx scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
[root@bogon ~]# 

#再次查看服务数
[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          2/2                 nginx:1.13.7-alpine   *:80->80/tcp
[root@bogon ~]# 


通过docker container ls在三台docker服务器上分别查看运行的容器发现有一台已经没有nginx服务了。


#接下来思考一下如果将服务副本数调整为5个,现在只有三台docker服务器,那么调整后会出现什么情况呢?
[root@bogon ~]# docker service scale nginx=5
nginx scaled to 5
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 
[root@bogon ~]# 

通过docker container ls 再次查看,发现有两台服务器上启动两个nginx服务,说明如果有三台docker服务器并且启动的服务数正好也是三个,则每个docker服务器分别分配一个服务

#停止集群中的服务

可以通过docker service scale nginx=0,将nginx服务个数设置为0

#停止之前,查看服务运行情况

[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          5/5                 nginx:1.13.7-alpine   *:80->80/tcp


#开始停止服务
[root@bogon ~]# docker service scale nginx=0
nginx scaled to 0
overall progress: 0 out of 0 tasks 
verify: Service converged 

#再次查看服务运行情况,发现已经没有正在运行的服务了
[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          0/0                 nginx:1.13.7-alpine   *:80->80/tcp

#通过docker container ls查看运行的docker容器,发现也没了
[root@bogon ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

当然也可以通过停止正在运行的容器来停止具体某个机器上的服务

docker stop 容器ID或容器名

#停止之前先看下服务运行状态
verify: Service converged 
[root@bogon ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          5/5                 nginx:1.13.7-alpine   *:80->80/tcp

#选择要停止服务的服务器,查看运行的容器
[root@bogon ~]# docker container ls
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
4e642b530568        nginx:1.13.7-alpine   "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        80/tcp              nginx.4.3r68n9z4jyuydeqyshq1iqkku
21de546363bd        nginx:1.13.7-alpine   "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        80/tcp              nginx.1.ovyg8ma03iutfle6r8qv7cyj4

#选中一台4e642b530568进行停止操作,docker stop 容器ID或容器名 
[root@bogon ~]# docker stop 4e642b530568
4e642b530568

#再次查看该服务器运行容器
[root@bogon ~]# docker container ls     
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS               NAMES
21de546363bd        nginx:1.13.7-alpine   "nginx -g 'daemon of…"   5 minutes ago       Up 5 minutes        80/tcp              nginx.1.ovyg8ma03iutfle6r8qv7cyj4
[root@bogon ~]# 

#回到管理节点,查看服务数量,发现少了一个
[root@bogon ~]# docker service ls  
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          4/5                 nginx:1.13.7-alpine   *:80->80/tcp
[root@bogon ~]# 

#更新服务

#将nginx的版本升级到1.13.8-alpine 
#先看下当前运行的服务使用的镜像
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          5/6                 nginx:1.13.7-alpine   *:80->80/tcp

#执行服务镜像更新。默认配置下,Swarm 一次只更新一个副本,并且两个副本之间没有等待时间。
#nginx为服务名
[root@manager ~]# docker service update --image nginx:1.13.8-alpine nginx
nginx
overall progress: 0 out of 6 tasks 
overall progress: 0 out of 6 tasks 
overall progress: 1 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: preparing [=================================>                 ] 
3/6: No such image: nginx:1.13.8-alpine@sha256:c8ff0187cc75e1f5002c7ca9841cb191… 
6/6:   


service update paused: update paused due to failure or early termination of task iyomg9d9pd0lqwr7kvp2yvvj1

#再次查看运行的服务使用的镜像,镜像已更新为nginx:1.13.8-alpine
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          5/6                 nginx:1.13.8-alpine   *:80->80/tcp

#回滚服务

如果更新后的镜像有问题,那么如何回滚?

方式一:使用docker service update --rollback nginx

请注意,--rollback 只能回滚到上一次执行 docker service update 之前的状态,并不能无限制地回滚。

#先看下原来的服务使用的镜像
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          6/6                 nginx:1.13.8-alpine   *:80->80/tcp

#执行回滚操作
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback 
overall progress: rolling back update: 6 out of 6 tasks 
1/6: running   [>                                                  ] 
2/6: running   [>                                                  ] 
3/6: running   [>                                                  ] 
4/6: running   [>                                                  ] 
5/6: running   [>                                                  ] 
6/6: running   [>                                                  ] 
verify: Service converged 

#再次查看服务镜像,发现已回滚到上次使用udpate时的镜像
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          6/6                 nginx:1.13.7-alpine   *:80->80/tcp

#那么再次执行回滚看看效果,发现又回滚到nginx:1.13.8-alpine 
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback 
overall progress: rolling back update: 6 out of 6 tasks 
1/6: running   [>                                                  ] 
2/6: running   [>                                                  ] 
3/6: running   [>                                                  ] 
4/6: running   [>                                                  ] 
5/6: running   [>                                                  ] 
6/6: running   [>                                                  ] 
verify: Service converged 
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          6/6                 nginx:1.13.8-alpine   *:80->80/tcp
[root@manager ~]# 


#那么再次执行回滚看看效果,发现又回滚到nginx:1.13.7-alpine 
[root@manager ~]# docker service update --rollback nginx
nginx
rollback: manually requested rollback 
overall progress: rolling back update: 6 out of 6 tasks 
1/6: running   [>                                                  ] 
2/6: running   [>                                                  ] 
3/6: running   [>                                                  ] 
4/6: running   [>                                                  ] 
5/6: running   [>                                                  ] 
6/6: running   [>                                                  ] 
verify: Service converged 
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          6/6                 nginx:1.13.7-alpine   *:80->80/tcp


#上述实验说明,--rollback操作只会回滚到上一次更新的镜像

方式二:还是通过docker service update --image nginx:1.13.7-alpine nginx 指定更新到原来的镜像

#先看下当前运行的服务使用的镜像
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          6/6                 nginx:1.13.8-alpine   *:80->80/tcp

#执行更新服务命令
[root@manager ~]# docker service update --image nginx:1.13.7-alpine nginx 
nginx
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged 

#查看当前运行的服务使用的镜像
[root@manager ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
io27pypwapy4        nginx               replicated          6/6                 nginx:1.13.7-alpine   *:80->80/tcp

 

 

Docker常用命令总结:https://blog.csdn.net/coolcoffee168/article/details/90237427

docker命令官网教程:https://docs.docker.com/engine/reference/commandline/swarm_leave/

 

https://www.cnblogs.com/bigberg/p/8761226.html


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值