プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/04/24

[Docker] Swarm モードのローリングアップデートを試してみた

event_note2022/04/24 8:33

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