この記事の対象者
- 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.jsonにmax-sizeとmax-fileを指定 - 推奨値:
max-size: 10m、max-file: 3(コンテナあたり最大30MB) - 適用:
systemctl restart docker後、コンテナを再作成