docker logsで表示されるログは、システムメモリに累積されることはありません。代わりに、基本的には ホスト(Host)システムのディスクにファイルとして保存されます。
ログはどこにどのように保存されるのですか? ⚙️
Dockerはコンテナの標準出力(stdout)と標準エラー(stderr)ストリームをすべてキャプチャし、 ロギングドライバー(Logging Driver) を通じて処理します。特別な設定をしない限り、Dockerは基本的に json-file ロギングドライバーを使用します。
-
保存場所: コンテナのログはホストシステムの特定のパスに JSON 形式のファイルとして保存されます。一般的にパスは次の通りです。
/var/lib/docker/containers/[コンテナ_ID]/[コンテナ_ID]-json.log
-
docker logsコマンド: このコマンドは実際にはメモリにある内容を表示するのではなく、上記で言及された JSON ログファイルを読み取ってターミナルに表示するものです。
ログが蓄積されるとディスク容量が不足しませんか? 🤔
はい、その通りです。何の対策も講じなければ、ログファイルが大きくなりホストのディスク容量をすべて占有される可能性があります。これを防ぐために、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つ)までしかディスクスペースを使用しなくなります。
結論 📝
-
Dockerコンテナのコンソールログは、システムの メモリではなくホストのディスクにファイルとして保存されます。
-
docker logsコマンドはこの保存されたファイルを読み取って表示する役割を果たします。 -
ログファイルが無制限に大きくなるのを防ぐためには、 ログローテーションオプション(
max-size、max-file)を設定 することが非常に重要です。
Docker Composeでは、docker-compose.yml ファイル内で各サービスごとにロギングオプションを簡単に設定できます。
docker run コマンドの --log-opt フラグが YAML 形式で含まれると考えてください。
docker-compose.yml ファイルに設定する 📝
以下は 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つ)のディスクスペースしか使用しなくなります。
全てのコンテナにデフォルトで設定する 🌍
もしすべてのコンテナにわざわざオプションを与えるのが面倒で、システム全体に基本方針を適用したい場合は、 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ファイルを修正してください。
コメントはありません。