Dockerのログ運用設計|loggingドライバとjson-fileローテーションで肥大化を防ぐ方法

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Docker > Dockerのログ運用設計|loggingドライバとjson-fileローテーションで肥大化を防ぐ方法
「本番のDockerコンテナを数週間動かしたら、/var/lib/dockerのディスクが溢れてサービスが落ちた」
「コンテナ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への転送も検討する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ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.../

本番のWebアプリコンテナ(a1b2...)が2.3GBを占めています。nginxをデフォルト設定で数週間稼働させ、アクセスログをすべてstdoutに吐き続けた結果です。

ローテーション設定がない場合、コンテナが動き続ける限りこのファイルは増え続け、最終的には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

重要な注意点:daemon.jsonの変更は、変更後に新規起動したコンテナにのみ適用されます。既存コンテナには遡って反映されません。既存コンテナを新しい設定で動かすには、コンテナを停止・削除して再作成する必要があります。

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"}}

個別設定はdaemon.jsonのグローバル設定より優先されます。アクセスログが多いWebサーバーはmax-sizeを大きく、バッチ処理コンテナは小さくするなど、コンテナの特性に合わせた設定が可能です。

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"

yamlで管理することで、サービスごとのログ設定をコードとして記録しバージョン管理できます。WebサーバーとDBでローテーション設定を分けたい場合も、yaml上で明示的に管理できます。Docker Composeの基本的な使い方については以下の記事も参照してください。

Docker Compose入門|複数コンテナでWordPress環境を構築するハンズオン

開発環境と本番環境のlogging driver使い分け

Dockerのlogging driverは目的に応じて使い分けるのが運用設計の基本です。
環境 推奨ドライバ 理由
開発環境 json-file(max-size設定あり) docker logsが使える。設定が手軽
本番(単体サーバー) json-file + ローテーション シンプルで管理が容易
本番(RHEL/Rocky Linux) journald systemdログと一元管理できる
本番(クラウド) awslogs / fluentd 集中ログ管理基盤と統合できる
本番環境でjournaldを使う場合の起動例と確認方法です。

# 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

注意:journaldドライバを使うと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 logsとdocker inspectを組み合わせたコンテナ調査の詳細については、以下の記事を参照してください。

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 stopdocker 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の基礎から本番運用まで、ハンズオン形式で学べます。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。