Dockerコンテナのログがあふれてディスク容量不足を解消!


Dockerを運用していると、コンテナのログが大量に溜まり、ディスク容量を圧迫することがあります。特に docker-compose
を使用している環境では、デフォルトのログ設定のままだとログが無制限に蓄積され、気づかないうちにストレージがいっぱいになることも。
ディスク容量不足の場所を探していたところ、コンテナの肥大化を確認しました。
du -shc /var/lib/docker/containers/* -x | sort -rh
9.3G 合計
7.5G ./bba63eea9d895b78284dc1ec7a4ba9d74185dd8ec441c5bc41da954c5d622ab1
808M ./0b01e61f5d2d745b3b0f496077cd6fd94e1c8d0d6aecb2965ad31f38ad639e9c
・・・
そこで、本記事では docker-compose
を使ったログの管理方法について解説します。
ログがディスクを圧迫する原因
Docker のデフォルト設定では、コンテナのログは json-file
ドライバを使って /var/lib/docker/containers/
配下に無制限に蓄積されます。そのため、長期間運用するとログが肥大化し、ディスク容量を圧迫する原因になります。
現状のログサイズを確認する
コンテナごとのログサイズを確認するには、以下のコマンドを使用します。
sudo du -sh /var/lib/docker/containers/*/*.log
このコマンドでログファイルのサイズがどの程度かを把握できます。
docker-compose
のログ設定
docker-compose.yml
でログを制限するには、各サービスの logging
設定を追加します。
例えば、ログの最大サイズを 10MB、保持するログのファイル数を 3 つに制限する場合、以下のように設定します。
version: '3.8'
services:
my_service:
image: my_image
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
この設定により、ログが 10MB に達すると新しいログファイルが作成され、最大 3 つのログファイルが保持されるようになります。
docker-compose.yml
のログはどこに保存される?
docker-compose.yml
に logging
設定を追加しても、ログの保存場所はデフォルトと変わりません。通常、各コンテナのログは以下のディレクトリに格納されます。
/var/lib/docker/containers/<container_id>/<container_id>-json.log
container_id
は docker ps -a
で確認できます。
このため、logging
設定を行っても、json-file
ドライバを使用している限り、ログはこのディレクトリに保存され続けます。
他のログドライバの利用
Docker では json-file
以外にも以下のようなログドライバを使用できます。
syslog
:システムの syslog に送るjournald
:systemd の journal に送るfluentd
:Fluentd に送信awslogs
:AWS CloudWatch Logs に送信none
:ログを無効化
例えば、syslog を使用する場合は以下のように設定します。
logging:
driver: "syslog"
options:
syslog-address: "udp://192.168.1.100:514"
ログの定期的なクリア
すでに肥大化したログを削除する場合、以下のコマンドでログファイルをクリアできます。
echo "" | sudo tee /var/lib/docker/containers/*/*.log
また、cron を利用して定期的にログを削除することも可能です。
まとめ
- Docker のデフォルトではログが無制限に溜まるため、設定を見直す必要がある
docker-compose.yml
のlogging
設定でmax-size
やmax-file
を指定する- 設定を追加してもログの保存先は変わらず
/var/lib/docker/containers/
配下 - syslog などの外部ログ管理システムと連携するのも一つの方法
- 既存のログを削除・管理することでディスク容量を節約できる
Docker を運用する際は、適切なログ設定を行い、ディスク容量を効率的に使いましょう!