コンテナログを失わないための方法
Dockerログの保存場所、ディスクを圧迫しないためのサイズ制限の方法、コンテナ再作成後もログを保持するための設定を説明します。
更新日 2026年8月23日
サービスが停止したとき、ログだけが唯一の真実の情報源となります。デフォルトでは、Dockerはログをコンテナの隣のファイルに書き込み、サイズに上限を設けません。おしゃべりなアプリケーションは1週間でディスク全体を埋め尽くす可能性があります。
読み方
docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50
覚えておく価値があります。Dockerはアプリケーションが標準出力と標準エラーに書き込んだ内容を表示します。コンテナ内の独自のファイルに書き込む場合、docker logs には何も表示されません。コンテナ内でログを探すか、出力をリダイレクトする必要があります。
docker compose exec app ls -la /var/log
今すぐサイズを制限する
すべてのコンテナに対するグローバル設定は /etc/docker/daemon.json です。
{
"log-driver": "json-file",
"log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker
この設定は再起動後に作成されたコンテナに適用されます。実行中のコンテナは再作成する必要があります。単一のサービスに対しては、同じ内容をComposeに記述します。
services:
app:
logging:
driver: json-file
options:
max-size: "20m"
max-file: "3"
結果として、無制限の増加ではなく、サービスごとに最大60 MBになります。
予期せぬ事態になる前に現在のサイズを確認しましょう。
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail。 実行中のファイルをrmで削減することはできません。Dockerがディスクリプタを保持している間は容量が解放されません。正しい方法は、コンテナを再作成するか、sudo truncate -s 0 <file>を実行することです。
コンテナを超えてログを残す
ログファイルはコンテナとともに削除されます。履歴が重要な場合は、システムジャーナルに引き渡します。
logging:
driver: journald
options:
tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"
journald は記録を独自にローテーションし、/etc/systemd/journald.conf の SystemMaxUse 設定によって上限が設けられます。どれだけの容量を使用しているかを確認するには、journalctl --disk-usage を実行します。
複数のサービスを一度に扱う場合は、すべてを1か所に集める方が便利です。たとえば、記録を日ごとにファイルへ保存する専用のコレクターコンテナを使用します。ただし、まずは journald から始めましょう。すでに存在し、コストもかかりません。
障害をデバッグするときに確認すべきこと
- クラッシュ前の最後の200行:
docker logs --tail 200 <container>。 - 終了コード:
docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>。コード137とOOMKilledのtrueは、メモリ不足によりカーネルがプロセスを強制終了したことを意味します。リソース制限を参照してください。 - マシンのシステムログ:
sudo dmesg -T | tail -50は、メモリ不足による強制終了とディスクエラーを表示します。
よくある間違い
- ログでディスクが埋まり、すべてのサービスが停止した。 サイズの制限は、Dockerのインストール直後に必ず行うべきです。
- すでに削除されたコンテナのログを見ている。
docker compose downの後では、ログは消えています。事前に記録をjournaldに収集しておきましょう。 - ログ内の機密情報。 アプリケーションはパスワードを含む接続文字列を出力することを好みます。マシンへのアクセス権を持つ誰もがログを読むことができます。
- テキストコンソールでエラーを探している。 常に80×24で、長い行は切り捨てられます。ログを読むには、SSHまたは「Screen」コンソールの方が便利です。