docker compose logs コマンドでコンテナ出力を確認する方法

DockerDockerBeginner
今すぐ練習

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

はじめに

この実験では、Docker コンテナの出力を効率的に確認するためにdocker 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/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555082{{"docker compose logs コマンドでコンテナ出力を確認する方法"}} docker/logs -.-> lab-555082{{"docker compose logs コマンドでコンテナ出力を確認する方法"}} docker/pull -.-> lab-555082{{"docker compose logs コマンドでコンテナ出力を確認する方法"}} docker/images -.-> lab-555082{{"docker compose logs コマンドでコンテナ出力を確認する方法"}} end

サービスを起動して基本ログを確認する

このステップでは、Docker コンテナを起動し、その基本ログを確認する方法を学びます。ログはコンテナ内で何が起こっているかを理解し、問題をデバッグし、挙動を監視するために不可欠です。

まず、Docker Hub からシンプルな Nginx イメージをプルしましょう。このイメージは Web サーバーコンテナを実行するために使用されます。

docker pull nginx:latest

イメージがダウンロードされていることを示す出力が表示されるはずです。ダウンロードが完了したら、以下のコマンドでローカルにイメージが存在することを確認できます:

docker images

次に、Nginx イメージを基にコンテナを実行します。バックグラウンドで実行するためにデタッチモード (-d) で実行し、my-nginxという名前を付けます。

docker run -d --name my-nginx nginx

このコマンドの出力はコンテナ ID になります。これはコンテナがバックグラウンドで正常に起動したことを意味します。

my-nginxコンテナによって生成された基本ログを確認するには、docker logsコマンドの後にコンテナ名または ID を指定します。

docker logs my-nginx

コンテナ内で実行されている Nginx プロセスの標準出力と標準エラーストリームが表示されます。これらのログには通常、Nginx サーバーの起動情報やリクエスト処理に関する情報が含まれています。

ログをリアルタイムで追跡する

前のステップでは、コンテナ起動後のログを確認しました。しかし、ログが生成されるのをリアルタイムで確認する必要がある場合があります。これは特にデバッグや稼働中のプロセスを監視する際に有用です。

コンテナのログをリアルタイムで追跡するには、docker logsコマンドに-f(または--follow)オプションを指定します。これによりターミナルが開いた状態を維持し、新しいログエントリが表示されるたびに更新されます。

my-nginxコンテナのログを追跡してみましょう:

docker logs -f my-nginx

このコマンドは現在のログを表示した後、新しいログエントリを待機します。Nginx コンテナは稼働していますが、アクティブにリクエストを処理していないため、すぐに新しいログが表示されない場合があります。

新しいログエントリを生成するために、コンテナ内で実行されている Nginx Web サーバーにリクエストを送信できます。デフォルトでは Nginx はポート 80 で待ち受けています。docker runコマンドでポートをホストにマッピングしていなくても、curlを使用してホストからコンテナのネットワークに内部的にアクセスできます。

LabEx 環境で新しいターミナルタブを開きます。この新しいタブで、以下のコマンドを実行して Nginx コンテナにリクエストを送信します:

curl http://localhost:80

新しいターミナルタブに Nginx のデフォルトウェルカムページの HTML 出力が表示されるはずです。

ログを追跡しているターミナルタブ(docker logs -f my-nginx)に戻ると、curlからのリクエストを処理したことを示す新しいログエントリが表示されているはずです。これらのエントリには通常、クライアント IP、リクエストメソッド、リクエストされたパス、HTTP ステータスコードなどの情報が含まれます。

ログの追跡を停止するには、docker logs -fが実行されているターミナルでCtrl+Cを押します。

タイムスタンプ付きでログを表示し、特定の末尾を確認する

前のステップでは、基本的なログの確認とリアルタイムでのログ追跡を行いました。しかし、基本的なdocker logsの出力にはタイムスタンプが含まれていないため、イベントの関連付けやログエントリのタイミングを理解するのが難しい場合があります。また、最新のログエントリのみを確認したい場合もあります。

ログ出力にタイムスタンプを含めるには、docker logsコマンドに-t(または--timestamps)オプションを指定します。

my-nginxコンテナのログをタイムスタンプ付きで表示してみましょう:

docker logs -t my-nginx

各ログエントリの先頭に、そのログエントリがコンテナによって生成された時刻を示すタイムスタンプが表示されるようになります。これはデバッグや分析に非常に役立ちます。

時には、Linux のtailコマンドと同様に、最新のログエントリのみを確認したい場合があります。docker logsコマンドにはこの目的で--tailオプションが用意されています。ログの末尾から表示したい行数を指定できます。

例えば、my-nginxコンテナの最後の 5 つのログエントリのみを表示するには:

docker logs --tail 5 my-nginx

これにより、コンテナのログの最後の 5 行のみが出力されます。--tail-tを組み合わせて、タイムスタンプ付きで最後の数エントリを表示することもできます。

docker logs -t --tail 5 my-nginx

このコマンドは、最後の 5 つのログエントリをそれぞれのタイムスタンプと共に表示します。

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

全てのログや最新のログを表示するだけでなく、特定の時間範囲でコンテナログをフィルタリングすることも可能です。これは特定の期間に発生したイベントを調査する際に有用です。

docker logsコマンドは時間ベースのログフィルタリングのために--since--untilオプションを提供しています。これらのオプションは RFC3339 タイムスタンプ、Unix タイムスタンプ、相対時間(例:10mで 10 分、1hで 1 時間)など様々な時間形式を受け付けます。

ログフィルタリングを試してみましょう。まず、異なる時間にいくつかのログを生成する必要があります。Nginx コンテナに再度curlリクエストを送信することでこれを行えます。

新しいターミナルタブを開き、curlコマンドを数回実行します(各実行の間に短い遅延を入れます)。

curl http://localhost:80
sleep 5
curl http://localhost:80
sleep 5
curl http://localhost:80

次に、my-nginxコンテナのログをタイムスタンプ付きで表示し、これらのリクエストの時間を確認します。

docker logs -t my-nginx

curlコマンドによって生成されたログエントリのタイムスタンプを確認してください。

特定の時間以降のログをフィルタリングするには--sinceオプションを使用します。例えば、過去 1 分間に生成されたログを表示するには:

docker logs --since 1m my-nginx

このコマンドはmy-nginxコンテナから過去 1 分間に生成された全てのログエントリを表示します。

--untilオプションを使用して特定の時間までのログをフィルタリングすることも可能です。例えば、1 分以上前に生成されたログを表示するには:

docker logs --until 1m my-nginx

このコマンドはmy-nginxコンテナから 1 分以上前に生成された全てのログエントリを表示します。

--since--untilを組み合わせて特定の時間ウィンドウ内のログを表示できます。例えば、5 分前から 1 分前までのログを表示するには:

docker logs --since 5m --until 1m my-nginx

正確な出力はcurlコマンドを実行したタイミングとdocker logsコマンドを実行したタイミングによって異なることに注意してください。

まとめ

この実験では、コンテナの出力を確認するためのdocker logsコマンドの基本的な使用方法を学びました。まず Docker イメージをプルし、デタッチモードでコンテナを実行しました。その後、実行中のコンテナが生成する基本的なログを確認する方法を学び、コンテナの起動時や動作状況を把握しました。

さらに、-fオプションを使用してコンテナログをリアルタイムで追跡する方法を学び、ログストリームを生成されると同時に継続的に監視できるようになりました。このリアルタイムロギングは、コンテナの動的な動作をデバッグしたり観察したりする上で非常に重要です。