コンテナの移動

ke2-docker を用いた構成した Docker swarm クラスタ構成では、明示的にコンテナを移動する操作を行なう必要はありません。 まず、ほとんどのコンテナは全てのノードでレプリカされて、全てがアクティブとして動作するため、コンテナを移動する意味はありません。

KE2.0 の時点では唯一、redis コンテナについては 単一のノードでのみ動作するように構成されています。 そのため redis コンテナについてはどのノードで動作しているのか、動作するノードが移動するケースについて、また、強制的に動作ノードを移動させたい場合の手法について説明します。

redis コンテナを実行しているノードの確認

現在どのノードで redis コンテナが動作しているかについては、docker service ps コマンドを用いて確認することができます。

$ docker service ps ke2_redis
ID             NAME              IMAGE                                              NODE          DESIRED STATE   CURRENT STATE          ERROR                              PORTS
j002f9kno7ma   ke2_redis.1       registry.hub.docker.com/library/redis:7.2-alpine   ke2-server1   Running         Running 25 hours ago
g7lg28hnfupv    \_ ke2_redis.1   registry.hub.docker.com/library/redis:7.2-alpine   ke2-server1   Shutdown        Failed 25 hours ago    "No such container: ke2_redis.…"
ngwsnwc20fqk    \_ ke2_redis.1   registry.hub.docker.com/library/redis:7.2-alpine   ke2-server1   Shutdown        Failed 25 hours ago    "No such container: ke2_redis.…"

コマンドを実行して表示される結果の DESIRED STATE が "Running" となっている行の NODE で、現在 redis コンテナを実行しているノードが確認できます。 以下のようにいくつかオプションを付けて実行すると、当該するノードの情報だけ表示することができます。

$ docker service ps -f desired-state=running --format "{{.Node}}" ke2_redis
ke2-server1

redis コンテナが移動するタイミング

クラスタが開始したとき(2台目のノードが開始したとき)いずれかのノードで redis コンテナが起動します。 基本的に redis コンテナはそのノードから移動せずに動作しつづけますが、以下のようなときには別のノードに移動して動作を再開する場合があります。

  • redis コンテナがダウンしたとき(移動せず同じノードで再起動となる場合もあります)
  • redis コンテナが動作しているノードがダウンしたとき
  • 強制的に redis コンテナを移動させたとき

redis コンテナの移動方法【非推奨】

Docker swarm クラスタにおいて、あるコンテナを指定したノードに移動させる決まった手順はありません。 以下のように docker service update コマンドを用いることで、redis コンテナの状態更新が行なわれて、その結果として別のノードに移動する場合があります(同じノードでの再起動となる場合もあります)。

$ docker service update --force ke2_redis

ただし、redis コンテナが移動(もしくは再起動)すると動作中のジョブフローが異常終了するなどの影響が起きる場合がありますので、特別な理由がない限り redis コンテナの移動は控えることを推奨します。