docker service logs コマンドを使ってサービスとタスクのログを表示する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、docker service logs コマンドを効果的に使用して、Docker サービスとその個々のタスクによって生成されたログを表示および管理する方法を学びます。まず、alpine イメージと ping コマンドを使用して単純な Docker サービスを作成します。

サービスを作成した後、サービス全体のログを表示する方法を探ります。これにより、実行中のすべてのタスクからの出力をまとめて表示できます。次に、サービス内の特定のタスクのログを表示するために、表示対象を絞り込む方法を学びます。最後に、この実験では、docker service logs コマンドのさまざまなオプションを活用して、必要に応じてログ出力をフィルタリングおよび整形する方法を示します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555226{{"docker service logs コマンドを使ってサービスとタスクのログを表示する方法"}} docker/ls -.-> lab-555226{{"docker service logs コマンドを使ってサービスとタスクのログを表示する方法"}} docker/ps -.-> lab-555226{{"docker service logs コマンドを使ってサービスとタスクのログを表示する方法"}} docker/rm -.-> lab-555226{{"docker service logs コマンドを使ってサービスとタスクのログを表示する方法"}} docker/logs -.-> lab-555226{{"docker service logs コマンドを使ってサービスとタスクのログを表示する方法"}} docker/pull -.-> lab-555226{{"docker service logs コマンドを使ってサービスとタスクのログを表示する方法"}} end

シンプルな Docker サービスを作成する

このステップでは、docker service create コマンドを使用してシンプルな Docker サービスを作成します。Docker サービスは、同じイメージのコンテナのグループです。サービスを作成する際には、どのコンテナイメージを使用するか、およびコンテナ内で実行するコマンドを定義します。

まず、Docker コンテナで一般的に使用される軽量 Linux ディストリビューションである alpine イメージを取得しましょう。

docker pull alpine

イメージが取得され、ダウンロードされていることを示す出力が表示されるはずです。

Using default tag: latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

次に、alpine イメージを使用して my-service という名前の Docker サービスを作成します。また、サービスの各コンテナ内で実行するコマンドとして ping labex.io を指定します。--name フラグはサービスに名前を付け、alpine ping labex.io の部分は使用するイメージと実行するコマンドを指定します。

docker service create --name my-service alpine ping labex.io

このコマンドを実行すると、以下のような出力が表示され、サービスが作成されたことが示されます。長い文字列はサービス ID です。

p1234567890abcdefghijklmnopqrstu
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

サービスが実行中であることを確認するには、docker service ls コマンドを使用できます。このコマンドは、Docker スワーム上で実行中のすべてのサービスを一覧表示します。

docker service ls

以下のような出力が表示され、my-service が 1 つのレプリカで実行中であることが示されます。

ID             NAME         MODE         REPLICAS   IMAGE          PORTS
p1234567890   my-service   replicated   1/1        alpine:latest

これにより、Docker サービス my-service が正常に作成され、ping labex.io コマンドを実行する 1 つのタスク(コンテナ)で実行中であることが確認できます。

サービス全体のログを表示する

前のステップでは、ping labex.io コマンドを実行するコンテナを動作させる my-service という名前の Docker サービスを作成しました。このコマンドは実行中に出力(ログ)を生成します。このステップでは、サービス全体のログを表示する方法を学びます。

Docker サービスのログを表示するには、docker service logs コマンドの後にサービス名を指定します。

docker service logs my-service

このコマンドを実行すると、my-service サービスに属するすべてのタスク(コンテナ)によって生成されたログが表示されます。現在のサービスには 1 つのタスクしかないため、そのコンテナで実行されている ping labex.io コマンドの出力が表示されます。

my-service.1.abcdefghijkl  PING labex.io (1.2.3.4): 56 data bytes
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=1 ttl=50 time=123.456 ms
...

出力には、サービス名、タスク番号、および一意のタスク ID がプレフィックスとして付けられたログエントリが表示されます。これにより、特にサービスに複数のタスクが実行されている場合に、どのタスクがどのログエントリを生成したかを識別するのに役立ちます。

また、-f または --follow フラグを使用して、ログをリアルタイムでストリーミングすることもできます。これは、サービスのアクティビティをリアルタイムで監視するのに便利です。

docker service logs -f my-service

このコマンドは、サービスのタスクによって新しいログエントリが生成されるたびに、それを継続的に表示します。ログの追跡を停止するには、Ctrl+C を押します。

サービス全体のログを表示することは、サービスの健全性とアクティビティの全体像を把握するのに役立ちます。

サービス内の特定のタスクのログを表示する

前のステップでは、my-service サービス全体のログを表示しました。サービスに複数のタスク(レプリカ)がある場合、結合されたログを表示すると情報量が多くなりすぎることがあります。このステップでは、サービス内の特定のタスクのログを表示する方法を学びます。

まず、ログを表示したいタスクの ID を特定する必要があります。この情報は、サービスに関連付けられたタスクを一覧表示する docker service ps コマンドを使用して取得できます。

docker service ps my-service

このコマンドを実行すると、my-service で実行されているタスクが表示されます。出力は次のようになります。

ID             NAME           IMAGE          NODE         DESIRED STATE   CURRENT STATE           ERROR   PORTS
abcdefghijkl   my-service.1   alpine:latest   labex-vm   Running         Running 2 minutes ago

この出力では、abcdefghijkl がタスク ID で、my-service.1 がタスク名です。タスク名はサービス名とタスク番号で構成されています。

特定のタスクのログを表示するには、docker service logs コマンドの後にタスク ID を指定します。

docker service logs abcdefghijkl

注意: abcdefghijkl を、docker service ps コマンドの出力から取得した実際のタスク ID に置き換えてください。

このコマンドを実行すると、特定のタスクで実行されているコンテナによって生成されたログのみが表示されます。これは、個々のタスクの問題をデバッグするのに便利です。

my-service.1.abcdefghijkl  PING labex.io (1.2.3.4): 56 data bytes
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=1 ttl=50 time=123.456 ms
...

ここでも -f フラグを使用して、特定のタスクのログをリアルタイムで追跡することができます。

docker service logs -f abcdefghijkl

個々のタスクのログを表示することで、問題を切り分け、サービスの特定のインスタンスの動作を理解することができます。

オプションを使用してサービスログをフィルタリングおよび整形する

このステップでは、docker service logs コマンドの出力をフィルタリングおよび整形するための便利なオプションをいくつか紹介します。これらのオプションを使用すると、ログ内の特定の情報を見つけやすくなり、出力が読みやすくなります。

一般的な要件の 1 つは、最新のログエントリのみを表示することです。--tail オプションを使用すると、ログの末尾から表示する行数を指定できます。たとえば、my-service の最後の 5 行のログを表示するには、次のようにします。

docker service logs --tail 5 my-service

これにより、サービスの最後の 5 つのログエントリが出力されます。

my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=10 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=11 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=12 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=13 ttl=50 time=123.456 ms
my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=14 ttl=50 time=123.456 ms

もう 1 つの便利なオプションは --since で、特定のタイムスタンプまたは期間以降に生成されたログを表示できます。たとえば、過去 5 分間に生成されたログを表示するには、次のようにします。

docker service logs --since 5m my-service

また、RFC3339Nano 形式の特定のタイムスタンプ、日付 (YYYY-MM-DD)、または日付と時刻 (YYYY-MM-DDTHH:MM:SS) を指定することもできます。

出力にタイムスタンプを含めるには、--timestamps または -t フラグを使用します。

docker service logs -t my-service

これにより、各ログエントリの先頭にタイムスタンプが追加されます。

2023-10-27T10:30:00.123456789Z my-service.1.abcdefghijkl  PING labex.io (1.2.3.4): 56 data bytes
2023-10-27T10:30:01.123456789Z my-service.1.abcdefghijkl  64 bytes from 1.2.3.4: seq=0 ttl=50 time=123.456 ms
...

最後に、これらのオプションを組み合わせて、ログの表示を絞り込むことができます。たとえば、タイムスタンプ付きの最後の 10 個のログエントリを表示するには、次のようにします。

docker service logs --tail 10 -t my-service

これらのオプションを使用すると、Docker サービスのログを表示および分析する方法が柔軟になり、アプリケーションの監視とトラブルシューティングが容易になります。

実験を終える前に、作成したサービスをクリーンアップしましょう。docker service rm コマンドを使用してサービスを削除できます。

docker service rm my-service

サービスが削除されたことを確認する出力が表示されます。

my-service

このコマンドは、サービスに関連付けられたすべてのタスクを停止して削除します。

まとめ

この実験では、docker service create コマンドを使用して簡単な Docker サービスを作成する方法を学びました。具体的には、サービスのタスク内で実行するイメージとコマンドを指定しました。また、docker service ls を使用してサービスの作成と状態を確認しました。

次に、docker service logs <service_name> を使用してサービス全体のログを表示する方法、および docker service ps <service_name> を使用してタスク ID を特定し、その後 docker service logs <task_id> を使用してサービス内の特定のタスクのログを表示する方法を調べました。最後に、docker service logs で様々なオプションを使用してログ出力をフィルタリングおよび整形する方法を学びました。たとえば、--follow でログをストリーミング、--since で特定の時間からのログを表示、--tail でログの最後の N 行を表示するなどです。