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

在这个小节,我们来部署一个服务,基于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.6
0u6a4s31ybk7yw2wyvtikmu50


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


--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 redis
ID:             0u6a4s31ybk7yw2wyvtikmu50
Name:           redis
Service Mode:   Replicated
 Replicas:      3
Placement:
 Strategy:    Spread
UpdateConfig:
 Parallelism:   1
 Delay:         10s
ContainerSpec:
 Image:         redis:3.0.6
Resources:
Endpoint Mode:  vip



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

$ docker service update --p_w_picpath redis:3.0.7 redis
redis


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

  1. 停止第一个任务

  2. 计划更新停止的任务

  3. 启动更新完毕的任务

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

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

$ docker service inspect --pretty redis
ID:             0u6a4s31ybk7yw2wyvtikmu50
Name:           redis
Service Mode:   Replicated
 Replicas:      3
Placement:
 Strategy:    Spread
UpdateConfig:
 Parallelism:   1
 Delay:         10s
ContainerSpec:
 Image:         redis:3.0.7
Resources:
Endpoint Mode:  vip


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

$ docker service inspect --pretty redis
ID:             0u6a4s31ybk7yw2wyvtikmu50
Name:           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 redis
NAME                                   IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERROR
redis.1.dos1zffgeofhagnve8w864fco      redis:3.0.7  worker1    Running        Running 37 seconds
 \_ redis.1.88rdo6pa52ki8oqx6dogf04fh  redis:3.0.6  worker2    Shutdown       Shutdown 56 seconds ago
redis.2.9l3i4j85517skba5o7tn5m8g0      redis:3.0.7  worker2    Running        Running About a minute
 \_ redis.2.66k185wilg8ele7ntu8f6nj6i  redis:3.0.6  worker1    Shutdown       Shutdown 2 minutes ago
redis.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