はじめに
この実験では、docker stack services コマンドを効果的に使用して、Docker スタック内のサービスを管理および調査する方法を学びます。まず、Docker Compose を使用してシンプルな Docker スタックをセットアップします。これには、Docker Compose のインストールと、docker-compose.yml ファイルで定義された基本的なアプリケーションのデプロイが含まれます。
スタックが稼働したら、docker stack services のコア機能を探索して、スタック内のすべてのサービスをリストアップします。これを基に、サービス名と ID を基にフィルタリングすることで、サービスのリストを絞り込む方法を学びます。最後に、サービスリストの出力形式をカスタマイズして、必要な情報を明確かつ整理された形式で表示する方法を学びます。
スタック内のすべてのサービスをリストする
このステップでは、Docker スタック内で実行中のすべてのサービスをリストアップする方法を学びます。サービスをリストアップする前に、スタックを稼働させる必要があります。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
Docker Compose がインストールされたので、シンプルな docker-compose.yml ファイルを作成してスタックを定義しましょう。~/project ディレクトリに docker-compose.yml という名前のファイルを作成します。
nano ~/project/docker-compose.yml
以下の内容をファイルに追加します。
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
app:
image: alpine:latest
command: sleep 3600
このファイルは、2 つのサービスを持つスタックを定義しています。web サービスは nginx イメージを使用し、app サービスは alpine イメージを使用します。web サービスは、ホストのポート 80 をコンテナ内のポート 80 にマッピングします。app サービスは、コンテナを稼働させ続けるために sleep 3600 コマンドを実行します。
ファイルを保存してエディタを終了します(nano では Ctrl+X、Y、Enter)。
次に、docker stack deploy を使用してスタックをデプロイしましょう。スタックの名前は mystack とします。
docker stack deploy -c ~/project/docker-compose.yml mystack
このコマンドは docker-compose.yml ファイルを読み取り、その中で定義されたサービスを mystack という名前の Docker スタックとして作成します。サービスが作成されていることを示す出力が表示されるはずです。
スタックがデプロイされたら、docker stack services コマンドにスタック名を続けることで、スタック内のすべてのサービスをリストアップできます。
docker stack services mystack
このコマンドは、mystack スタック内のサービスに関する情報を示す表を表示します。情報には、サービスの ID、名前、モード、レプリカ数、イメージ、およびポートが含まれます。
以下のような出力が表示されるはずです。
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
xxxxxxxxxxxx mystack_web replicated 1/1 nginx:latest *:80->80/tcp
この出力には mystack_app と mystack_web サービスがリストされており、これらが mystack スタックの一部として稼働していることが確認できます。
サービスを名前でフィルタリングする
このステップでは、Docker スタック内のサービスのリストを名前に基づいてフィルタリングする方法を学びます。スタック内に多数のサービスがあり、特定のサービスに関する情報のみを表示したい場合に便利です。
docker stack services コマンドは --filter フラグをサポートしており、これを使用すると出力をフィルタリングするための条件を指定できます。サービス名でフィルタリングするには、name フィルタを使用できます。
名前でフィルタリングする構文は --filter name=<service_name> です。スタック内のサービス名は通常、スタック名の後にアンダースコアと docker-compose.yml ファイルで定義されたサービス名が続く形式になっています(例:mystack_web)。
mystack スタック内のサービスをフィルタリングして、web サービスのみを表示してみましょう。
docker stack services mystack --filter name=mystack_web
このコマンドは、mystack_web サービスに対応する行のみを表示します。
以下のような出力が表示されるはずです。
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxx mystack_web replicated 1/1 nginx:latest *:80->80/tcp
mystack_web サービスに関する情報のみが表示されていることに注意してください。
同様に、app サービスのみを表示するようにフィルタリングすることもできます。
docker stack services mystack --filter name=mystack_app
これにより、mystack_app サービスに関する情報が表示されます。
ID NAME MODE REPLICAS IMAGE
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
name フィルタを使用することで、大規模なスタック内の特定のサービスの詳細をすばやく見つけて表示することができます。
サービスを ID でフィルタリングする
このステップでは、Docker スタック内のサービスのリストを一意の ID に基づいてフィルタリングする方法を学びます。名前でフィルタリングする方が直感的なことが多いですが、ID でフィルタリングすると、絶対的な精度が必要な場合や、似た名前のサービスを扱う場合に便利です。
Docker スタック内の各サービスには一意の ID が割り当てられています。これらの ID は docker stack services の出力の最初の列に表示されます。
サービス ID でフィルタリングするには、--filter フラグと id フィルタを使用します。構文は --filter id=<service_id> です。サービスを一意に識別するのに十分な ID の接頭辞を提供するだけで済みます。
まず、すべてのサービスを再度リストアップして、それらの ID を取得しましょう。
docker stack services mystack
出力を見て、mystack_web と mystack_app サービスの ID を特定します。ID は 16 進数の文字列になります。たとえば、出力は次のようになるかもしれません(あなたの ID は異なります)。
ID NAME MODE REPLICAS IMAGE PORTS
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
yyyyyyyyyyyy mystack_web replicated 1/1 nginx:latest *:80->80/tcp
mystack_web の ID が yyyyyyyyyyyy で始まるとしましょう。この ID(またはより短い一意の接頭辞)で次のようにフィルタリングできます。
docker stack services mystack --filter id=yyyyyyyyyyyy
yyyyyyyyyyyy をあなたの mystack_web サービスの実際の ID の先頭部分に置き換えてください。
このコマンドは、一致する ID を持つサービスの行のみを表示します。
次のような出力が表示され、mystack_web サービスのみが表示されるはずです。
ID NAME MODE REPLICAS IMAGE PORTS
yyyyyyyyyyyy mystack_web replicated 1/1 nginx:latest *:80->80/tcp
同様に、mystack_app サービスの ID でフィルタリングすることもできます。docker stack services mystack の出力からその ID を見つけて、フィルタに使用します。たとえば、ID が xxxxxxxxxxxx で始まる場合:
docker stack services mystack --filter id=xxxxxxxxxxxx
xxxxxxxxxxxx をあなたの mystack_app サービスの実際の ID の先頭部分に置き換えてください。
これにより、mystack_app サービスに関する情報が表示されます。
ID NAME MODE REPLICAS IMAGE
xxxxxxxxxxxx mystack_app replicated 1/1 alpine:latest
ID でフィルタリングすることで、特に自動化スクリプトで、または似た名前のサービスを扱う場合に、特定のサービスを正確に対象とすることができます。
サービスリストの出力をフォーマットする
このステップでは、docker stack services コマンドの出力をフォーマットする方法を学びます。デフォルトでは、出力は人間が読みやすい表形式で表示されます。ただし、--format フラグを使用すると出力をカスタマイズでき、これはスクリプト作成時や特定の情報を別の形式で必要とする場合に特に便利です。
--format フラグは Go テンプレート文字列(Go template string)を受け取ります。これにより、表示するフィールドとそのフォーマット方法を正確に指定できます。表示したい一般的なフィールドには、.ID、.Name、.Image、.Mode、.Replicas、.Ports などがあります。
出力をフォーマットして、サービスの ID、名前、イメージのみをタブ区切りで表示してみましょう。
docker stack services mystack --format "{{.ID}}\t{{.Name}}\t{{.Image}}"
このコマンドでは:
{{.ID}}、{{.Name}}、{{.Image}}は Go テンプレートのプレースホルダーで、各サービスのそれぞれの値に置き換えられます。\tはタブ文字を表し、ここでは区切り文字として使用されています。
出力は、各サービスの ID、名前、イメージがタブ区切りで記載されたリストになります。
xxxxxxxxxxxx mystack_app alpine:latest
yyyyyyyyyyyy mystack_web nginx:latest
(環境によって ID は異なりますのでご注意ください)
また、出力をリスト形式にフォーマットすることもでき、これは場合によっては解析が容易になります。たとえば、サービス名とレプリカ数をリスト表示するには:
docker stack services mystack --format "- {{.Name}} (Replicas: {{.Replicas}})"
これにより、次のように出力されます。
- mystack_app (Replicas: 1/1)
- mystack_web (Replicas: 1/1)
--format フラグを使用すると、docker stack services の出力を特定のニーズに合わせて調整する強力な方法が提供され、他のツールやスクリプトとの統合が容易になります。
最後に、デプロイされたスタックを削除してクリーンアップしましょう。
docker stack rm mystack
このコマンドは、mystack スタックに関連付けられたすべてのサービスとネットワークを削除します。スタックが削除されていることを示す出力が表示されるはずです。
まとめ
この実験では、docker stack services コマンドを使用して Docker スタック内のサービスをリストする方法を学びました。これには、まず Docker Compose をインストールし、docker-compose.yml ファイルで定義されたシンプルなスタックをデプロイすることが含まれていました。その後、docker stack services <stack_name> を使用して、デプロイされたスタック内のすべてのサービスの表を表示しました。
この実験ではまた、名前と ID でサービスをフィルタリングする方法も学び、リストを特定のサービスに絞り込むことができるようになりました。最後に、docker stack services コマンドの出力をフォーマットして、表示する情報をカスタマイズする方法を調べました。



