一、系统环境

  1)服务器环境

节点名称 IP 操作系统 内核版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

  2)前提条件

  • Docker版本1.12+
  • 集群节点之间保证TCP 2377、TCP/UDP 7946和UDP 4789端口通信   

    TCP端口2377集群管理端口

    TCP与UDP端口7946节点之间通讯端口

    TCP与UDP端口4789 overlay网络通讯端口

二、集群部署

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

[root@master ~]# docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95: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联系。命令的输出包含了其它节点如何加入集群的命令。

  使用docker info 或者 docker node ls 查看集群中的相关信息 

docker info 

.......
Swarm: active
NodeID: kfi2r4dw6895z5yvhlbyzfck6
Is Manager: true
ClusterID: y2zgs373cg0y6559t675yexcj
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5 .......

  

  2)添加节点到swarm集群中

  所有节点执行 

docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377

  在master上查看集群节点的状态

  

  到此Swarm集群就创建好了

  3)docker  node 命令 

[root@master ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Options:

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
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
update Update a node # demote
将管理节点降级为普通节点
# inspect
查看节点的详细信息
# ls
列出节点
# promote
将普通节点升级为管理节点
# ps
查看运行的任务
# rm
从swarm集群中删除节点
# update
改变集群节点状态

docker node 命令

[root@master ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
--availability string Availability of the node ("active"|"pause"|"drain")
--label-add list Add or update a node label (key=value)
--label-rm list Remove a node label if exists
--role string Role of the node ("worker"|"manager") # 主要使用availability string # active
节点状态正常
# pause
节点挂起、暂停
# drain
排除节点,比如将master节点排除,不分配任务,只作为管理节点

node update命令

三、在Swarm中部署服务

  1)创建服务 

[root@master ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Options:

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 service

docker service 

[root@master ~]# docker service create --replicas 1 --name hello busybox

#  --replicas : 副本集个数

# --name:服务名称

  2)查看服务信息

[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kosznwn4ombx hello replicated 0/1 busybox:latest

  从REPLICAS中能看出这个 hello服务并没有启动起来,0/1 表示 1计划启动的副本数,0实际启动的数量。所以启动失败  

  

  3)添加参数

  在hello服务中busybox只是一个基础镜像,并没有一个持续运行的任务,所以manager会不断重启hello这个服务,所以有好多shutdown的记录。但是可以为其添加一个任务。 

[root@master ~]# docker service update --args "ping www.baidu.com" hello
hello
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged # update:更新状态 # --args:增加参数

  再次查看状态:

  

  过滤不正常的状态: 

[root@master ~]# docker service ps -f "desired-state=running" hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
yxyivio4mzlg hello.1 busybox:latest master Running Running 4 minutes ago # -f "desired-state=running" : 状态为runngin的服务

  4)为服务扩容(缩融)scale

  刚才设置的replicas=1,可以增加副本数量

[root@master ~]# docker service scale hello=4

hello scaled to 4
overall progress: 4 out of 4 tasks
1/4: running
2/4: running
3/4: running
4/4: running
verify: Service converged # scale : 指定服务的数量

  

  5)工作节点排除manager,manager只作为管理节点

  上图中manager也运行了一个服务,将manager排除在外

[root@manager ~]# docker node update --availability drain manager

# node update : 更改节点状态

# --availability : 三种状态

   active: 正常
pause:挂起
drain:排除

  排除manager后,其上面运行的服务会转移到其他节点 

  

四、滚动更新服务

  例如升级服务的镜像版本 

[root@manager ~]# docker service create \
> --replicas 3 \
> --name redis \
> --update-delay 10s \
> redis:3.0.6 # 启动3个副本集的redis # update-delay 10s :每个容器依次更新,间隔10s

  滚动更新:

docker service update --image redis:3.0.7 redis

# --image : 指定版本

  更新完成后新版本和历史记录都能查看

  

  查看配置信息:

  

五、服务更新和回滚策略

  1)设置策略  

[root@manager ~]# docker service create \
--name my-web \
--replicas 10 \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio 0.2 \
nginx:1.12.1 # --update-parallelism 2 : 每次允许两个服务一起更新 #--update-failure-action continue : 更新失败后的动作是继续 # --rollback-parallelism 2 : 回滚时允许两个一起 # --rollback-monitor 20s :回滚监控时间20s # --rollback-max-failure-ratio 0.2 : 回滚失败率20%

  如果执行后查看状态不是设置的,可以在update一下,将服务状态设置为自己想要的

docker service update --rollback-monitor 20s  my-web

docker service update --rollback-max-failure-ratio 0.2 my-web

# 有两个地方设置数值没有成功,手动设置

  查看状态:

  

  

  2)服务更新

[root@manager ~]# docker service update --image nginx:1.13.5 my-web

  和上述策略一致,两两更新

  

  更新完成:

  

  3)手动回滚(策略是失败会回滚,现在没有失败)

  刚才nginx版本已经是1.13.5了,现在将其还原到1.12.1 

[root@manager ~]# docker service update --rollback my-web

  

  手动回滚成功

Docker Swarm集群部署的更多相关文章

  1. Docker(二十一)-Docker Swarm集群部署

    介绍 Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm ...

  2. 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

    在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...

  3. Docker Swarm集群中部署Traefik负载均衡器

    一.创建单节点的Docker Swarm集群 docker swarm init 二.在Swarm集群中创建一个网络 docker network create --driver=overlay tr ...

  4. Docker Swarm 集群环境搭建及弹性服务部署

    上一篇文章<Docker Swarm 集群管理利器核心概念扫盲>中我们把 Swarm 重要的概念性知识给大家讲解了一波,理论完事就该实战了,这篇文章带大家从零开始,搭建 Docker Sw ...

  5. 通过docker-machine和etcd部署docker swarm集群

    本片文章介绍一下 使用docker-machine 搭建docker swarm 集群:docker swarm是docker 官方搭建的容器集群编排工具:容器编排,就是可以使你像使用一太机器一样来使 ...

  6. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  7. 故障公告:docker swarm集群“群龙无首”引发部分站点无法访问

    今天傍晚 17:38-18:18 左右,由于 docker swarm 集群出现 "The swarm does not have a leader" 问题,造成博问.闪存.园子. ...

  8. 云计算之路-阿里云上-容器难容:自建docker swarm集群遭遇无法解决的问题

    我们从今年6月开始在生产环境进行 docker 容器化部署,将已经迁移至 ASP.NET Core 的站点部署到 docker swarm 集群上.开始我们选用的阿里云容器服务,但是在使用过程中我们遭 ...

  9. 云计算之路-阿里云上:docker swarm 集群故障与异常

    在上次遭遇 docker swarm 集群故障后,我们将 docker 由 17.10.0-ce 升级为最新稳定版 docker 17.12.0-ce . 前天晚上22:00之后集群中的2个节点突然出 ...

随机推荐

  1. check-versions.js和dev-client.js

    // 用于在控制台输出带颜色字体的插件var chalk = require('chalk') // 语义化版本检查插件(The semantic version parser used by npm ...

  2. cherry-pick 命令

    拣选会提取某次提交的补丁,之后尝试将其重新应用到当前分支上. 这种方式在你只想引入特性分支中的某个提交时很有用. 假设你的项目提交历史如下: 如果你希望将提交 e43a6 拉取到 master 分支, ...

  3. stark组件开发之自动生成URL

    app01\model.py from django.db import models # Create your models here. class Depart(models.Model): i ...

  4. sql like 语句

    a like '%b%'的意思是,在a中找类似b的字符,在检索以逗号分隔的字段中时,两次弄反了顺序,比如,在a字段中查找有没有类似‘2,3’的记录,应该这么写:','+'2,3' like '%,'+ ...

  5. laravel 门面的介绍和使用

    #上文讲述了laravel中怎么用容器依赖注入类的示例.其实在服务提供者上面在封装一层静态调用,这就是门面.静态调用门面,返回了容器中注册的别名和实例. #下面是测试的示例 #先创建要操作的类 < ...

  6. javascript 高级程序设计 一

    前言: 作为一个即将毕业.正在实习的大学生,我也默默的进入了开发者的行列.从一开始的c#编码狗到java程序员再到现在的JS开发者,我一直 希望自己可以在这个'万恶'的互联网时代走的更远.但是我还是一 ...

  7. ICS 组件 for lazarus 1.0.12

    http://files.cnblogs.com/stevenlaz/ICS_for_lazarus_1012.zip RT 需要的下

  8. 测试 Open Live Writer

    我要试试. 看看图片如何: 这是从电脑端上传的一个例子,如果编辑器里可以支持复制粘贴图片就好了. Open Live Writer 发布以后,还可在保存在本地,想起来的时候就修改一下. 再美化一下. ...

  9. 【jdbcTemplate】baseDao书写规范

    今天加班,为了下个月的北京之行,希望父亲身体安康,一切顺利: 老大今天发出来同事的代码,并标记了jdbcTemplate的书写规范,此处查询数据库之前声明对象时,不用new出来,因为在底层源码中已经给 ...

  10. 762. Prime Number of Set Bits in Binary Representation

    static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...