docker入门(10)--零中断部署

本节主要学习,如何在不终止服务的情况下,升级服务中的应用等。
为了做到零终端,通常,我们应用的部署策略有三种:

三者的一些比较:
微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结
蓝绿部署、金丝雀发布(灰度发布)、A/B测试的准确定义
docker swarm默认支持Rolling updates的开箱即用。其他两种方式可通过扩展支持。

1. 滚动部署

关于原理部分可参考上面的链接,下面我们进行实践。
定义一个包含rolling update相关配置的stack,命名为rolling-update.yml:

version: "3.5"
services:
  web:
    image: nginx:1.13-alpine
    ports:
      - 8080:80
    deploy:
      replicas: 10
      update_config:
        parallelism: 2
        delay: 10s

上面的大部分内容之前都学习过,我们这里主要看update_config部分。上面的配置表示,一共会启用10个task,在升级时,每2个task会成为一组进行升级操作,每一组升级成功之后,间隔10s开始下一组的升级。

1、开始部署上面的stack:
docker stack deploy -c rolling-update.yml web命令执行部署,部署完成后,可以使用watch docker stack ps web命令查看,刚开始可能如下图,正在Preparing的一般是镜像还没有拉取下来,要等到超时之后下一次重试(每次重试间隔大约5分钟,应该是可以进行相关设置的。在我没换国内镜像仓库之前失败的次数更多,不过镜像下载一次之后,后续就不用下载了,部署起来速度很快)。


所有的task都必须正常启动了之后,才能开始进行下面的升级工作,如下:


2、升级上面的stack
执行升级之前,建议再开一个窗口,并且将docker-machine环境变量设置为node-1,然后执行watch docker stack ps web,可以实时查看相关进度。
执行如下命令,升级上面stack中的nginx版本:
docker service update --image nginx:1.14-alpine web_web
可以看到就是每次两个task进行升级操作,其他task继续提供服务。


3、测试完成,删除stack
docker stack rm web

2. 健康检查

有时候,你在查看容器运行的状态时,它可能是显示OK的状态,但容器内的应用是否OK,你这个时候还无法确定。因此,我们通常使用健康检查来确定一个服务是否确实在正常运行。
我们通常有两种方式来定义健康检查。

2.1 Dockerfile定义健康检查

我们可以在制作镜像时,就为镜像内的服务定义健康检查,通常如下:

FROM alpine:3.6
...
HEALTHCHECK --interval=30s \
    --timeout=10s
    --retries=3
    --start-period=60s
    CMD curl -f http://localhost:3000/health || exit 1
...

--start-period=60s:通常服务的启动,需要一定时间,在这段时间内不会执行健康检查。
--interval=30s:每次检查的时间间隔。
--timeout=10s:每次检查的超时时间。
--retries=3:重试多少次后,认为服务不可用。
CMD curl -f http://localhost:3000/health || exit 1:通过在容器内执行什么命令,来检查服务是否可用。

2.2 stack file文件内定义健康检查

一个示例如下:

version: "3.5"
services:
  web:
    image: nginx:alpine
    healthcheck:
      test: ["CMD", "wget", "-qO", "-", "http://localhost"]
      interval: 5s
      timeout: 2s
      retries: 3
      start_period: 15s

参数与上面的Dockerfile中的类似,需要注意的是:1、你必须为每个service定义一个健康检查,而不是对整个stack进行。2、如果你的service所引用的镜像内已经包含健康检查,那么这里的定义会覆盖它。

部署上面的示例看看:
docker stack deploy -c stack-health.yml myapp


你会看到与之前有所不同的地方是,在STATUS栏,多了个healthy。

3. 回滚操作

可能有多种原因造成新的版本,确实新版无法正常运行的时候,我们需要预定义好回滚操作。
一个配置示例如下:

version: "3.5"
services:
  web:
    image: nginx:1.12-alpine
    ports:
      - 80:80
    deploy:
      replicas: 10
      update_config:
      parallelism: 2
      delay: 10s
      
      failure_action: rollback
      monitor: 10s
      
    healthcheck:
      test: ["CMD", "wget", "-qO", "-", "http://localhost"]
      interval: 2s
      timeout: 2s
      retries: 3
      start_period: 2s

通过前面的知识,我们知道,一个task要被确认为不健康的状态,需要的时间是:start_period + interval*retries,因此,这里需要8秒钟。
monitor: 10s:定义在一个task开始部署后,需要对它持续监控的时间,用来决定是否进行下一组的升级操作。因此,需要大于上面的8秒。
failure_action: rollback:该参数在默认情况下,如果发现升级失败,那么会立即停止这次升级,并保持这个状态退出升级(例如前面包含10个task,每次升级2个的service,会保持其余8个task还是运行老旧版本的状态,并对外提供服务)。而我们如果配置为rollback值的话,表示进行回滚操作,那2个失败的task会恢复运行之前的版本,并提供服务。

4. 密码管理

我们经常需要向容器内传递一些敏感信息,例如最常见的密码。我们可以通过-e参数来指定传入的变量以及对应的值,但是,这样我们的密码就以明文形式暴露了。为了解决这个问题,docker swarm 提供了 secret 机制。
secret需要由manager节点创建,并保存。worker需要使用的时候,通过tmpFS文件系统挂载使用。

4.1 创建密码

从标准输出创建:
echo "sample secret value" | docker secret create sample-secret -
读取文件内容创建:
docker secret create other-secret ~/my-secrets/secret-value.txt
查看当前已有的密码和审查:

[root@node2 swarm]# docker secret ls
ID                          NAME                DRIVER              CREATED             UPDATED
ams8zjhm15z8qpfv9mgv5wrv9   sample-secret                           7 seconds ago       7 seconds ago
[root@node2 swarm]# docker secret inspect sample-secret
[
    {
        "ID": "ams8zjhm15z8qpfv9mgv5wrv9",
        "Version": {
            "Index": 893
        },
        "CreatedAt": "2018-11-05T03:20:51.9911386Z",
        "UpdatedAt": "2018-11-05T03:20:51.9911386Z",
        "Spec": {
            "Name": "sample-secret",
            "Labels": {}
        }
    }
]

4.2 使用密码

[root@node2 swarm]# docker service create --name web \
> --secret sample-secret \
> --publish 8000:8000 \
> fundamentalsofdocker/whoami:latest

jwwd32a5qbld0lviruneezcl5
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged
[root@node2 swarm]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                                PORTS
jwwd32a5qbld        web                 replicated          1/1                 fundamentalsofdocker/whoami:latest   *:8000->8000/tcp
[root@node2 swarm]# docker service ps web
ID                  NAME                IMAGE                                NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
kd8jknn6llb6        web.1               fundamentalsofdocker/whoami:latest   node-3              Running             Running 47 seconds ago
[root@node2 swarm]# docker-machine ssh node-3
docker@node-3:~$ docker container ls
CONTAINER ID        IMAGE                                COMMAND             CREATED             STATUS              PORTS               NAMES
cf2952b075cc        fundamentalsofdocker/whoami:latest   "/app/http"         2 minutes ago       Up 2 minutes        8000/tcp            web.1.kd8jknn6llb6vfgne68of5v01
docker@node-3:~$ docker container exec -it cf2952b075cc cat /run/secrets/sample-secret
sample secret value

以上操作为:
1、创建一个使用了sample-secret密码的service。
2、查看对应的task在哪个节点上,node-3。
3、登录到node-3上,查看对应的容器。
4、在容器内执行cat /run/secrets/sample-secret,可以得到明文的密码。
以上操作表明了,默认会把密码挂载到容器的/run/secrets/目录下。
当然,你也可以通过--secret参数,把密码挂载到容器的指定目录下:
--secret source=sample-secret,target=/run/my-secrets/api-secret-key

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342