ウェブサイト検索

Dockerコンテナのログを監視する方法


Dockerは自動的にコンテナの標準出力とエラーストリーム(stdout/stderr)をログフィードに集約し、それをDockerデーモンが保持します。ログを簡単に監視して、コンテナ内で何が起こっているかを理解することができます。

ログには、インタラクティブモードでコンテナに接続しているときにターミナルで見ることができる出力が含まれています。

-it

)。ログは、コンテナ内の前景プロセスが実際に何らかの出力を出す場合にのみ利用可能です。コンテナがエラーをstderrにログとして記録することを確認する必要があります。そうすることで、Dockerコマンドがそれらを表示できるようになります。

コンテナのライフサイクルの任意の時点でコンテナのログを表示できます。コンテナが実行中のときは、リアルタイムでログをストリーミングできます。停止したコンテナの場合は、終了する前にキャプチャされたすべてのログにアクセスできます。

コンテナログの表示

コンテナのログを表示するには、docker logs コマンドを使用します:

docker logs my-container

my-containerを、調べたいコンテナの名前またはIDに置き換えてください。コンテナのIDや名前を取得するには、docker ps -aを使用できます。

logs コマンドは、コンテナの全ログ出力をターミナルに表示します。出力は連続的ではありません。新しいログをストリーミングし続けたい場合は、コマンドに --follow フラグを追加してください。これは、マシン上の通常のログファイルで tail -f を使用するのと同等です。

表示内容のカスタマイズ

「docker logs」コマンドは、その出力を調整するためのいくつかのフラグをサポートしています:

  • --タイムスタンプ - 各ログ行の先頭に完全なタイムスタンプを表示します。
  • --untilおよび--since - これらのフラグは、特定の時間期間に記録された行を取得することができます。完全なタイムスタンプ(2021-04-30T20:00:00Z)または親しみやすい相対的な時間(例:1h=1時間前)を渡すことができます。
  • --tail - ログから指定された行数を取得します。--tail 10は、コンテナによって記録された最後の10行を表示します。
  • --details - これは、ロギングドライバーに渡されたオプションに基づいて、ログ出力に追加情報を加える特別なフラグです。ロギングドライバーについては次のセクションで見ていきます。--details で表示される典型的な値には、コンテナラベルや環境変数が含まれます。

これらのフラグを組み合わせて、必要な形式のログを取得できます。until、since、およびtailのフラグは、followを使用してログデータを継続的にストリーミングしている場合には効果がありません。

Dockerログドライバー

Docker は、いくつかのログドライバーのいずれかを使用してコンテナログを収集および保存します。アクティブなログドライバーは、コンテナごとに設定できます。ログドライバーが指定されていない場合、Docker は json-file ドライバーを使用します。

このドライバーは、コンテナログをJSONファイルに保存します。この形式はかなり人間が読みやすく、サードパーティツールによって簡単に利用できます。ログファイルに直接アクセスしない場合は、localドライバーに切り替えることで、ストレージスペースを節約できます。これはカスタムログストレージ形式を使用しています。

その他の組み込みログドライバには、syslog(あなたのマシン上で実行されているsyslogデーモンに書き込む)、journald(実行中のjournaldインスタンスを使用する)、およびfluentd(fluentdデーモンを使用する)が含まれます。また、Amazon CloudWatch、Google Cloud Platform、Windows用のイベントトレース、およびその他のログ監視ソリューション用のドライバも利用可能です。

Dockerはプラグインを介してサードパーティのログドライバーをサポートしています。ドライバーはDocker Hubで見つけることができます。プラグインドライバーをインストールするには、docker plugin install plugin-nameを実行してください。そうすれば、plugin-nameとしてログドライバーを参照できるようになります。

ログドライバーの指定

コンテナのログドライバーを指定するには、docker runに--log-driverフラグを渡します:

docker run --log-driver systemd my-image:latest

デフォルトのロギングドライバーをグローバルに変更するには、Dockerデーモンの設定を更新します。/etc/docker/daemon.jsonを編集(または作成)します。log-driverキーをロギングドライバーの名前に設定します。Dockerは、--log-driverフラグなしで作成されたすべてのコンテナにこのドライバーを使用します。

{

"log-driver": "systemd"

}

多くのロギングドライバーには、それぞれの設定オプションがあります。これらは、--log-opts コンテナフラグや、daemon.json の log-opts を使用して設定します。以下は、デフォルトの json-file ドライバーに関連する例です。Dockerに、ログファイルが8MBを超えた場合にローテーションするよう指示します。同時に保持されるファイルは5つのみです。

docker run

docker run --log-driver json-file --log-opts max-size=8M --log-opts max-file=5

/etc/docker/daemon.json

{

"log-driver": "json-file",

"log-opts": {

"max-size": "8M",

"max-file": 5

}

}

ドライバー配送モード

ログは、ブロッキングモードまたはノンブロッキングモードのいずれかで配信できます。Dockerはデフォルトでブロッキング配信になります。コンテナからのログは、すぐにドライバーに送信されます。これはログ配信を保証しますが、パフォーマンスに影響を与える可能性があります。アプリケーションはログの書き込みが完了するまで待機します。これにより、ロギングドライバーが忙しい場合に顕著な遅延が発生することがあります。

ノンブロッキングモードでは、Dockerはログをメモリ内のバッファに書き込みます。コンテナは、ログドライバーが書き込みを完了するのを待つ必要はありません。これにより、遅いストレージを持つアクティブなマシンでパフォーマンスが大幅に向上する可能性があります。

ノンブロッキングモードのトレードオフは、ログが失われる可能性です。これは、ログがドライバーが処理できるよりも早く出力される場合に発生する可能性があります。メモリ内バッファがいっぱいになると、キャッシュされたログがドライバーに渡される前にクリアされる可能性があります。

非ブロッキング配信を有効にするには、--log-optsまたはdaemon.jsonを使ってmodeログオプションを設定します。max-buffer-sizeオプションを使用して、メモリ内ログバッファのサイズを設定できます。これを大きく設定すると、十分なRAMが利用可能な場合に、ログの喪失リスクが減少します。

docker run --log-opt mode=non-blocking --log-opt max-buffer-size=8M my-image:latest

ログ記録のベストプラクティス

あなたのコンテナは、可能な限りDockerのログシステムと連携するべきです。stdoutおよびstderrにログを出力することで、Dockerやその他のツールがそれらを標準化された方法で集約できるようになります。

ログ出力にタイムスタンプを含める必要はありません。Dockerのログドライバーは、イベントが発生した時刻を自動的に記録します。

時には、docker logsだけでは満たせない複雑なログ要件があるかもしれません。その場合は、コンテナ内に独自のログソリューションを実装する必要があります。ファイルシステムに直接ログを保存したり、Dockerボリュームを使用したり、外部APIサービスを呼び出したりすることができます。

いくつかのスタックでは、アプリケーションコンテナと並んである専用のログコンテナが必要です。このログコンテナは「サイドカー」と呼ばれることが多く、アプリケーションコンテナが共有のDockerボリュームに作成する一時的なログファイルを読み取ります。サイドカーは、これらのログを収集して、ログ監視サービスにアップロードできる形式に変換します。

このアプローチは、より複雑なデプロイメントに役立ちますが、設定とスケーリングは難しくなります。また、通常、Dockerの組み込みログコマンドの即時の利便性が失われます。

要約

Dockerは、ロギングドライバーのスイートによって提供される多様なログ監視機能を持っています。各コンテナは独自のロギングドライバーを使用できるため、それぞれのアプリケーションの要件に適した形式でログを保存することができます。

ログには、コンテナの標準出力ストリームによって出力されたすべてのものが含まれます。echo、print、console.log()、またはお使いのプログラミング言語の同等のコマンドを使用して、docker logsの出力に行を追加できます。ログは、コンテナがdocker rmによって削除されるまで保持されます。

関連記事: