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

DockerDockerBeginner
今すぐ練習

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

はじめに

この実験では、Docker コンテナによって生成された出力を確認するためにdocker container logsコマンドを効果的に使用する方法を学びます。まず、ログを生成するシンプルなコンテナを実行し、この出力を取得するためのdocker logsの基本的な使用方法を探ります。

次に、タイムスタンプや詳細情報を含めることでログ出力を強化する方法を学びます。最後に、特定の時点からのログを表示したり出力を追跡したりする時間ベースのフィルタリング方法、および特定の時間までのログを表示する方法について説明します。このチャレンジでは、コンテナ化されたアプリケーションの監視とデバッグに不可欠な Docker ロギング技術を実践的に体験できます。


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/stop("Stop Container") 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-555112{{"docker container logs コマンドでコンテナ出力を確認する方法"}} docker/stop -.-> lab-555112{{"docker container logs コマンドでコンテナ出力を確認する方法"}} docker/rm -.-> lab-555112{{"docker container logs コマンドでコンテナ出力を確認する方法"}} docker/logs -.-> lab-555112{{"docker container logs コマンドでコンテナ出力を確認する方法"}} docker/pull -.-> lab-555112{{"docker container logs コマンドでコンテナ出力を確認する方法"}} end

ログを生成するコンテナを実行する

このステップでは、ログを生成する Docker コンテナを実行する方法を学びます。ログはコンテナ内で動作するアプリケーションのデバッグや監視に不可欠です。ここでは基本的なコンテナロギングを確認するのに適した、メッセージを出力して終了するシンプルなhello-worldイメージを使用します。

まず、Docker Hub からhello-worldイメージをプルしましょう。これにより、コンテナを実行する前にイメージがローカルに用意されます。

docker pull hello-world

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

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

次に、hello-worldイメージを使用してコンテナを実行します。docker runコマンドは新しいコンテナを作成して起動します。デフォルトでは、Docker はコンテナプロセスの標準出力 (stdout) と標準エラー(stderr) をキャプチャし、ログとして保存します。

docker run hello-world

このコマンドを実行すると、hello-worldコンテナが実行され、ターミナルにメッセージが表示された後、終了します。このメッセージが Docker によってログとしてキャプチャされる出力です。

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

hello-worldのようなシンプルなコンテナでは出力が直接ターミナルに表示されますが、バックグラウンドで動作するコンテナやより複雑なアプリケーションの場合、出力を確認するにはdocker logsコマンドを使用する必要があります。次のステップでdocker logsコマンドについて詳しく見ていきます。

基本的なコンテナログを表示する

前のステップでは、コンソールにメッセージを表示して終了するhello-worldコンテナを実行しました。これは簡単なデモンストレーションには有用でしたが、実際のアプリケーションは通常バックグラウンドで継続的に実行されます。このようなコンテナの出力(ログ)を確認するには、docker logsコマンドを使用します。

まず、継続的に実行され出力を生成するコンテナを実行しましょう。シンプルなubuntuイメージを使用し、数秒ごとにメッセージを表示するコマンドを実行します。このコンテナはバックグラウンドで実行するため、デタッチモード (-d) で実行します。また、識別しやすいように名前 (my-logging-container) を付けます。

docker pull ubuntu
docker run -d --name my-logging-container ubuntu /bin/bash -c 'while true; do echo "Hello from the container at $(date)"; sleep 5; done'

docker pull ubuntuコマンドは Ubuntu イメージをダウンロードします。docker runコマンドはmy-logging-containerという名前の新しいコンテナをデタッチモードで起動します。コンテナ内で実行されるコマンドは/bin/bash -c 'while true; do echo "Hello from the container at $(date)"; sleep 5; done'で、現在の日時を含むメッセージを 5 秒ごとに表示するシンプルなシェルスクリプトです。

コンソールにはコンテナ ID が表示され、コンテナがバックグラウンドで起動したことがわかります。

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
sha256:...

コンテナが実行されログを生成しているので、docker logsコマンドに続けてコンテナ名または ID を指定してこれらのログを表示できます。

docker logs my-logging-container

このコマンドは、my-logging-containerが起動してから生成したすべてのログを表示します。タイムスタンプ付きの「Hello from the container...」メッセージが連続して表示されるはずです。

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
...

docker logsコマンドはコンテナの出力を検査する基本的なツールであり、コンテナの動作を理解し問題を診断する上で重要です。

タイムスタンプと詳細情報付きでログを表示する

前のステップでは、実行中のコンテナの基本的なログを確認しました。出力内容自体は有用ですが、各ログエントリがいつ生成されたかなどのコンテキストが不足していることがよくあります。Docker には、ログにタイムスタンプやその他の詳細情報を含めるためのオプションが用意されています。

タイムスタンプ付きでログを表示するには、docker logsコマンドに-tまたは--timestampsフラグを指定します。これにより、各ログエントリの先頭にタイムスタンプが追加され、コンテナの標準出力または標準エラーに書き込まれた時刻が表示されます。

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

docker logs -t my-logging-container

これで、各行の先頭にタイムスタンプが付いたログが表示されます。タイムスタンプは RFC3339Nano 形式(例:2023-10-27T10:30:00.123456789Z)で表示されます。

2023-10-27T10:30:00.123456789Z Hello from the container at ...
2023-10-27T10:30:05.123456789Z Hello from the container at ...
2023-10-27T10:30:10.123456789Z Hello from the container at ...
...

タイムスタンプを含めることは、特にイベントの順序を理解したり、特定の問題が発生した時期を特定したりする際に、ログ分析において重要です。

もう一つの便利なオプションは-fまたは--followフラグで、ログをリアルタイムでストリーミング表示できます。これはログファイルに対してtail -fコマンドを使用するのと似ています。コンテナで試してみましょう:

docker logs -f my-logging-container

このコマンドは既存のログを表示した後、コンテナによって生成される新しいログエントリを継続的に表示します。5 秒ごとに新しい「Hello from the container...」メッセージが表示されるのが確認できます。

ログの追跡を停止するには、Ctrl+Cを押します。

-t-fフラグを組み合わせるのは、タイムスタンプ付きでコンテナログをリアルタイム監視する一般的な方法です:

docker logs -tf my-logging-container

これにより、コンテナの出力をライブで確認でき、その動作を観察したり、問題が発生した際にデバッグしたりすることが容易になります。

特定時刻以降のログを表示または末尾の出力を確認する

このステップでは、特定の時刻以降に生成されたコンテナログを表示する方法や、最新のログエントリのみを表示する方法について説明します。これは長時間実行され大量のログを生成しているコンテナを扱う際に特に有用です。

特定の時刻以降に生成されたログを表示するには、--sinceフラグを使用します。--sinceの値には、-tフラグで表示されるようなタイムスタンプ、または相対的な時間(例:10 分の場合は10m、1 時間の場合は1h)を指定できます。

まず数秒待って、my-logging-containerがさらにログを生成するのを待ちましょう。その後、過去 30 秒間に生成されたログを表示します。

sleep 30
docker logs --since 30s my-logging-container

このコマンドは、過去 30 秒間に生成されたログエントリのみを表示します。出力は完全なログと似ていますが、最近のエントリのみが含まれます。

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
... (過去 30 秒間のログのみ)

もう一つの一般的な要件は、tailコマンドのようにログの最後の数行のみを表示することです。これは--tailフラグを使用し、続けて表示したい行数を指定することで実現できます。

コンテナのログの最後 5 行を表示してみましょう:

docker logs --tail 5 my-logging-container

このコマンドは、コンテナから最新の 5 つのログエントリのみを出力します。

Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
Hello from the container at ...
Hello from the container at ... (最後の 5 行)

--since--tailは、-t-fなどの他のフラグと組み合わせて、コンテナログをより詳細に表示することができます。例えば、タイムスタンプ付きで最後の 10 行を表示するには:

docker logs -t --tail 10 my-logging-container

これらのオプションは、コンテナログをフィルタリングして表示する強力な方法を提供し、必要な情報を素早く見つけることを容易にします。

特定時刻までのログを表示する

特定時刻以降のログを表示するだけでなく、--untilフラグを使用して特定時刻までに生成されたログを表示することもできます。これは、例えば問題が発生する前など、特定の時点までのログを調査する際に有用です。

--untilの値もタイムスタンプまたは相対的な時間で指定できます。

まず数秒待って、さらにログが生成されるのを確認しましょう。

sleep 10

次に、my-logging-containerから約 10 秒前までに生成されたログを表示します。

docker logs --until 10s my-logging-container

このコマンドは、コンテナ起動時からコマンド実行の約 10 秒前までのすべてのログエントリを表示します。初期のログエントリは表示されますが、最新のものは除外されます。

Hello from the container at ...
Hello from the container at ...
... (10 秒前までのログ)

--since--untilを組み合わせて、特定の時間範囲内のログを表示することもできます。例えば、2 分前から 30 秒前までの間に生成されたログを表示するには:

docker logs --since 2m --until 30s my-logging-container

このコマンドは、その特定の時間枠内にあるログエントリのみを表示します。

最後に、実行中のコンテナをクリーンアップするには、停止して削除します。

docker stop my-logging-container
docker rm my-logging-container

docker stopコマンドはコンテナに停止シグナルを送信し、docker rmはコンテナを削除します。

ログを時間でフィルタリングする方法を理解することは、Docker コンテナの動作をデバッグおよび分析するための強力なスキルです。

まとめ

この実験では、docker logsコマンドを使用してコンテナログを表示する方法を学びました。まずシンプルなhello-worldコンテナを実行し、Docker が標準出力をログとしてキャプチャする仕組みを理解しました。

次に、コンテナの出力を取得するdocker logsの基本的な使用方法を確認しました。さらに、タイムスタンプや詳細情報を含めてログ出力を強化する方法、特定の時刻以降や特定の時刻までのログをフィルタリングする方法、最新のログエントリを表示するために出力を tail する方法についても学びました。