使用Docker Stack部署应用( 六 )


$ docker service logs seastack_reverse_proxyseastack_reverse_proxy.1.zhc3cjeti9d4@wrk-2 | [emerg] 1#1: host not found...seastack_reverse_proxy.1.6m1nmbzmwh2d@wrk-2 | [emerg] 1#1: host not found...seastack_reverse_proxy.1.6m1nmbzmwh2d@wrk-2 | Nginx: [emerg] host not found..seastack_reverse_proxy.1.zhc3cjeti9d4@wrk-2 | nginx: [emerg] host not found..seastack_reverse_proxy.1.1tmya243m5um@mgr-1 | 10.255.0.2 "GET / HTTP/1.1" 302输出内容为了适应页面展示,已经经过裁剪,但是读者还是可以看到全部3个服务副本的日志(两个启动失败,1个正在运行) 。每行的开始都是副本的名称,包括服务名称、副本序号、副本ID以及副本所在主机的名称 。接下来是具体的日志输出 。
注:


读者可能已经注意到前面日志中全部副本的序号都是1 。这是因为Docker每次只创建一个副本,并且只有当前面的副本启动失败时才会创建新的 。
因为输出内容经过裁剪,所以具体原因很难明确,但看起来前两次副本启动失败原因是其依赖的某个服务仍然在启动中(一种启动时服务间依赖导致的竞争条件) 。
读者可以继续跟踪日志(--follow),查看日志尾部内容(--tail),或者获取额外的详细信息(--details) 。
现在Stack已经启动并且处于运行中,看一下如何管理stack 。
14.2.4 管理应用Stack是一组相关联的服务和基础设施,需要进行统一的部署和管理 。虽然这句话里充斥着术语,但仍提醒我们Stack是由普通的Docker资源构建而来:网络、卷、密钥、服务等 。这意味着可以通过普通的Docker命令对其进行查看和重新配置,例如docker network、docker volume、docker secret、docker service等 。
在此前提之下,通过docker service命令来管理Stack中某个服务是可行的 。一个简单的例子是通过docker service scale命令来扩充appserver服务的副本数 。但是,这并不是推荐的方式!
推荐方式是通过声明式方式修改,即将Stack文件作为配置的唯一声明 。这样,所有Stack相关的改动都需要体现在Stack文件中,然后更新重新部署应用所需的Stack文件 。
下面是一个简单例子,阐述了为什么通过命令修改的方式不好(通过CLI进行变更) 。
假设读者已经部署了一个Stack,采用的Stack文件是前面章节中从GitHub复制的仓库中的docker-stack.yml 。这意味着目前appserver服务有两个副本 。如果通过docker service scale命令将副本修改为4个,当前运行的集群会有4个副本,但是Stack文件中仍然是两个 。得承认目前看起来还不是特别糟糕 。但是,假设读者又通过修改Stack文件对Stack做了某些改动,然后通过docker stack deploy命令进行滚动部署 。这会导致appserver服务副本数被回滚到两个,因为Stack文件就是这么定义的 。因此,推荐对Stack所有的变更都通过修改Stack文件来进行,并且将该文件放到一个合适的版本控制系统当中 。
一起来回顾对Stack进行两个声明式修改的过程 。目标是进行如下改动 。
  • 增加appserver副本数,数量为2~10 。
  • 将visualizer服务的优雅停止时间增加到2min 。
修改docker-stack.yml文件,更新两个值:services.appserver.deploy.replicas=10和services.visualizer.stop_grace_period=2m 。
目前,Stack文件中的内容如下 。
<Snip>appserver:image: dockersamples/atsea_appnetworks:- front-tier- back-tier- paymentdeploy:replicas: 10<<Updated value<Snip>visualizer:image: dockersamples/visualizer:stableports:- "8001:8080"stop_grace_period: 2m<<Updated value<Snip保存文件并重新部署应用 。
$ docker stack deploy -c docker-stack.yml seastackUpdating service seastack_reverse_proxy (id: z4crmmrz7zi83o0721heohsku)Updating service seastack_database (id: 3vvpkgunetxaatbvyqxfic115)Updating service seastack_appserver (id: ljht639w33dhv0dmht1q6mueh)Updating service seastack_visualizer (id: rbwoyuciglre01hsm5fviabjf)Updating service seastack_payment_gateway (id: w4gsdxfnb5Gofwtvmdiooqvxs)以上重新部署应用的方式,只会更新存在变更的部分 。
运行docker stack ps命令来确认appserver副本数量确实增加 。
$ docker stack ps seastackNAMENODEDESIRED STATE CURRENT STATEseastack_visualizer.1mgr-1 RunningRunning 1 second agoseastack_visualizer.1mgr-1 ShutdownShutdown 3 seconds agoseastack_appserver.1wrk-2 RunningRunning 24 minutes agoseastack_appserver.2wrk-1 RunningRunning 24 minutes agoseastack_appserver.3wrk-2 RunningRunning 1 second agoseastack_appserver.4wrk-1 RunningRunning 1 second agoseastack_appserver.5wrk-2 RunningRunning 1 second agoseastack_appserver.6wrk-1 RunningStarting 7 seconds agoseastack_appserver.7wrk-2 RunningRunning 1 second agoseastack_appserver.8wrk-1 RunningStarting 7 seconds agoseastack_appserver.9wrk-2 RunningRunning 1 second agoseastack_appserver.10wrk-1 RunningStarting 7 seconds ago


推荐阅读