在上一个小节,我们在一个服务中,扩容了多个实例。

在这个小节,我们来部署一个服务,基于redis3.0.6容器镜像。

然后通过滚动升级,升级到redis3.0.7

docker machine ssh manager1

在swarm中部署 redis3.0.6 ,并配置swarm 10秒的更新延迟

$ docker service create \  --replicas 3 \  --name redis \  --update-delay 10s \  redis:3.0.60u6a4s31ybk7yw2wyvtikmu50

你可以在部署的时候配置滚动更新的策略

--update-delay 参数用来配置更新服务或者配置任务的延迟时间

T 用来描述 时间的值

Ts  表示多少秒

Tm 表示多少分钟

Th  表示多少小时

例如   10m30s  表示  10分钟30秒的延迟

默认情况下,计划任务在同一时间只更新一个任务。

--update-parallelism  参数可以配置同时更新服务的最大数量

默认情况下,当一个更新一个任务,返回的状态是 running .计划任务会计划更新下一个,直到所有的任务都更新完毕。如果有其他更新的任务返回 failed ,计划任务将会停止该更新。

你可以通过  --update-failure-action 来控制该行为。

在使用  docker service create 或者是  docker service update 的时候

$ docker service inspect --pretty redisID:             0u6a4s31ybk7yw2wyvtikmu50Name:           redisService Mode:   Replicated Replicas:      3Placement: Strategy:    SpreadUpdateConfig: Parallelism:   1 Delay:         10sContainerSpec: Image:         redis:3.0.6Resources:Endpoint Mode:  vip

现在你可以更新swarm 集群中的镜像了

$ docker service update --p_w_picpath redis:3.0.7 redisredis

默认的滚动更新步骤如下:

  1. 停止第一个任务

  2. 计划更新停止的任务

  3. 启动更新完毕的任务

  4. 如果更新的任务返回的是running,等待下一个延迟周期,更新下一个任务。

  5. 如果更新返回的是failed ,停止更新

$ docker service inspect --pretty redisID:             0u6a4s31ybk7yw2wyvtikmu50Name:           redisService Mode:   Replicated Replicas:      3Placement: Strategy:    SpreadUpdateConfig: Parallelism:   1 Delay:         10sContainerSpec: Image:         redis:3.0.7Resources:Endpoint Mode:  vip

如果更新失败,会返回如下的信息:

$ docker service inspect --pretty redisID:             0u6a4s31ybk7yw2wyvtikmu50Name:           redis...snip...Update status: State:      paused Started:    11 seconds ago Message:    update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b...snip...

重启一个停止的更新:

docker service update <SERVICE-ID>

docker service update redis

为了避免重复更新失败,你可以需要通过下列的参数来重新配置服务

docker service updatte .

通过以下命令来查看滚动更新

docker service ps <SERVICE-ID>

$ docker service ps redisNAME                                   IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERRORredis.1.dos1zffgeofhagnve8w864fco      redis:3.0.7  worker1    Running        Running 37 seconds \_ redis.1.88rdo6pa52ki8oqx6dogf04fh  redis:3.0.6  worker2    Shutdown       Shutdown 56 seconds agoredis.2.9l3i4j85517skba5o7tn5m8g0      redis:3.0.7  worker2    Running        Running About a minute \_ redis.2.66k185wilg8ele7ntu8f6nj6i  redis:3.0.6  worker1    Shutdown       Shutdown 2 minutes agoredis.3.egiuiqpzrdbxks3wxgn8qib1g      redis:3.0.7  worker1    Running        Running 48 seconds \_ redis.3.ctzktfddb2tepkr45qcmqln04  redis:3.0.6  mmanager1  Shutdown       Shutdown 2 minutes ago

在所有任务被更新之前,你可以看到有些任务是跑redis:3.0.6, 有些是 redis:3.0.7