Docker のログローテーションを設定する方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker は広く採用されているコンテナ化プラットフォームとなっており、開発者が一貫性のあるスケーラブルな環境でアプリケーションを構築、デプロイ、実行できるようになっています。Docker ベースのインフラストラクチャが拡大するにつれて、増え続けるログデータの管理が重要なタスクとなります。このチュートリアルでは、Docker コンテナのログローテーションを設定する手順を説明し、効率的なログ管理とストレージの最適化を実現します。

Docker ロギングの理解

Docker は強力なコンテナ化プラットフォームであり、アプリケーションの開発、デプロイ、管理方法を革新しました。Docker を使用する上で重要な側面の 1 つは、Docker コンテナが生成するログを理解し、管理することです。ログは、コンテナ化されたアプリケーションの動作、パフォーマンス、健全性に関する貴重な情報を提供し、トラブルシューティング、監視、監査に不可欠です。

Docker ロギングとは?

Docker は、各コンテナの標準出力 (stdout) と標準エラー (stderr) ストリームをキャプチャする組み込みのロギングメカニズムを提供しています。このロギングメカニズムは Docker ロギングドライバと呼ばれ、コンテナが生成するログを表示および管理できます。

Docker ログへのアクセス

docker logs コマンドを使用して、Docker コンテナのログにアクセスできます。このコマンドを使用すると、特定のコンテナのログを表示したり、ログストリームをリアルタイムで追跡したり、さまざまな基準に基づいてログをフィルタリングすることもできます。

## View the logs of a container

## Follow the log stream in real-time

## Filter logs based on a specific time range

ログレベルの理解

Docker ログにはさまざまなログレベルがあり、メッセージの深刻度を示します。利用可能なログレベルは次のとおりです。

  • debug: コンテナの動作に関する詳細情報。
  • info: コンテナの動作に関する一般的な情報。
  • warn: 潜在的な問題や予期しない動作に関する警告。
  • error: コンテナの動作中に発生した可能性のあるエラー。
  • fatal: コンテナの失敗を引き起こした深刻なエラー。

コンテナを起動する際に --log-level オプションを設定することで、コンテナのログレベルを制御できます。

## Start a container with a specific log level

Docker ロギングドライバ

Docker はさまざまなロギングドライバをサポートしており、これらによってログの保存と管理方法が決まります。デフォルトのロギングドライバは json-file ドライバで、これはログを JSON 形式でホストのファイルシステムに保存します。ただし、要件やインフラストラクチャに応じて、syslogjournaldfluentd などの他のロギングドライバを使用するように Docker を構成することもできます。

graph LR A[Docker Container] --> B[Logging Driver] B --> C[json-file] B --> D[syslog] B --> E[journald] B --> F[fluentd]

Docker ロギングの基本を理解することで、コンテナ化されたアプリケーションが生成するログを効果的に管理し、トラブルシューティング、パフォーマンス監視、インフラストラクチャの信頼性の確保に役立てることができます。

Docker コンテナのログローテーションの設定

Docker コンテナが時間とともにより多くのログを生成するにつれて、ログファイルがホストシステムのディスク領域を急速に消費することがあります。これを防ぐために、ログローテーションを設定することができます。ログローテーションとは、古いログファイルを定期的にアーカイブして削除し、ディスク領域を解放するプロセスです。

ログローテーションの理解

ログローテーションはシステム管理における一般的な手法で、ログファイルを定期的にローテーション、圧縮、アーカイブして、管理しやすいログファイルサイズを維持します。このプロセスにより、ログファイルが無制限に増大して利用可能なディスク領域をすべて消費することが防がれます。

Docker コンテナのログローテーションの設定

Docker コンテナのログローテーションを設定するには、コンテナを起動する際に組み込みの --log-opt オプションを使用できます。このオプションを使用すると、ログファイルの最大サイズ、保持するアーカイブ済みログファイルの数、圧縮形式などのログローテーションパラメータを指定できます。

## Start a container with log rotation configured

上記の例では、コンテナはログファイルが最大 10 MB に達したときにログファイルをローテーションし、最大 5 つのアーカイブ済みログファイルを保持するように設定されています。

ログローテーション戦略の実装

組み込みの --log-opt オプションは個々のコンテナのログローテーションを設定する便利な方法ですが、Docker インフラストラクチャ全体でのログローテーションの管理には適さない場合があります。そのような場合は、外部ツールやスクリプトを使用して自動化されたログローテーション戦略を実装することができます。

一般的なアプローチの 1 つは、logrotate ユーティリティを使用することです。これは Linux システムでログローテーションを管理するための標準ツールです。Docker コンテナのログローテーションルールを指定する logrotate 設定ファイルを作成し、cron ジョブまたはシステムサービスを使用して logrotate コマンドを定期的に実行するようにスケジュールすることができます。

以下は、Docker コンテナ用の logrotate 設定ファイルの例です。

/var/lib/docker/containers/*/*.log {
    rotate 5
    copytruncate
    compress
    delaycompress
    missingok
    notifempty
}

この設定ファイルは、すべての Docker コンテナのログファイルをローテーションし、最大 5 つのアーカイブ済みログファイルを保持し、アーカイブされたファイルを圧縮し、ログファイルが空の場合は削除します。

Docker コンテナのログローテーションを設定することで、ホストシステムのディスク領域を効率的に使用し、コンテナ化されたアプリケーションがログファイルの増大に影響されることなくスムーズに実行されるようにすることができます。

自動化されたログローテーション戦略の実装

Docker の組み込み --log-opt オプションは、個々のコンテナのログローテーションを設定する便利な方法ですが、Docker インフラストラクチャ全体でのログローテーション管理において、最もスケーラブルまたは効率的な解決策ではない場合があります。そのような場合は、外部ツールやスクリプトを使用して自動化されたログローテーション戦略を実装することができます。

logrotate の使用

一般的なアプローチの 1 つは、logrotate ユーティリティを使用することです。これは Linux システムでログローテーションを管理するための標準ツールです。logrotate は、ファイルサイズ、日付、またはスケジュールなどのさまざまな基準に基づいて、ログファイルを監視してローテーションするように設定できます。

以下は、Ubuntu 22.04 システム上のすべての Docker コンテナのログを管理するために logrotate を設定する方法の例です。

  1. Docker コンテナ用の logrotate 設定ファイルを作成します。

    sudo touch /etc/logrotate.d/docker-containers
    sudo nano /etc/logrotate.d/docker-containers
  2. 以下の設定をファイルに追加します。

    /var/lib/docker/containers/*/*.log {
        rotate 5
        copytruncate
        compress
        delaycompress
        missingok
        notifempty
    }

    この設定により、すべての Docker コンテナのログファイルがローテーションされ、最大 5 つのアーカイブ済みログファイルが保持され、アーカイブされたファイルが圧縮され、ログファイルが空の場合は削除されます。

  3. ファイルを保存し、テキストエディタを終了します。

  4. logrotate 設定をテストします。

    sudo logrotate -d /etc/logrotate.d/docker-containers

    -d オプションを使用すると、logrotate がデバッグモードで実行され、実際に操作を行わずに実行されるアクションが表示されます。

  5. cron ジョブまたはシステムサービスを使用して、logrotate コマンドを定期的に実行するようにスケジュールします。

    sudo crontab -e

    以下の行を crontab に追加して、logrotate を毎日午前 3 時に実行するようにします。

    0 3 * * * /usr/sbin/logrotate /etc/logrotate.d/docker-containers

サードパーティツールの使用

logrotate に加えて、Docker インフラストラクチャの自動化されたログローテーション戦略を実装するのに役立つサードパーティのツールやサービスがいくつかあります。人気のあるオプションには以下のようなものがあります。

  • Fluentd:Docker コンテナからのログを管理およびローテーションするために使用できる人気のあるオープンソースのデータ収集ツールです。
  • Elastic Stack (ELK):Elasticsearch、Logstash、Kibana を含むツールセットで、集中ログ管理とローテーションに使用できます。
  • Splunk:Docker と統合してログを管理およびローテーションできる商用のログ管理および分析プラットフォームです。
  • LabEx Log Rotation:Docker コンテナの自動ログローテーションと管理を提供する LabEx ブランドのサービスです。

自動化されたログローテーション戦略を実装することで、Docker インフラストラクチャのディスク領域を効率的に使用し、コンテナ化されたアプリケーションがログファイルの増大に影響されることなくスムーズに実行されるようにすることができます。

まとめ

このチュートリアルを終えると、Docker ロギングについて包括的な理解が得られ、Docker ベースのアプリケーションの健全性とパフォーマンスを維持するための効果的なログローテーション戦略を実装できるようになります。Docker のログローテーションを習得することで、ストレージを最適化し、システムの安定性を向上させ、整然としたログ管理システムを維持するのに役立ちます。