サービスにローリング・アップデートを適用¶
チュートリアルの前のステップでは、サービスのインスタンス数を スケール しました。次のチュートリアルは Redis 3.0.6 コンテナ・イメージをベースとしたサービスをデプロイします。そして、ローリング・アップデートで Redis 3.0.7 コンテナ・イメージを使うサービスに更新します。
- 準備がまだであれば、ターミナルを開き、マネージャ・ノードを実行しているマシンに SSH で入ります。たとえば、このチュートリアルでは
manager1
という名前のマシンを使います。
- Redis 3.0.6 を swarm の全てのノードにデプロイします。そして、各ノードの更新を10秒ごとに行うよう swarm に設定します。
$ docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6
0u6a4s31ybk7yw2wyvtikmu50
これはサービスのデプロイ時のローリング・アップデート・ポリシーを設定しました。
--update-parallelism
フラグは、同時に実行するサービス・タスク数を指定します。
--update-delay
フラグは、サービス・タスクやタスク・セットを更新する遅延時間を指定します。時間 T
を、秒数 Ts
、分 Tm
、時 Th
の組み合わせで記述できます。たとえば 10m30s
は 10 分 30 秒の遅延です。
redis
サービスを調べます。
$ docker service inspect redis --pretty
ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Mode: REPLICATED
Replicas: 3
Placement:
Strategy: SPREAD
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.6
redis
用のコンテナ・イメージを更新します。 swarm マネージャ はUpdateConfig
ポリシーに基づいてノード更新を適用します。
$ docker service update --image redis:3.0.7 redis
redis
docker service inspect --pretty redis
を実行し、新しいイメージの期待状態を確認します。
docker service inspect --pretty redis
ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Mode: REPLICATED
Replicas: 3
Placement:
Strategy: SPREAD
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.7
docker service tasks <タスクID>
を実行し、ローリング・アップデートを監視します。
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
dos1zffgeofhagnve8w864fco redis.1 redis redis:3.0.7 Running 37 seconds Running worker1
9l3i4j85517skba5o7tn5m8g0 redis.2 redis redis:3.0.7 Running About a minute Running worker2
egiuiqpzrdbxks3wxgn8qib1g redis.3 redis redis:3.0.7 Running 48 seconds Running worker1
Swarm が全てのタスクを更新するまで、 redis:3.0.6
として実行中のイメージが redis:3.0.7
に切り替わるのが見えるでしょう。先ほどの出力はローリング・アップデートが完了した状態です。各インスタンスが RUNNING
(実行中)の状態になるのに、それぞれ約 10 秒ずつ増えているのが分かります。
次は Swarm から ノードを解放 する方法を学びます。
参考
- Apply rolling updates to a service
- https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/