3行要約
- Dockerコンテナのコンソールログは、システムメモリではなくホストのディスクにファイルとして保存されます。
docker logsコマンドは、この保存されたファイルを読み込んで表示する役割を担っています。- ログファイルが無限に肥大化するのを防ぐためには、ログローテーションオプション(
max-size、max-file)を設定することが非常に重要です。
1. ログはどこに、どのように保存されるのか?
Dockerは、コンテナの標準出力(stdout)と標準エラー(stderr)ストリームを両方キャプチャし、ロギングドライバー(Logging Driver) を介して処理します。特別な設定を行わない限り、Dockerはデフォルトでjson-fileロギングドライバーを使用します。
- 保存場所: コンテナのログは、ホストシステムの特定のパスにJSON形式のファイルとして保存されます。一般的なパスは以下の通りです。
/var/lib/docker/containers/[コンテナ_ID]/[コンテナ_ID]-json.log
docker logsコマンド: このコマンドは、実際にはメモリ上の内容を表示しているのではなく、上記で述べたJSONログファイルを読み込んでターミナルに表示するものです。

2. ログが蓄積し続けると、ディスク容量は不足しないのか?
はい、その通りです。何も対策を講じないと、ログファイルは肥大化し続け、ホストのディスク容量をすべて占有してしまう可能性があります。これを防ぐため、Dockerはログファイルのサイズと数を制限するログローテーション(Log Rotation) オプションを提供しています。
例えば、docker runコマンドを実行する際に、以下のオプションを追加することができます。
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
--log-opt max-size=10m: ログファイル1つあたりの最大サイズを10MBに制限します。--log-opt max-file=3: ログファイルの最大数を3個に制限します。3個を超えると、最も古いファイルから削除されます。
このように設定することで、該当コンテナのログは最大30MB(10MB × 3個)までしかディスクスペースを使用しなくなります。
3. docker-compose.ymlファイルに設定する
Docker Composeでは、docker-compose.ymlファイル内で各サービスごとにロギングオプションを非常に簡単に設定できます。
docker runコマンドの--log-optフラグがYAML形式で記述されると考えると良いでしょう。
以下は、my-appというサービスにログローテーションを適用する例です。
services:
my-app:
image: your-app-image
# ... 他の設定 ...
deploy:
resources:
limits:
memory: 512M
# 👇 この部分がログ設定です。
logging:
driver: "json-file" # 使用するロギングドライバー(デフォルト値なので省略可能)
options:
max-size: "10m" # ファイルあたりの最大サイズ: 10MB
max-file: "3" # 最大ファイル数: 3個
logging: 該当サービスのロギング設定を開始するキーです。driver: 使用するロギングドライバーを指定します。json-fileがデフォルト値です。options: ドライバーに渡すオプションを設定します。max-size:docker runの--log-opt max-sizeと同じです。max-file:docker runの--log-opt max-fileと同じです。
これでdocker-compose upでこのサービスを開始すると、my-appコンテナのログは自動的にローテーションされ、最大30MB(10MB × 3個)のディスクスペースのみを使用するようになります。
4. すべてのコンテナにデフォルト設定を適用する
もしすべてのコンテナにいちいちオプションを設定するのが面倒で、システム全体にデフォルトポリシーを適用したい場合は、Dockerデーモン(Daemon)設定ファイルを修正する方法が最も良いでしょう。
/etc/docker/daemon.jsonファイルを開くか作成します。(ファイルが存在しない場合は新規作成してください。)- 以下のように内容を記述します。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- Dockerデーモンを再起動します。
sudo systemctl restart docker
このように設定することで、今後作成されるすべてのコンテナは、別途ロギング設定を行わない限り、自動的にこのポリシーに従うようになります。もちろん、docker-compose.ymlファイルやdocker runコマンドで特定のコンテナに対して異なるロギングオプションを指定した場合、個別の設定がデーモン設定よりも優先されます。
- 個別のサービス設定:
docker-compose.ymlファイル内のloggingセクションで設定するのが最も一般的で便利です。 - グローバルなデフォルト設定: サーバーのすべてのコンテナに一括したポリシーを適用するには、
/etc/docker/daemon.jsonファイルを修正してください。