Docker コンテナにおけるログローテーションの設定

We all need logs!

Docker で作業をしているとき、特にコミュニティからの Docker イメージを再生していて、期待どおりの結果が得られないと、ブラックボックスと格闘しているような気持ちになることがしばしばあります。多くの場合、ログの読み込みはデバッグのために多くの時間を要します。

この記事では、Docker コンテナのログローテーションの設定について解説します。

デフォルトのロギング・ドライバ

コンテナには異なるロギング・ドライバを設定することが可能です。デフォルトではコンテナの stdoutstderr/var/lib/docker/containers/[container-id]/[container-id]-json.log にある json ファイルに書き込まれます。これをそのまま放置すると、以下のように大量のディスクスペースを使ってしまう可能性があります。

A large log file in json format

A large log file in json format

ログをマニュアルでパージする

json ログファイルがディスクスペースを圧迫している場合は、以下のコマンドを使用してパージすることが可能です。

1
truncate -s 0 <logfile>

こうした json ログファイルを定期的にパージするために cronjob を設定することも可能ですが、長期的に考えるとログローテーションを設定したほうが無難でしょう。

ログローテーションの設定

デフォルトのロギング・ドライバを設定する

デフォルトのロギング・ドライバを設定するために、/etc/docker/daemon.json に以下値を追加します。このファイルが存在しない場合は新たに作成しましょう。

1
2
3
4
5
6
7
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "10"
  }
}

json-file のロギング・ドライバにはいくつかのオプションがあり、syslog などの他のロギング・ドライバに変更することも可能です。詳細は Docker Docs - Configure logging drivers をご参照ください。

以下のコマンドを実行して、アップデートされた daemon.json をリロードします。新しい設定は、再起動後に新しく作成されたすべてのコンテナに適用されます。

1
2
3
$ systemctl daemon-reload

$ systemctl restart docker

コンテナにロギング・ドライバを設定する

グローバルコンフィギュレーションにしたくない場合は、コンテナレベルで設定することも可能です。

docker run コマンドを使用する

docker run コマンドを使えば、以下のようにロギング・ドライバとオプションを指定することができます。

1
2
3
4
5
$ docker run \
    --log-driver json-file \
    --log-opt max-size=10m \
    --log-opt max-file=10 \
    alpine echo hello world

docker-compose を使用する

ロギング・ドライバとオプションは、以下のように docker-compose を使用して設定することも可能です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
version: '3.2'
services:
  nginx:
    image: 'nginx:latest'
    ports:
      - '80:80'
    logging:
      driver: "json-file"
      options:
        max-size: "1k"
        max-file: "3"

設定が機能していることを確認しましょう。

The logs are broken down into 1k files

The logs are broken down into 1k files

まとめ

デフォルトの設定は正常に機能しますが、ディスクスペースがいつコンテナログでいっぱいになってしまうかわかりません。今回はそうした問題を回避するための方法をお伝えしました。また、ログが重要な資産であることも忘れてはいけません。トラブルがあった際に役立つだけでなく、隠された価値があるのです。ログは大切に保管するようにしましょう。

ログマネジメントSAASソリューションをお探しの場合は、Boatswain をぜひご利用ください。ログの管理と Docker サーバーの監視をお手伝いします。💫

Insufficient facts always invite danger

Insufficient facts always invite danger