Docker

日常コマンド — logs・exec・prune

8

日常コマンド — logs・exec・prune — Docker Tips

調査系で日常的に使うのは logsexecinspect、容量まわりは system dfprune です。特に prune は対象を間違えるとボリュームごと消えるので、削除範囲の表を先に置きます。

参考(Docker 公式)


目次

  1. 動作確認用のコンテナを用意する
  2. logs — 標準出力を追いかける
  3. exec — コンテナの中に入る
  4. inspect — 設定と状態をまるごと見る
  5. system df — ディスク使用量を見る
  6. system prune — 不要なリソースを消す
  7. restart policy との関係
  8. 詰まりやすい点

動作確認用のコンテナを用意する

この記事のコマンドを試すため、ログを継続的に出す軽いコンテナを 1 つ立てておきます。

PowerShell では "..." 内の $ が先に展開されるため、コンテナ内シェルへ $HOME などを渡すときは 単引用符 を使います(例: sh -c 'echo $HOME')。次のループ例に $ はありませんが、同様に単引用符なら PowerShell 側の解釈を避けられます。

docker run -d --name log-demo --restart unless-stopped busybox sh -c 'while true; do date; sleep 2; done'

busybox が 2 秒おきに日時を標準出力へ書き続けます。終わったら記事末尾の片付けで止めます。


logs — 標準出力を追いかける

docker logs はコンテナの標準出力・標準エラー出力を確認するコマンドです。

docker logs log-demo
オプション 意味
-f, --follow 出力をリアルタイムで追いかける(tail -f に相当)
-n <数>, --tail <数> 末尾から指定件数だけ表示
--since <時刻> 指定時刻以降のログだけ表示(例: --since 5m
-t, --timestamps 各行にタイムスタンプを付与
docker logs -f --tail 20 log-demo

-f で表示中はターミナルが専有されます。抜けるには Ctrl + C を使いますが、これは コンテナを止めるわけではなく、ログの追跡だけをやめる 操作です。

Compose を使っている場合は対象サービス名を指定します。

docker compose logs -f web

exec — コンテナの中に入る

docker exec稼働中のコンテナの中で新しいプロセスを実行 するコマンドです。よく使うのは対話シェルを開くパターンです。

docker exec -it log-demo sh
オプション 意味
-i, --interactive 標準入力を開いたままにする
-t, --tty 疑似 TTY を割り当てる(プロンプト表示のため)
sh / bash 実行するコマンド(Alpine 系には bash が無いことが多く sh を使う)

exec既に起動しているコンテナ が対象です。停止中のコンテナには使えず、その場合は docker start で先に起動する必要があります。Ubuntu 系なら bash、Alpine / busybox 系なら sh を選びます。1 回だけコマンドを実行して終わらせたいときは対話フラグを外して直接指定できます。

docker exec log-demo sh -c "echo hello from inside"

inspect — 設定と状態をまるごと見る

docker inspect は、コンテナ(やイメージ、ネットワーク、ボリューム)の詳細情報を JSON で返します。

docker inspect log-demo

出力は長いため、--format(Go テンプレート)で必要な項目だけ絞り込むのが実用的です。

docker inspect --format "{{.State.Status}}" log-demodocker inspect --format "{{.State.Health.Status}}" log-demodocker inspect --format "{{json .NetworkSettings.Networks}}" log-demodocker inspect --format "{{.HostConfig.RestartPolicy.Name}}" log-demo
確認したい項目 フォーマット例
実行状態 {{.State.Status}}
ヘルスチェック結果 {{.State.Health.Status}}(healthcheck 未設定なら空)
IP アドレス・接続ネットワーク {{json .NetworkSettings.Networks}}
再起動ポリシー {{.HostConfig.RestartPolicy.Name}}
マウント一覧 {{json .Mounts}}

「このコンテナ、今どういう設定で動いているんだっけ」を確認する場面のほとんどは inspect で解決します。


system df — ディスク使用量を見る

Docker が使っているディスク容量(イメージ・コンテナ・ボリューム・ビルドキャッシュ)をまとめて見るには docker system df を使います。

docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLEImages          12        3         4.2GB     3.1GB (73%)Containers      5         2         120MB     80MB (66%)Local Volumes   4         1         500MB     300MB (60%)Build Cache     40        0         1.8GB     1.8GB (100%)
意味
TOTAL 存在する数
ACTIVE 現在使用中(コンテナが参照中など)の数
SIZE 合計サイズ
RECLAIMABLE prune などで解放できる見込み容量

詳細な内訳を見たいときは -v を付けます。

docker system df -v

消す前の規模確認に使います。


system prune — 不要なリソースを消す

docker system prune は、使われていないリソース をまとめて削除します。「使われていない」の範囲を誤解すると事故になるため、対象を丁寧に区別します。

コマンド 削除される対象
docker container prune 停止中のコンテナ
docker image prune どのコンテナからも参照されていない タグなし イメージ(dangling image)
docker image prune -a どのコンテナからも使われていない全イメージ(タグ付きも含む)
docker volume prune 未使用の 匿名(無名)ボリューム のみ(Docker Engine 23.0 以降の既定)
docker volume prune -a 未使用の匿名ボリュームに加え、未使用の名前付きボリューム も削除
docker network prune 未使用のカスタムネットワーク
docker builder prune ビルドキャッシュ
docker system prune 停止コンテナ・dangling イメージ・未使用ネットワーク・ビルドキャッシュ(既定ではボリュームは対象外)
docker system prune -a 上記に加え、使われていない全イメージ も対象
docker system prune --volumes 上記に加え、未使用の 匿名ボリューム を削除(名前付きボリュームは対象外)

削除されない(生きている)もの

  • 起動中のコンテナ、および stop しただけで残っている 参照中 のイメージ
  • -a を付けない限り、タグが付いた「使われていないだけ」のイメージ
  • docker volume prune -a を明示しない限り、名前付きボリューム(DB データなど)は残る
  • docker system prune --volumes でも名前付きボリュームは消えない(system prune 側に名前付きまで消す -a 相当はない)
# 実行前に確認だけしたい場合、まず system df で規模を把握docker system df# 停止コンテナ・dangling イメージ・未使用ネットワーク・ビルドキャッシュを削除docker system prune# 未使用イメージと匿名ボリュームも削除(名前付きボリュームは残る)docker system prune -a --volumes# 名前付きボリュームまでまとめて消したいときだけ明示的に実行docker volume prune -a

運用のコツ: Docker Engine 23.0 以降、--volumes 付きの system prune や通常の volume prune は既定で 匿名ボリュームのみ が対象で、名前付きボリューム(DB のデータ用など)は保護されます。それでも未使用の名前付きボリュームまで削除したい場合は docker volume prune -a を別途実行します。compose down -v は Compose が宣言した名前付きボリュームを削除するので、prune とは別の危険があります。実行前に docker volume ls で何があるかを確認するのが安全です。


restart policy との関係

docker inspect --format "{{.HostConfig.RestartPolicy.Name}}" で見た再起動ポリシー(no / on-failure / always / unless-stopped)は、logsexec の対象になる「そもそもコンテナが起動しているか」に直結します。unless-stopped で立てたコンテナは Docker Desktop の再起動後も自動で復帰するため、docker ps -a想定より多くのコンテナが動いている と感じたら、まずどのポリシーで立てたか inspect で確認するとよいです。

docker inspect --format "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" log-demo

詰まりやすい点

症状 原因 対処
docker execOCI runtime exec failed: exec: "bash": executable file not found Alpine 系イメージに bash が無い sh を使う、または apk add bash(永続化しない一時的な対処)
docker logs に何も出ない アプリがファイルにログを書いていて標準出力に出していない アプリ側のログ出力先を標準出力/標準エラーに変更する(コンテナのログはこの前提で設計する)
docker system prune 後にビルドが毎回遅くなった ビルドキャッシュ(Build Cache)も削除された 通常挙動。頻繁に prune せず、容量が気になったときだけ実行する
prune で必要なデータ入りボリュームまで消えた docker volume prune -adocker compose down -v で名前付きボリュームまで消した 名前付きを消す操作は明示時だけにする。事前に docker volume ls で確認する
docker inspect の出力が長すぎて読めない 生の JSON をそのまま見ている --format で必要なフィールドだけ絞る
docker execError: No such container コンテナ名の誤り、または未起動 docker ps -a で名前と状態を確認

片付け

試用が終わったら log-demo を止め、削除します(--restart unless-stopped のため、止めずに放置すると Desktop 再起動後も戻ります)。

docker stop log-demodocker rm log-demo

シェア