「コンテナIDの長いディレクトリ名の中に2GBを超えるjsonファイルが潜んでいた」
こういった事故は、Dockerのlogging driver(ログドライバ)の設定を理解していないことで起きます。Dockerはデフォルトでjson-fileドライバを使いますが、ローテーション設定がない場合、コンテナが動き続けるほどログファイルは無制限に膨らみます。
この記事では、Dockerのlogging driverの種類と選択基準、json-fileドライバのmax-size/max-fileによるローテーション設定、/etc/docker/daemon.jsonでのグローバル適用、docker-compose.ymlでのサービス別設定まで、Ubuntu 24.04 LTS / RHEL 9.4の実機出力を交えて解説します。
この記事のポイント
・max-size/max-fileでログローテーションを設定できる
・daemon.jsonで全コンテナに一括設定を適用できる
・docker-compose.ymlのloggingセクションで個別設定できる
・本番環境ではjournaldやsyslogへの転送も検討する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜDockerのログはディスクを圧迫するのか?
Dockerはコンテナの標準出力(stdout)と標準エラー出力(stderr)をホスト上のJSONファイルとして保存します。デフォルトのlogging driverは「json-file」で、保存先は以下のパスです。/var/lib/docker/containers/<コンテナID>/<コンテナID>-json.log実際のサーバーでログファイルのサイズを確認してみましょう。コンテナIDごとのディスク占有量を見ます。
# コンテナIDごとのログサイズを確認する $ sudo du -sh /var/lib/docker/containers/*/ 4.0K /var/lib/docker/containers/2a3b4c5d6e7f8901.../ 2.3G /var/lib/docker/containers/a1b2c3d4e5f60789.../ 128M /var/lib/docker/containers/c7d8e9f0a1b2c3d4.../
ローテーション設定がない場合、コンテナが動き続ける限りこのファイルは増え続け、最終的にはDockerデーモンが書き込めなくなってサービスが停止する事故につながります。ディスクフルはサーバー障害の中でも特に発覚が遅く、気づいた時には手遅れになりやすいトラブルです。
Dockerが対応するlogging driverの種類
1. json-file(デフォルト)
ホスト上のJSONファイルにログを書き込むデフォルトドライバです。docker logsコマンドでそのまま参照できるため、開発環境での利便性は高い。ただしローテーション設定を明示しないと無制限に増えます。・メリット:
docker logsコマンドでリアルタイム参照できる・デメリット:ローテーション設定を忘れるとディスクフルの原因になる
2. local(省スペース設計)
json-fileの後継として設計されたドライバです。ログをgzipで圧縮して保存するため、同等の情報量でディスク使用量を大幅に削減できます。デフォルトでmax-size=20m・max-file=5のローテーションが有効なので、何も設定しなくてもある程度の制限がかかります。・メリット:圧縮とデフォルトローテーションで省スペース。
docker logsも使える・デメリット:json-fileより知名度が低く、既存チームへの説明が必要になることもある
3. journald(systemd統合)
systemdのjournaldにログを転送するドライバです。journalctlコマンドでシステムログと一元管理できる利点があり、RHEL 9 / Rocky Linux環境での本番運用では有力な選択肢です。・メリット:systemdのログ管理インフラと統合できる
・デメリット:
docker logsコマンドが使えなくなる4. syslog
rsyslogやsyslog-ngにログを転送するドライバです。既存のsyslogインフラに統合する際に使用します。journaldと同様にdocker logsが使えなくなる点に注意が必要です。5. fluentd・awslogs(集中ログ管理向け)
マイクロサービス環境で複数コンテナのログを集中収集する場合に採用されるドライバです。fluentdは自社ログ基盤、awslogsはAmazon CloudWatch Logsへの転送に対応しています。Kubernetes環境ではこれらを組み合わせるのが一般的です。json-fileドライバでローテーションを設定する
1. /etc/docker/daemon.jsonでグローバル設定する(推奨)
すべてのコンテナに一括でローテーション設定を適用するには、/etc/docker/daemon.jsonに設定を記述します。これが最もシンプルで管理しやすい方法です。まず現在のdaemon.jsonの状態を確認します。
# daemon.jsonの存在を確認する(存在しない場合は新規作成する) $ ls -la /etc/docker/daemon.json ls: cannot access '/etc/docker/daemon.json': No such file or directory
/etc/docker/daemon.jsonを作成します。# /etc/docker/daemon.json を作成してローテーション設定を記述する { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }
・max-size:1つのログファイルの上限サイズ(100MBに達したらローテーション開始)
・max-file:保持するローテーションファイル数(3世代 = 最大300MB)
設定を記述したらDockerデーモンを再起動して反映します。
# daemon.jsonの設定を反映させる $ sudo systemctl daemon-reload $ sudo systemctl restart docker # 設定が反映されたか確認する $ docker info | grep -A 4 "Logging Driver" Logging Driver: json-file log-opts: max-file: 3 max-size: 100m
2. docker run --log-optで個別設定する
コンテナ起動時に個別のログ設定を上書きしたい場合は--log-optオプションを使います。# ログローテーションを個別設定してコンテナを起動する $ docker run -d \ --name webapp \ --log-driver json-file \ --log-opt max-size=50m \ --log-opt max-file=5 \ nginx:latest # 設定が反映されているか確認する $ docker inspect webapp --format='{{json .HostConfig.LogConfig}}' {"Type":"json-file","Config":{"max-file":"5","max-size":"50m"}}
3. docker-compose.ymlのloggingセクションで設定する
docker-compose.ymlで管理している環境では、各サービスのloggingセクションに設定を記述します。# docker-compose.yml でのlogging設定例 services: web: image: nginx:latest logging: driver: "json-file" options: max-size: "100m" max-file: "3" db: image: mysql:8.0 logging: driver: "json-file" options: max-size: "50m" max-file: "5"
・Docker Compose入門|複数コンテナでWordPress環境を構築するハンズオン
開発環境と本番環境のlogging driver使い分け
Dockerのlogging driverは目的に応じて使い分けるのが運用設計の基本です。| 環境 | 推奨ドライバ | 理由 |
|---|---|---|
| 開発環境 | json-file(max-size設定あり) | docker logsが使える。設定が手軽 |
| 本番(単体サーバー) | json-file + ローテーション | シンプルで管理が容易 |
| 本番(RHEL/Rocky Linux) | journald | systemdログと一元管理できる |
| 本番(クラウド) | awslogs / fluentd | 集中ログ管理基盤と統合できる |
# journaldドライバでコンテナを起動する $ docker run -d \ --name webapp \ --log-driver journald \ nginx:latest # journalctlでコンテナのログを確認する $ journalctl CONTAINER_NAME=webapp -f Jul 08 10:23:45 web-server01 a1b2c3d4[1234]: 172.17.0.x - - [08/Jul/2026:10:23:45 +0900] "GET / HTTP/1.1" 200 615
docker logsコマンドは使えなくなります。チームの習熟度や既存インフラとの整合性を考慮して選択してください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Dockerのログ設計を含む実践的な運用ノウハウを習得するには、Docker実践講座(docker.linuxmaster.jp)をご活用ください。現役エンジニアが現場で使える技術を体系的に教えます。
docker logsコマンドでログを確認する
ローテーション設定を入れたとしても、ログの確認手順は変わりません。docker logsコマンドの主要オプションを押さえておきましょう。# コンテナのログをリアルタイム表示する(tail -fと同じ感覚) $ docker logs -f webapp # 最新100行だけ表示する $ docker logs --tail 100 webapp # タイムスタンプ付きで表示する $ docker logs -t webapp # 特定の日時以降のログを表示する(ISO 8601形式) $ docker logs --since "2026-07-01T00:00:00" webapp 2026-07-01T00:00:12.345Z stderr F 172.17.0.x - - [01/Jul/2026:09:00:12 +0900] "GET / HTTP/1.1" 200 615 # docker-compose環境で複数サービスのログを一度に確認する $ docker compose logs -f --tail 50
・docker execでコンテナ内を調査・デバッグする方法|docker logs・docker inspectの実践例
トラブルシュート|ディスクフル発生時の確認と対処
1. どのコンテナがディスクを圧迫しているか確認する
# Dockerのディスク使用状況をサマリー表示する $ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 12 5 4.2GB 2.1GB (50%) Containers 8 3 2.4GB 1.9GB (79%) Local Volumes 3 2 512MB 128MB (25%) Build Cache 0 0 0B 0B # コンテナごとのサイズ詳細を確認する(SIZEにログが含まれる) $ docker ps -s --format "table {{.Names}}\t{{.Size}}" NAMES SIZE webapp 2.3GB (virtual 3.1GB) db 128MB (virtual 512MB) cache 4.0MB (virtual 256MB)
2. 設定前に蓄積したログファイルを削除する
ローテーション設定を追加しても、それ以前に蓄積されたログは自動削除されません。蓄積済みログを削除するには、コンテナを停止・削除して再起動するのが確実な手順です。# コンテナを停止・削除してログをクリアする $ docker stop webapp webapp $ docker rm webapp webapp # ローテーション設定を付けて再起動する $ docker run -d \ --name webapp \ --log-driver json-file \ --log-opt max-size=100m \ --log-opt max-file=3 \ nginx:latest
3. 停止済みコンテナなど不要リソースを一括削除する
# 停止済みコンテナ・未使用イメージ・キャッシュを一括削除する(本番実行前に内容を必ず確認すること) $ docker system prune WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache Are you sure you want to continue? [y/N] y Total reclaimed space: 2.15GB
4. journald使用時のログ容量管理
journaldドライバを使っている場合は、journalctl側のディスク使用量も確認します。# journalのディスク使用量を確認する $ journalctl --disk-usage Archived and active journals take up 1.2G in the file system. # 500MB以上のジャーナルを削除する $ sudo journalctl --vacuum-size=500M Vacuuming done, freed 768.0M of archived journals from /var/log/journal.
本記事のまとめ
Dockerのログ運用設計でやるべきことの早見表です。| やりたいこと | 設定方法 |
|---|---|
| 全コンテナにローテーション設定 | sudo vi /etc/docker/daemon.jsonにlog-optsを記述 |
| 特定コンテナのみ個別設定 | docker run --log-opt max-size=100m --log-opt max-file=3 |
| Compose環境での設定 | docker compose up前にlogging.optionsを記述する |
| ディスク使用状況の確認 | docker system dfまたはdocker ps -s |
| 蓄積済みログの削除 | docker stopとdocker rm後に再起動する |
・デフォルトのjson-fileはローテーション無効なので必ずmax-size/max-fileを設定する
・daemon.jsonへの設定が最もシンプルで全コンテナに一括適用できる
・docker-compose.ymlのloggingセクションでサービスごとの細かい設定ができる
・本番環境はjournaldやsyslog転送など運用ポリシーに合ったドライバを選ぶ
次に読む記事
・docker execでコンテナ内を調査・デバッグする方法|docker logs・docker inspectの実践例
・dockerコマンドの使い方|コンテナ起動・停止・イメージ管理の実践例
・Docker Compose入門|複数コンテナでWordPress環境を構築するハンズオン
Dockerのログ設計を含めた実践的な運用スキルを体系的に習得したい方は、Docker実践講座(docker.linuxmaster.jp)をご覧ください。現役エンジニアが現場目線で教えるDockerの基礎から本番運用まで、ハンズオン形式で学べます。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:Dockerコンテナのリソース制限と監視|--memory・--cpusとdocker statsでホストを守る設計
- この記事の属するカテゴリ:Dockerへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます