Docker Compose で起動したコンテナのログ保存先を,docker compose ps と docker inspect で確認する.ログの閲覧方法と,保存方式に応じた確認方法もまとめる.
Compose のログはどこに保存されるのか
Compose 専用のログファイルが作られるわけではない.コンテナの標準出力・標準エラー出力を Docker Engine が受け取り,ログドライバーと呼ばれる仕組みで保存・転送する.そのため,保存先を知るには,対象のコンテナとログドライバーを確認する.
アプリケーションが独自にファイルへ書き込んでいるログは別だ.その場合は,アプリケーションの設定やボリュームのマウント先を調べる必要がある.
以下は Linux サーバー上の Docker Engine を想定し,サービス名を web とする.自分の環境のサービス名に読み替えてほしい.
まずはログを表示する
Compose ファイルのあるディレクトリで実行する.別のファイルやプロジェクト名を指定して起動した場合は,調査時も同じ -f や -p を指定する.
1docker compose logs --tail 100 -f web
--tail 100 はコンテナごとに末尾の100行を表示し,-f はその後に出力されるログを追い続ける.終了するときは Ctrl+C を押す.web を省略すると,プロジェクト内のサービスをまとめて確認できる.
調査用に保存したい場合は,期間を絞って書き出す.次の例は直近1時間のログを,コマンドを実行した側のファイルへ保存する.
1docker compose logs --since 1h --timestamps --no-color web > web-last-hour.log 2>&1
同名の出力ファイルがあれば上書きされる.標準エラーもまとめて保存するため,コマンド自体のエラーが含まれていないかも確認する.保存済みのログの範囲で取得するもので,削除済みの過去ログを復元するものではない.
対象のコンテナを選ぶ
停止中のものも含めて一覧を表示する.
1docker compose ps -a web
-a を付けることで,起動に失敗して終了したコンテナも確認できる.対象が1台なら,-q でその ID を取得して変数に入れる.
1container_id=$(docker compose ps -a -q web)
以降は同じシェルで操作する.対象が0台なら ID は取得できず,複数台なら複数行返るため,この方法は対象が1台の場合に使う.複数台ある場合は,一覧の NAME から一つ選び,代わりに次のように ID を取得する.
1container_id=$(docker inspect --type container -f '{{.Id}}' myproject-web-1)
myproject-web-1 は実際の NAME に置き換える.コンテナが削除済みの場合は一覧に出ないため,外部へ転送・保存したログなどを確認する.
ログドライバーと保存先を確認する
1docker inspect --type container -f '{{.HostConfig.LogConfig.Type}}' "$container_id" 2docker inspect --type container -f '{{.LogPath}}' "$container_id"
1行目はログドライバー,2行目は Docker が持つログパスの情報を表示する.json-file の場合,パスは例えば次の形式になる.
1/var/lib/docker/containers/<コンテナID>/<コンテナID>-json.log
これは出力形式の例で,固定のパスではない.データ保存先の設定や Rootless Docker などによって異なるため,inspect の結果を使う.
また,このパスは Docker デーモンが動く環境のパスだ.リモート接続なら接続先サーバー,Docker Desktop なら通常は内部の Linux VM 側のパスになる.手元の端末に同じパスがあるとは限らない.
Docker 全体の既定値は,次のコマンドで確認できる.
1docker info --format '{{.LoggingDriver}}'
既定値と個々のコンテナの設定は異なる場合があるので,対象の確認には inspect を使う.Docker のログ設定
対象コンテナのログを読む
Docker の公式資料では,json-file のログファイルは Docker デーモン専用であり,外部ツールから直接アクセスすることを避けるよう案内されている.JSON File logging driver
ログの内容は,保存先のファイルを直接操作せず,Docker のコマンドで確認する.先ほど ID を取得したコンテナのログを読むには,次を使う.
1docker logs --tail 100 -f "$container_id"
ログをファイルに残す場合も,先ほどの docker compose logs の出力を保存する方法を使える.
LogPathが空の場合
保存方式によっては,通常のログファイルのパスが得られない.空だからといって,すぐにログが失われたとは判断せず,ログドライバーを確認する.
| ドライバー | 確認方法 |
|---|---|
json-file | LogPath で保存先を確認し,内容は docker logs で読む |
local | Docker 独自の形式で保存するため,内容は docker logs で読む |
journald | docker logs またはホストの journalctl で確認する |
none | Docker はログを保存しない |
| 外部へ転送するドライバー | 転送先やローカルキャッシュの設定を確認する |
journaldの場合
Docker デーモンが動いている Linux ホストで,対象コンテナの完全な ID を使って検索できる.
1full_container_id=$(docker inspect --type container -f '{{.Id}}' "$container_id") 2sudo journalctl CONTAINER_ID_FULL="$full_container_id" -n 100 -f
コンテナ名は再作成時に再利用される場合があるため,特定のコンテナを調べる例では ID を指定している.journalctl に -b を付けると,ホストの現在の起動以降に絞れる.Journald logging driver
よく使う確認手順
ここまでの「対象の特定 → 保存先の確認 → ログの閲覧」をまとめると,次のようになる.Compose ファイルのあるディレクトリで,web を自分のサービス名に変更して実行する.対象サービスのコンテナが1台ある場合の手順だ.
1# 調べたいサービス名 2service='web' 3 4# 停止中も含めて対象コンテナのIDを取得する 5container_id=$(docker compose ps -a -q "$service") 6 7# ログドライバーを確認する 8docker inspect --type container -f '{{.HostConfig.LogConfig.Type}}' "$container_id" 9 10# ログの保存先を確認する 11docker inspect --type container -f '{{.LogPath}}' "$container_id" 12 13# 直近100行を表示し,その後のログを追う 14docker logs --tail 100 -f "$container_id"
対象が分からない場合や複数台ある場合は,「対象のコンテナを選ぶ」の手順で一つに絞る.LogPath が空の場合はログドライバーに応じて確認し,ログの追跡は Ctrl+C で終了する.
保存先の調査はここまでで完了する.ログの容量が気になって調べていた場合は,続けて保存量の設定も確認しておく.
ログの肥大化を防ぐ
json-file を使う場合は,ログローテーションの設定も確認しておきたい.次は,既存の Compose ファイルの web サービスに追加する設定例だ.既存の image や build などは残す.
1services: 2 web: 3 # 既存の image,build,ports などの設定 4 logging: 5 driver: json-file 6 options: 7 max-size: "10m" 8 max-file: "3"
設定内容を検査する.
1docker compose config -q
ログ設定はコンテナの作成時に適用される.既存コンテナへ反映するには再作成が必要で,単に restart するだけでは反映されない.停止の影響とデータの永続化を確認したうえで,対象サービスを再作成する.
1docker compose up -d --no-deps --force-recreate web
この操作は対象コンテナを置き換えるため,一時的な停止が発生する.コンテナの書き込み層に置いたデータや古いコンテナのログは残る前提にせず,必要なものは事前に保存する.--no-deps は依存サービスを起動対象に含めない指定で,依存サービスが必要なら先に稼働状態を確認する.
再作成後は docker compose ps -a web で対象を確認し,新しいコンテナの ID を container_id に取得し直して,適用されたログ設定を見る.
1docker inspect --type container -f '{{json .HostConfig.LogConfig}}' "$container_id"
Compose の基本操作は,Docker Compose よく使うコマンド にまとめている.

