在上一个小节,我们在一个服务中,扩容了多个实例。
在这个小节,我们来部署一个服务,基于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
默认的滚动更新步骤如下:
停止第一个任务
计划更新停止的任务
启动更新完毕的任务
如果更新的任务返回的是running,等待下一个延迟周期,更新下一个任务。
如果更新返回的是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