日常コマンド — logs・exec・prune — Docker Tips
調査系で日常的に使うのは logs・exec・inspect、容量まわりは system df と prune です。特に prune は対象を間違えるとボリュームごと消えるので、削除範囲の表を先に置きます。
参考(Docker 公式)
- docker container logs
- docker container exec
- docker container inspect
- docker system df
- docker system prune
- Start containers automatically(restart policy)
目次
- 動作確認用のコンテナを用意する
- logs — 標準出力を追いかける
- exec — コンテナの中に入る
- inspect — 設定と状態をまるごと見る
- system df — ディスク使用量を見る
- system prune — 不要なリソースを消す
- restart policy との関係
- 詰まりやすい点
動作確認用のコンテナを用意する
この記事のコマンドを試すため、ログを継続的に出す軽いコンテナを 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 webexec — コンテナの中に入る
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 dfTYPE 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)は、logs や exec の対象になる「そもそもコンテナが起動しているか」に直結します。unless-stopped で立てたコンテナは Docker Desktop の再起動後も自動で復帰するため、docker ps -a で 想定より多くのコンテナが動いている と感じたら、まずどのポリシーで立てたか inspect で確認するとよいです。
docker inspect --format "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" log-demo詰まりやすい点
| 症状 | 原因 | 対処 |
|---|---|---|
docker exec で OCI 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 -a や docker compose down -v で名前付きボリュームまで消した |
名前付きを消す操作は明示時だけにする。事前に docker volume ls で確認する |
docker inspect の出力が長すぎて読めない |
生の JSON をそのまま見ている | --format で必要なフィールドだけ絞る |
docker exec が Error: No such container |
コンテナ名の誤り、または未起動 | docker ps -a で名前と状態を確認 |
片付け
試用が終わったら log-demo を止め、削除します(--restart unless-stopped のため、止めずに放置すると Desktop 再起動後も戻ります)。
docker stop log-demodocker rm log-demo