Docker

Dockerコンテナのログ肥大化を防ぐ — ログローテーション設定

この記事の対象者
  • Dockerでアプリケーションを本番運用している方
  • サーバーのディスク容量が不足してきた方
  • コンテナのログ管理をしたことがない方

ログが肥大化する仕組み

Dockerはデフォルトでコンテナの標準出力・標準エラー出力をすべてJSONファイルに保存します。しかし、サイズ制限もローテーションもありません

デフォルトの危険性

アクセスの多いWebアプリケーションでは、ログが数GBに達してディスクを圧迫し、最悪の場合サーバーが停止します。

ログファイルの場所は /var/lib/docker/containers/<コンテナID>/<コンテナID>-json.log です。

現在のログサイズを確認する

ターミナル
# コンテナごとのログサイズを確認
sudo du -sh /var/lib/docker/containers/*/*.log | sort -rh

何も設定していない場合、長期間運用しているコンテナのログが数百MB〜数GBになっていることがあります。

ログローテーションを設定する

Docker デーモンの設定ファイル /etc/docker/daemon.json でログの上限を設定します。

/etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
設定 意味
max-size 1ファイルあたりの最大サイズ(10m = 10MB)
max-file 保持するファイル数(3つでローテーション)

この設定では、コンテナ1つあたり最大30MB(10MB × 3ファイル)のログを保持します。

設定後、Dockerデーモンを再起動します。

ターミナル
sudo systemctl restart docker

注意

Dockerデーモンの再起動により、全コンテナが一時停止します。restart: always を設定していれば自動復旧しますが、メンテナンス時間帯に実施しましょう。

既存コンテナへの適用

daemon.json の設定は新しく作成されるコンテナに適用されます。既存コンテナに適用するには、コンテナを再作成(docker compose up -d --force-recreate)する必要があります。

設定を確認する

ターミナル
# 設定が反映されたか確認
docker inspect --format="{{.HostConfig.LogConfig}}" コンテナ名
{json-file map[max-file:3 max-size:10m]}

まとめ

  • デフォルトは危険: Dockerはログサイズ制限なしで保存し続ける
  • 設定方法: /etc/docker/daemon.jsonmax-sizemax-file を指定
  • 推奨値: max-size: 10mmax-file: 3(コンテナあたり最大30MB)
  • 適用: systemctl restart docker 後、コンテナを再作成