Docker Desktop ログを確認する方法 - docker desktop logs コマンドの使い方

DockerDockerBeginner
今すぐ練習

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

はじめに

この実験では、Docker コンテナによって生成されるログを表示・分析するためにdocker desktop logsコマンドを効果的に使用する方法を学びます。コンテナログを理解することは、アプリケーションのデバッグや動作監視において非常に重要です。

このハンズオン実験では、基本的なコンテナログの表示方法から始め、優先度、時間範囲、ログを生成している特定のユニット(コンテナまたはサービス)に基づいてこれらのログをフィルタリングする方法を実演します。この実験を終える頃には、docker desktop logsコマンドを使用してコンテナ化されたアプリケーションに関する貴重な洞察を得ることに熟達しているでしょう。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") subgraph Lab Skills docker/run -.-> lab-555143{{"Docker Desktop ログを確認する方法 - docker desktop logs コマンドの使い方"}} docker/stop -.-> lab-555143{{"Docker Desktop ログを確認する方法 - docker desktop logs コマンドの使い方"}} docker/rm -.-> lab-555143{{"Docker Desktop ログを確認する方法 - docker desktop logs コマンドの使い方"}} docker/logs -.-> lab-555143{{"Docker Desktop ログを確認する方法 - docker desktop logs コマンドの使い方"}} end

Docker Desktop の基本的なログを表示する

このステップでは、Docker コンテナからの基本的なログを表示する方法を学びます。ログはコンテナ内で動作するアプリケーションのデバッグや監視に不可欠です。

まず、何らかの出力を生成するシンプルなコンテナを実行しましょう。メッセージを表示して終了する非常に小さなイメージであるhello-worldを使用します。

docker run hello-world

以下のような出力が表示され、Docker デーモンがイメージをプルしてコンテナを正常に実行したことがわかります:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:f52335ce493178fc15f729218f180e9988e31c374a6ce98da40cbb890f97f10e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (Assuming it was not already locally available.)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To learn more, try the following commands:
 docker run -it ubuntu bash
 docker images
 docker ps
 docker stop <containerid>
 docker rm <containerid>
To get started with Docker Desktop, visit:
 https://www.docker.com/products/docker-desktop

この出力は、コンテナからの標準出力 (stdout) と標準エラー(stderr) ストリームです。Docker はこれらのストリームをキャプチャし、ログとして利用可能にします。

次に、実行状態を維持し、時間とともにログを生成するコンテナを実行しましょう。alpineイメージを使用し、5 秒ごとにメッセージを表示するシンプルなコマンドを実行します。

まず、alpineイメージをプルします:

docker pull alpine

イメージがプルされていることを示す出力が表示されます:

Using default tag: latest
latest: Pulling from library/alpine
... (ダウンロード進捗を示す出力)
Digest: sha256:...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

次に、alpineコンテナをデタッチモード (-d) で実行し、バックグラウンドで動作させ、簡単に参照できるように名前 (--name mylogger) を付けます。コマンドwhile true; do echo "Hello from mylogger at $(date)"; sleep 5; doneは、5 秒ごとに現在の日付を含むメッセージを表示します。

docker run -d --name mylogger alpine sh -c 'while true; do echo "Hello from mylogger at $(date)"; sleep 5; done'

このコマンドはコンテナ ID を出力します。

実行中のコンテナのログを表示するには、docker logsコマンドの後にコンテナ名または ID を指定します。

docker logs mylogger

コンテナのコマンドによって生成された出力が表示され、約 5 秒ごとに新しい行が追加されます。Ctrl+Cを押すとログの表示を停止できます。

ログをリアルタイムで追跡するには、-f(follow) オプションを使用します:

docker logs -f mylogger

これにより、新しいログエントリが生成されると継続的に表示されます。Ctrl+Cを押すとログの追跡を停止します。

最後に、作成したコンテナを停止して削除しましょう:

docker stop mylogger
docker rm mylogger

これにより、コンテナリソースがクリーンアップされます。

ログを優先度でフィルタリングする

このステップでは、Docker コンテナのログを優先度レベルに基づいてフィルタリングする方法を学びます。標準のdocker logsには systemd-journald のような組み込みの優先度フィルタリング機能はありませんが、grepなどのツールを使用してログ出力内の特定のキーワードやパターンを検索することで、同様のフィルタリングを実現できます。

前のステップで使用したalpineコンテナを使用しましょう。停止して削除した場合は再度実行します:

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

このコマンドはコンテナをデタッチモードで実行し、5 秒ごとに異なる「優先度」プレフィックス (INFO、WARNING、ERROR) を含むメッセージを出力します。

次に、ログを表示し、"ERROR"を含む行のみを表示するようにフィルタリングしましょう。docker logsの出力をgrepにパイプします。

docker logs mylogger | grep "ERROR"

"ERROR"という単語を含むコンテナログの行のみが表示されます。

同様に、"WARNING"を含む行のみを表示するには:

docker logs mylogger | grep "WARNING"

"INFO"を含む行を表示するには:

docker logs mylogger | grep "INFO"

フィルタを組み合わせることもできます。例えば、"WARNING"または"ERROR"を含む行を表示するには、拡張正規表現用の-Eオプションと|演算子を使用します:

docker logs mylogger | grep -E "WARNING|ERROR"

これにより、警告またはエラーのすべてのログエントリが表示されます。

この方法は、コンテナのアプリケーションが特定のキーワードでログを書き込むことに依存していることに注意してください。より構造化されたロギングと高度なフィルタリングが必要な場合は、専用のロギングドライバや Docker 外部のロギングソリューションの使用を検討してください。

最後に、コンテナを停止して削除します:

docker stop mylogger
docker rm mylogger

時間範囲でログをフィルタリングする

このステップでは、特定の時間範囲に基づいて Docker コンテナのログをフィルタリングする方法を学びます。これは、インシデント発生時や特定のデプロイ期間など、特定の期間のログを調査する際に役立ちます。

docker logsコマンドには、時間でログをフィルタリングするオプションがあります。再びalpineコンテナを使用します。実行されていない場合は、前回と同じコマンドで起動します:

docker run -d --name mylogger alpine sh -c 'while true; do echo "INFO: Hello from mylogger at $(date)"; sleep 5; echo "WARNING: Something is happening at $(date)"; sleep 5; echo "ERROR: An error occurred at $(date)"; sleep 5; done'

ログを生成するために、1~2 分間コンテナを実行させておきます。

特定の時間以降に生成されたログを表示するには、--sinceオプションを使用します。時間は、タイムスタンプ(エポックからの秒数)、相対時間(例:10 分の場合は10m、1 時間の場合は1h)、または日付/時刻文字列など、さまざまな形式で指定できます。

過去 2 分間に生成されたログを表示してみましょう:

docker logs --since 2m mylogger

このコマンドは、過去 2 分間にmyloggerコンテナで生成されたすべてのログエントリを表示します。

--since--untilを使用して開始時刻と終了時刻を指定することもできます。--untilオプションは--sinceと同様に機能し、ログを表示したい終了時刻を指定できます。

5 分前から 1 分前までの間に生成されたログを表示するには:

docker logs --since 5m --until 1m mylogger

このコマンドは、指定した時間枠内のログを表示します。正確な出力は、コマンドを実行するタイミングとコンテナが実行されていた時間によって異なります。

特定のタイムスタンプを使用することもできます。現在のタイムスタンプを取得するには、date +%sコマンドを使用できます。

1 分前のタイムスタンプを取得してみましょう:

date -d "1 minute ago" +%s

このタイムスタンプを--untilと一緒に使用して、1 分前までのログを表示します:

docker logs --until $(date -d "1 minute ago" +%s) mylogger

このコマンドは、コンテナの起動時から 1 分前までのログを表示します。

時間範囲によるフィルタリングは、ログ分析を絞り込み、関連するイベントに集中するための強力な方法です。

最後に、コンテナを停止して削除します:

docker stop mylogger
docker rm mylogger

ユニット別にログをフィルタリングする

このステップでは、Docker コンテナのログを生成元の「ユニット」ごとにフィルタリングする方法を学びます。Docker ログの文脈において「ユニット」とは通常、コンテナ自体を指します。docker logsは本質的に単一のコンテナ(またはユニット)に対して動作しますが、より高度なロギングシステムを扱う場合や、異なるコンテナからのログを区別する必要がある場合に、この概念を理解することは重要です。

Docker でユニット別にログをフィルタリングする主な方法は、docker logsコマンドを使用する際にコンテナ名または ID を指定することです。これは前のステップですでに行っています。

2 つの異なるコンテナを実行して、それらのログがどのように分離されるか見てみましょう。両方にalpineイメージを使用しますが、名前とコマンドを少し変えます。

まず、前のステップのmyloggerコンテナが停止・削除されていることを確認します。

docker stop mylogger || true
docker rm mylogger || true

次に、container1という名前の最初のコンテナを実行します:

docker run -d --name container1 alpine sh -c 'while true; do echo "Container 1 log at $(date)"; sleep 3; done'

このコンテナは 3 秒ごとにログメッセージを出力します。

次に、container2という名前の 2 番目のコンテナを実行します:

docker run -d --name container2 alpine sh -c 'while true; do echo "Container 2 log at $(date)"; sleep 5; done'

このコンテナは 5 秒ごとにログメッセージを出力します。

container1からのログを表示するには、次のコマンドを使用します:

docker logs container1

container1によって生成されたログメッセージのみが表示されます。

container2からのログを表示するには、次のコマンドを使用します:

docker logs container2

container2によって生成されたログメッセージのみが表示されます。

これは、docker logsが指定されたコンテナ(「ユニット」)ごとに本質的にフィルタリングを行う方法を示しています。複数のコンテナからログを収集する集中型ロギングシステムを使用している場合、通常は各ログエントリに関連付けられたメタデータ(コンテナ名や ID など)を使用してユニットごとにフィルタリングします。

docker logs自体にはシステムロギングツールのような--unitフラグはありませんが、ログの発生元(コンテナ)によるフィルタリングという基本的な概念は、コンテナ名または ID を指定することで実現されます。

最後に、両方のコンテナを停止して削除します:

docker stop container1 container2
docker rm container1 container2

まとめ

この実験では、docker logsコマンドを使用して Docker コンテナのログを表示する基本的なスキルを学びました。最初にhello-worldalpineのようなシンプルなコンテナを実行し、Docker が標準出力とエラーストリームをログとしてキャプチャする方法を理解しました。この最初のステップでは、コンテナ内で実行されるアプリケーションを監視およびデバッグするために重要な、コンテナの出力にアクセスする基本的なプロセスを確認しました。

基本的なログ表示の知識を基に、ログデータを効率的に管理・分析するための高度なフィルタリングオプションを探求しました。優先度レベルでログをフィルタリングし、重要なメッセージに集中する方法を学びました。さらに、特定の時間範囲でログをフィルタリングして特定の期間内のイベントを分離する方法や、ユニットごとに特定のサービスやコンポーネントからのログを表示する方法を実践しました。これらのフィルタリング技術は、大量のログデータを操作し、トラブルシューティングや分析に必要な関連情報を迅速に特定するために不可欠です。