Docker Desktop上では、Swarmクラスターを作成し、(MySQL等のコンテナを)デプロイすることで、スケーラビリティと冗長性を持ったDockerアプリケーションとしての実行が可能になります。
ここでは、WebアプリケーションのデータベースとしてMySQLを使用する環境において、冗長性と可用性を確保する目的で、MySQLコンテナをSwarmクラスター上にデプロイしてみました。
1.Swarmクラスター構築
以下の手順でSwarmクラスターを構築しました。
(1)Docker Swarmクラスター作成
以下の手順で、Docker Swarmクラスターを作成しました。
① Swarmクラスター作成
> docker swarm init

② マネージャーノード情報(IPアドレスとポート番号)
クラスターの作成が成功したら、マネージャーノードのIPアドレスとポート番号をメモします。
ここでは、(上図の赤丸の部分から)
・IPアドレス: 192.168.65.4
・ポート番号: 2377
になります。
(2)MySQLコンテナ作成
以下の手順で、MySQLコンテナを2つ作成します。
① Dockerコンテナの元にするイメージの確認
ここでは、Docker Desktopの[Images]で表示されている「mysql8.0.33-image」を使用しました。
※もしまだイメージをダウンロードしていない場合は、「mysql:latest」と指定することで、自動的にダウンロードされます。

② 使用できるネットワークの確認
ここでは、(下図の)bridgeネットワークを使用します。

③ docker run
コマンドを使用して、MySQLコンテナを作成します。
> docker run -d –name mysql8.0.33-container01 –network bridge -e MYSQL_ROOT_PASSWORD=<パスワード> mysql8.0.33-image
※コンテナ名:mysql8.0.33-container01
使用するネットワーク:bridge
元にするイメージ:mysql8.0.33-image

上記で、名前がmysql8.0.33-container01という名前のMySQLコンテナが作成されました。
また、bridgeという名前の共有ネットワークに接続されました。
2.MySQLコンテナのデプロイ
(1)MySQLコンテナのSwarmクラスター上へのデプロイ
次のコマンドで、Swarmクラスター上にMySQLコンテナをデプロイします。
> docker service create
実施例)
> docker service create
–name mysql8-0-33-container01-service ※①MySQLコンテナ名
–replicas 2 ※②冗長化する数
–network bridge ※③使用しているネットワーク名
-e MYSQL_ROOT_PASSWORD=<パスワード> ※④MySQLのパスワード
mysql8.0.33-image ※⑤使用するDockerイメージ

(上記に一部含まれるワーニングについて)
(ワーニング(抜粋))
image mysql8.0.33-image:latest could not be accessed on a registry to record its digest. Each node will access mysql8.0.33-image:latest independently, possibly leading to different nodes running different versions of the image.
これについては、仕様上、Docker Swarmでは、サービスを複数のノードで実行する場合、各ノードが同じイメージの同じバージョンを使用するようにするために、イメージのデジェストをレジストリに記録する、という仕様になっているそうです。(これにより、異なるノード間で異なるイメージバージョンが実行されることを防ぐことができるわけです)
しかし、ワーニングによると、指定したイメージ「mysql8.0.33-image:latest」のデジェストをレジストリに記録することができなかった、ということです。(その結果、各ノードは独立してイメージにアクセスし、異なるノードで異なるイメージバージョンが実行されてしまう可能性があるらしいです)
上記については、別記事をご参照下さい。
(2)サービスの確認
(上記でデプロイした)サービスを確認します。
> doker service ls

上記でデプロイしたSwarmクラスターが確認できました。
(3)Docker Desktop上でのサービスの確認

上記(赤丸の部分)で、MySQLコンテナのサービスが2つ起動されていることが確認できました。

3.Swarmクラスター上のDockerコンテナの削除方法
上記1~2の手順で作成した(Swarmクラスター上の)コンテナは、可用性と冗長性が確保されているため、Docker Desktop上で普通に(チェックを入れて削除ボタンをクリックして)削除しようとしても、復活、再起動を繰り返す場合があります。(下図参照)

↓ チェックを入れて停止しても・・・

この様に、どんどんサービスが復活(新規作成)されて再起動されます。
上記の様な場合は、以下の手順で削除出来る様です。
(1)Swarmノードのリスト表示
Swarmクラスターに参加しているノードの一覧を表示します。
> docker node ls

(2)Swarmサービスのリスト表示
現在実行中のサービスの一覧を表示します。
> docker service ls

(3)サービスの停止
サービスの名前またはIDを確認し、それを使用してサービスを停止します。
> docker service rm mysql8-0-33-container01-service

(4)直接コンテナを削除します。
上記(3)実施後、もしコンテナがまだ実行中であれば、直接コンテナを削除します。
