はじめに
この実験では、docker stack deploy コマンドを使用して Docker Swarm サービスを効果的に管理する方法を学びます。まず、アプリケーションスタックの青写真となるシンプルな docker-compose.yml ファイルを準備します。
準備が完了したら、このスタックを Docker Swarm にデプロイし、定義されたサービスが正常にデプロイされたことを確認します。その後、コンポーズファイルを変更してスタックを更新する方法を探ります。最後に、更新された設定で参照されなくなったサービスを削除する方法を学び、Swarm がクリーンで効率的な状態を維持するようにします。
Swarm デプロイ用のシンプルな docker-compose ファイルを準備する
このステップでは、Docker Swarm にスタックをデプロイするために使用するシンプルな docker-compose.yml ファイルを準備します。docker-compose を使用する前に、インストールする必要があります。
まず、docker-compose をインストールしましょう。バイナリをダウンロードして実行可能にします。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
このコマンドは、公式の GitHub リリースページから docker-compose バイナリをダウンロードし、/usr/local/bin/docker-compose に保存します。$(uname -s) と $(uname -m) の部分は、オペレーティングシステムとアーキテクチャを自動的に検出します。chmod +x コマンドは、ダウンロードしたファイルを実行可能にします。
次に、バージョンを確認することでインストールを検証しましょう。
docker-compose --version
コンソールに docker-compose のインストールされたバージョンが表示されるはずです。
次に、~/project ディレクトリにシンプルな docker-compose.yml ファイルを作成します。このファイルは、nginx イメージを使用した単一のサービスを定義します。
nano ~/project/docker-compose.yml
以下の内容を nano エディタに貼り付けます。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
この docker-compose.yml ファイルを分解してみましょう。
version: '3.8'は Compose ファイルの形式バージョンを指定します。バージョン 3.8 は Swarm デプロイに適しています。services:はアプリケーションを構成するサービスを定義します。web:は私たちのサービスの名前です。好きな名前を選ぶことができます。image: nginx:latestはこのサービスに使用する Docker イメージを指定します。公式のnginxイメージの最新バージョンを使用しています。ports:はホストとコンテナ間のポートをマッピングします。"80:80"はホストのポート 80 をコンテナのポート 80 にマッピングします。
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
このサービスをデプロイする前に、nginx:latest イメージがローカルで利用可能であることを確認する必要があります。docker pull コマンドを使用してイメージを取得できます。
docker pull nginx:latest
このコマンドは、Docker Hub から nginx:latest イメージをローカルマシンにダウンロードします。
これで、デプロイ用のシンプルな docker-compose.yml ファイルが準備でき、必要なイメージも取得されました。
コンポーズファイルを使用してスタックを Swarm にデプロイする
このステップでは、docker-compose.yml ファイルで定義されたスタックを Docker Swarm にデプロイします。スタックをデプロイする前に、Docker Swarm を初期化する必要があります。
まず、Swarm を初期化しましょう。単一の仮想マシン(VM)を使用しているため、単一ノードの Swarm として初期化します。
docker swarm init
このコマンドは新しい Swarm を初期化し、現在のノードをマネージャーノードにします。Swarm が初期化されたことを示す出力が表示されるはずです。
Swarm が初期化されたので、docker stack deploy コマンドを使用してスタックをデプロイできます。スタックに名前を付けましょう。例えば、mywebstack とします。
docker stack deploy -c ~/project/docker-compose.yml mywebstack
このコマンドを分解してみましょう。
docker stack deployは、スタックを Swarm にデプロイするために使用するコマンドです。-c ~/project/docker-compose.ymlは、デプロイに使用する Compose ファイルを指定します。前のステップで作成したファイルを使用しています。mywebstackは、スタックに付ける名前です。この名前は、Swarm 内でこのスタックに属するサービスとコンテナを識別するために使用されます。
このコマンドを実行すると、Docker Swarm は docker-compose.yml ファイルで定義されたサービスを作成します。サービスが作成または更新されていることを示す出力が表示されるはずです。
スタックがデプロイされたことを確認するには、実行中のスタックを一覧表示できます。
docker stack ls
このコマンドは、Swarm 内のすべてのデプロイされたスタックのリストを表示します。mywebstack がリストに表示されるはずです。
また、スタック内で実行中のサービスを一覧表示することもできます。
docker stack services mywebstack
このコマンドは、mywebstack スタックに関連付けられたサービスを表示します。mywebstack_web サービスが、そのレプリカとイメージに関する情報とともにリストに表示されるはずです。
最後に、サービスタスクの状態を確認しましょう。
docker service ps mywebstack_web
このコマンドは、mywebstack_web サービスのタスク(実行中のコンテナ)を表示します。少なくとも 1 つのタスクが Running 状態で表示されるはずです。
これで、Docker Swarm を正常に初期化し、docker-compose.yml ファイルを使用してスタックをデプロイしました。
デプロイされたサービスを確認する
このステップでは、前のステップでデプロイされたサービスが正しく実行され、アクセス可能であることを検証します。私たちは Nginx Web サーバーをデプロイしており、これはポート 80 で待機しているはずです。
まず、docker service ls コマンドを使用して、Swarm で実行中のサービスのリストを表示しましょう。
docker service ls
mywebstack_web サービスが 1/1 レプリカでリストされ、サービスの 1 つのインスタンスが実行中であることを示しているはずです。
次に、curl を使用して、コンテナ内で実行されている Nginx Web サーバーにアクセスできます。ホストのポート 80 をコンテナのポート 80 にマッピングしたので、ポート 80 の localhost を介してアクセスできます。
curl localhost:80
このコマンドは、ポート 80 の localhost に HTTP リクエストを送信します。Nginx サーバーが正しく実行されている場合、デフォルトの Nginx ウェルカムページの HTML が出力として返されるはずです。これにより、サービスが実行中であり、ホストマシンからアクセス可能であることが確認されます。
web サービスの実行中のコンテナをさらに調査するには、docker ps コマンドを使用できます。
docker ps
このコマンドは、すべての実行中のコンテナをリスト表示します。nginx イメージを実行しているコンテナが表示され、名前は mywebstack_web.1.<task_id> のようになっているはずです。PORTS 列には 0.0.0.0:80->80/tcp が表示され、ポートマッピングが確認されます。
また、docker service inspect コマンドを使用してサービスの詳細を調査することもできます。
docker service inspect mywebstack_web
このコマンドは、mywebstack_web サービスに関する詳細情報を提供します。これには、設定、タスク、ネットワーク設定などが含まれます。出力をスクロールして、サービスに関するさまざまな詳細を確認できます。
これらのチェックを行うことで、デプロイした Nginx サービスが期待通りに実行され、アクセス可能であることを検証しました。
修正したコンポーズファイルでスタックを更新する
このステップでは、docker-compose.yml ファイルを修正して、デプロイされたスタックを更新します。Nginx イメージのバージョンを変更し、2 つ目のサービスを追加します。
まず、docker-compose.yml ファイルを編集しましょう。
nano ~/project/docker-compose.yml
ファイルを修正して、2 つ目のサービス(例えば alpine サービス)を追加し、Nginx イメージのバージョンを 1.21.6 に変更します。更新後のファイルは次のようになるはずです。
version: "3.8"
services:
web:
image: nginx:1.21.6
ports:
- "80:80"
alpine:
image: alpine:latest
command: ["sleep", "infinity"]
変更点を見てみましょう。
webサービスのimageをnginx:latestからnginx:1.21.6に変更しました。alpineという名前の新しいサービスを追加しました。alpineサービスはalpine:latestイメージを使用します。command: ["sleep", "infinity"]は、alpineコンテナを無期限に実行させます。
修正したファイルを保存するには、Ctrl + X を押し、次に Y を押し、最後に Enter を押します。
更新されたスタックをデプロイする前に、新しい nginx:1.21.6 と alpine:latest イメージを取得する必要があります。
docker pull nginx:1.21.6
docker pull alpine:latest
これで、同じ docker stack deploy コマンドと同じスタック名を使用して、更新されたスタックをデプロイできます。Docker Swarm は docker-compose.yml ファイルの変更を検出し、既存のスタックを更新します。
docker stack deploy -c ~/project/docker-compose.yml mywebstack
Docker Swarm は web サービスに対してローリングアップデートを実行し、古い nginx:latest コンテナを nginx:1.21.6 を使用した新しいコンテナに置き換えます。また、新しい alpine サービスとそれに対応するコンテナを作成します。サービスが更新または作成されていることを示す出力が表示されるはずです。
更新を検証するために、スタック内のサービスを再度一覧表示しましょう。
docker stack services mywebstack
これで、mywebstack_web と mywebstack_alpine の両方のサービスがリストされているはずです。mywebstack_web サービスには更新されたイメージ nginx:1.21.6 が表示されるはずです。
docker-compose.yml ファイルを修正して再デプロイすることで、デプロイされたスタックを正常に更新しました。
コンポーズファイルで参照されなくなったサービスを削除する
このステップでは、再度 docker-compose.yml ファイルを修正し、今回はサービスを削除します。スタックを再デプロイすると、Docker Swarm はコンポーズファイルでサービスが定義されなくなったことを検出し、そのサービスを削除します。このプロセスは、サービスの「削除(pruning)」と呼ばれることもあります。
まず、docker-compose.yml ファイルを編集して alpine サービスを削除しましょう。
nano ~/project/docker-compose.yml
ファイルから alpine: セクション全体を削除します。ファイルは元の状態に戻り、web サービスのみを定義するようになります。
version: "3.8"
services:
web:
image: nginx:1.21.6
ports:
- "80:80"
修正したファイルを保存するには、Ctrl + X を押し、次に Y を押し、最後に Enter を押します。
これで、修正した docker-compose.yml ファイルを使用してスタックを再度デプロイします。
docker stack deploy -c ~/project/docker-compose.yml mywebstack
Docker Swarm は mywebstack スタックの現在の状態と更新された docker-compose.yml ファイルの定義を比較します。ファイルに alpine サービスがもう存在しないことに気づき、対応するサービスとそのタスクを Swarm から削除します。alpine サービスが削除されていることを示す出力が表示されるはずです。
alpine サービスが削除されたことを検証するために、スタック内のサービスを再度一覧表示しましょう。
docker stack services mywebstack
これで、mywebstack_web サービスのみがリストされているはずです。mywebstack_alpine サービスは削除されているはずです。
最後に、Swarm 環境をクリーンアップするために、スタック全体を削除できます。
docker stack rm mywebstack
このコマンドは、mywebstack スタックを削除し、そのすべてのサービスとタスクも含めます。削除が確認される出力が表示されるはずです。
スタックが削除されたことを検証するために、スタックを再度一覧表示しましょう。
docker stack ls
mywebstack はもうリストに表示されないはずです。
docker-compose.yml ファイルからサービスを削除して再デプロイすることで、スタックからサービスを正常に削除し、その後スタック全体を削除することで環境をクリーンアップしました。
まとめ
この実験(Lab)では、docker stack deploy コマンドを使用して Docker Swarm サービスを管理する方法を学びました。まず、Docker のマルチサービスアプリケーションを定義する標準的な方法である、シンプルな docker-compose.yml ファイルを準備しました。これには、docker-compose のインストールと、ポートマッピングを持つ単一の Nginx サービスを定義する基本的な YAML ファイルの作成が含まれていました。
準備が完了した後、docker stack deploy を使用してこのスタックを Docker Swarm にデプロイし、サービスのデプロイが成功したことを確認しました。その後、docker-compose.yml ファイルを修正して再デプロイすることで、スタックの更新を練習しました。最後に、更新されたコンポーズファイルで定義されなくなったサービスを削除する方法を学び、Swarm 環境がクリーンで現在のアプリケーション定義を反映するようにしました。



