Docker Swarm のチュートリアルの続きで、ローリングアップデートを試してみました。
前回の記事は以下。
準備
redis:3.0.6
のイメージでサービスを開始します。
$ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
zzbrzxvmf40nt9jj8dw0upfqf
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
--replicas 3
を指定しているので、タスク(コンテナ)が3つ作成されます。
これを今から redis:3.0.7
のイメージを使うようにアップデートします。
--update-parallelism
で同時に更新するタスクの数を指定できるようですが、今回は指定していないので、1つずつ更新されていきます。
また、--update-delay 10s
を指定しているので、各タスクの更新は10秒の間隔を空けて行われます。
確認
アップデートの前に先に現状を確認します。
$ docker service inspect --pretty redis
ID: zzbrzxvmf40nt9jj8dw0upfqf
Name: redis
Service Mode: Replicated
Replicas: 3
Placement:
UpdateConfig:
Parallelism: 1
Delay: 10s
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842
Init: false
Resources:
Endpoint Mode: vip
以下はチュートリアルにはありませんが、もう少しサービスの状況を確認しておきます。
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
zzbrzxvmf40n redis replicated 3/3 redis:3.0.6
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
78sw528i15lh redis.1 redis:3.0.6 worker1 Running Running 2 minutes ago
ryj86p3my9v4 redis.2 redis:3.0.6 manager1 Running Running about a minute ago
cwoso93243ra redis.3 redis:3.0.6 worker1 Running Running 2 minutes ago
redis
というサービスが2つのノード上で合計3つ動作しているのが確認できます。
アップデート
以下のコマンドで、redis:3.0.7
にアップデートを開始します。
$ docker service update --image redis:3.0.7 redis
別の端末で docker service ps
を実行すれば、タスク(コンテナ)が順にアップデートされていくのが確認できます。
確認
アップデートが全て完了したら、以下のように各タスク(コンテナ)が redis:3.0.6
から redis:3.0.7
にアップデートされているのが確認できます。
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
9zedj7hcwbsk redis.1 redis:3.0.7 manager1 Running Running 12 seconds ago
yy3ov31879rx \_ redis.1 redis:3.0.6 manager1 Shutdown Shutdown 13 seconds ago
fize7rde390v redis.2 redis:3.0.7 worker1 Running Running 59 seconds ago
tn49red4crkq \_ redis.2 redis:3.0.6 worker1 Shutdown Shutdown about a minute ago
os380kdgnmfg redis.3 redis:3.0.7 manager1 Running Running 37 seconds ago
3scdfazrhn6z \_ redis.3 redis:3.0.6 Pworker1 Shutdown Shutdown about a minute ago
アップデートに失敗した場合
アップデートに失敗した場合は処理が一時停止状態になるようです。docker service inspect
でアップデートの状況を確認できます。
$ docker service inspect --pretty redis
一時停止した更新を再開するには、 docker service update <サービス ID>
を実行します。
$ docker service update redis