docker execコマンドでコンテナ内を調査・デバッグする方法|docker logs・docker inspectの実践例も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Docker > docker execコマンドでコンテナ内を調査・デバッグする方法|docker logs・docker inspectの実践例も
「docker runしたコンテナが起動しているはずなのに、アプリが動かない」
そんな場面で真っ先に使うべきツールが docker exec・docker logs・docker inspect の3つです。

この記事では、Rocky Linux 9 / Ubuntu 24.04 LTS の実機で確認した手順をもとに、Dockerコンテナのデバッグに欠かせない3コマンドの実践的な使い方を解説します。
コンテナ内部への入り方から、ログの絞り込み、設定値の取り出しまで、障害切り分けの現場でそのまま使える内容を網羅しています。

この記事のポイント

・docker exec -it でコンテナ内のシェルにインタラクティブに接続できる
・docker logs -f でリアルタイムのコンテナログをtail感覚で追える
・docker inspect --format でIPアドレスや設定値を1行で取り出せる
・起動に失敗したコンテナはdocker startしてからexecでデバッグする


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜdocker execが必要なのか(コンテナデバッグの現場)

コンテナはその性質上、「動いているように見えるが中身が分からない」状態になりやすい環境です。
仮想マシンであればSSHでログインして確認できますが、Dockerコンテナは標準でSSHデーモンを持ちません。

そこで使うのが docker exec コマンドです。
docker exec は「実行中のコンテナ内部で任意のコマンドを実行する」ためのコマンドで、コンテナにシェルを起動させて中を直接確認できます。

ただし docker exec 一本でできることには限界があります。コンテナが起動すらしていない場合のログ確認は docker logs に頼ることになりますし、コンテナのネットワーク設定やマウント状態を調べるには docker inspect が必要になります。
この3コマンドをセットで覚えることで、コンテナ障害の大半に対応できます。

動作確認環境:Rocky Linux 9.4 / Ubuntu 24.04 LTS、Docker Engine 26.x

docker execの基本的な使い方

1. コンテナにbashシェルで入る(-itオプション)

最もよく使うパターンが、実行中のコンテナに bash シェルでインタラクティブに入る方法です。

# 実行中のコンテナ一覧を確認する $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx "/docker-entrypoint." 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp web-nginx # コンテナにbashで入る(CONTAINER IDまたはNAMEを指定) $ docker exec -it web-nginx bash # コンテナ内のプロンプトに変わる root@a1b2c3d4e5f6:/#

-i(--interactive):標準入力をコンテナに接続する
-t(--tty):擬似ターミナルを割り当てる
この2つをセットで使うことで、コンテナ内でキーボード入力を受け付けるインタラクティブなシェルが起動します。

コンテナから抜けるときは exit コマンドを入力します。
exit してもコンテナは停止しません(docker exec で起動したシェルだけが終了します)。

一点注意が必要なのは、イメージによっては bash が入っていない場合があることです。Alpine Linuxベースのイメージでよくあるケースで、その場合は sh を使います。

# bashがない場合はshを使う(Alpine系イメージで頻出) $ docker exec -it alpine-container sh / # # bashが入っているか事前に確認したい場合 $ docker exec alpine-container which bash

2. コンテナ内で特定のコマンドだけ実行する

シェルに入らず、特定のコマンドだけを実行してその結果を受け取ることもできます。
スクリプトからの呼び出しや、確認作業を素早く済ませたい場合に便利です。

# コンテナ内のNginxバージョンを確認する $ docker exec web-nginx nginx -v nginx version: nginx/1.25.3 # コンテナ内の環境変数を確認する $ docker exec web-nginx env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.25.3 # コンテナ内の設定ファイルを確認する $ docker exec web-nginx ls /etc/nginx/conf.d/ default.conf # コンテナ内のプロセス一覧を確認する $ docker exec web-nginx ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 8972 3512 ? Ss 10:05 0:00 nginx: master process nginx -g daemon off; nginx 31 0.0 0.0 9424 2208 ? S 10:05 0:00 nginx: worker process

3. 停止中のコンテナには入れない(docker startが先)

docker exec は「実行中(Up状態)」のコンテナにしか使えません。
Exited(停止)状態のコンテナに exec しようとすると以下のエラーになります。

$ docker exec -it stopped-container bash Error response from daemon: Container stopped-container is not running

この場合は docker start でコンテナを起動してから exec します。

# 停止中も含めてコンテナを確認する(-aで停止中も表示) $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES b2c3d4e5f6a7 myapp "..." 1 hour ago Exited (1) 1 hour ago myapp-debug # コンテナを起動する $ docker start myapp-debug # 起動を確認してからexecでデバッグ $ docker exec -it myapp-debug bash

起動直後にすぐ落ちてしまうコンテナ(クラッシュループ)の場合は、後述の docker logs でエラーを確認してから原因を特定するアプローチが有効です。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Dockerコンテナのデバッグ手順を含む実践的なDocker講座を用意しています。
Dockerマスター講座の詳細はこちら >>

docker logsでコンテナのログを確認する

1. 基本の使い方と主要オプション(-f・--tail・--since)

docker logs はコンテナの標準出力(stdout)と標準エラー出力(stderr)に出力されたログを確認するコマンドです。

# コンテナのログを全件表示する $ docker logs web-nginx 10.0.0.1 - - [04/Jul/2026:10:05:23 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.4.0" "-" 10.0.0.1 - - [04/Jul/2026:10:05:30 +0000] "GET /api/health HTTP/1.1" 404 153 "-" "Go-http-client/1.1" "-" # リアルタイムでログを追いかける(-fオプション) $ docker logs -f web-nginx # 最後の20行だけ表示する(--tail) $ docker logs --tail 20 web-nginx # 特定の時刻以降のログだけ表示する(--since) $ docker logs --since 2026-07-04T10:00:00 web-nginx # タイムスタンプ付きで表示する(-t) $ docker logs -t --tail 10 web-nginx 2026-07-04T10:05:23.341234567Z 10.0.0.1 - - [04/Jul/2026:10:05:23 +0000] "GET / HTTP/1.1" 200 615

-f(--follow):tail -f 感覚でリアルタイム追跡。Ctrl+Cで停止
--tail N:最後のN行だけ表示。全件出力が長い時に使う
--since:指定時刻以降のログに絞り込む(ISO 8601形式または「10m」「2h」等の相対指定も可)
-t(--timestamps):各行にUTCのタイムスタンプを付加する

2. ログが出ない・少ない時の確認ポイント

docker logs を実行してもログが出ない、あるいは少ない場合は、アプリ側のログ出力設定に原因があることが多いです。

Dockerがログを取得できるのは、コンテナ内のプロセスが stdout または stderr に出力した内容だけです。
アプリがログをファイルに書いている場合(例:/var/log/nginx/access.log)は docker logs には何も出ません。

# ログファイルに直接書いている場合はexecで確認する $ docker exec web-nginx cat /var/log/nginx/access.log # または exec でリアルタイム追跡する $ docker exec -it web-nginx tail -f /var/log/nginx/access.log

Nginxの公式イメージはこの問題を回避するため、ログファイルをstdout/stderrへのシンボリックリンクにしています。
独自アプリをDockerに載せる際は、ログを stdout に出力するよう設計することが重要です。

docker inspectでコンテナ・イメージの設定を詳細に調べる

1. コンテナの全情報をJSON形式で取得する

docker inspect は、コンテナやイメージの詳細設定をJSON形式で出力するコマンドです。
ネットワーク設定、マウントポイント、環境変数、IPアドレスなど、コンテナのあらゆる設定を確認できます。

# コンテナの詳細情報をJSON形式で表示する $ docker inspect web-nginx [ { "Id": "a1b2c3d4e5f6...", "Created": "2026-07-04T10:00:00.000000000Z", "State": { "Status": "running", "Running": true, "Pid": 12345 }, "NetworkSettings": { "IPAddress": "172.17.0.2", "Ports": { "80/tcp": [{"HostIp": "0.0.0.0", "HostPort": "8080"}] } } } ]

出力が長いため、実務では後述の --format オプションで必要な値だけを取り出す使い方がほとんどです。

2. --formatオプションで必要な値だけ抽出する

--format(または -f)オプションを使うと、Goテンプレート形式で必要な項目だけを取り出せます。

# コンテナのIPアドレスだけ取得する $ docker inspect --format '{{.NetworkSettings.IPAddress}}' web-nginx 172.17.0.2 # コンテナのステータスだけ確認する $ docker inspect --format '{{.State.Status}}' web-nginx running # 環境変数の一覧を確認する $ docker inspect --format '{{range .Config.Env}}{{.}}{{" "}}{{end}}' web-nginx PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.25.3 # マウントポイントを確認する $ docker inspect --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{" "}}{{end}}' web-nginx /home/user/html -> /usr/share/nginx/html # 公開ポートの確認 $ docker inspect --format '{{.NetworkSettings.Ports}}' web-nginx map[80/tcp:[{0.0.0.0 8080}]]

ポートの設定が正しいかホスト側でも確認したい場合は、Linux ポート確認の全コマンドで紹介しているss・lsofコマンドを合わせて使うと確実です。

docker statsでリソース使用状況をリアルタイム監視する

docker stats はコンテナのCPU・メモリ・ネットワーク・I/Oの使用状況をリアルタイムで監視するコマンドです。
「アプリが重い」「コンテナが暴走している」と感じた時の最初の確認に使います。

# 全コンテナのリソース使用状況をリアルタイム表示(Ctrl+Cで停止) $ docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O a1b2c3d4e5f6 web-nginx 0.01% 5.5MiB / 7.767GiB 0.07% 648B / 648B 0B / 0B b2c3d4e5f6a7 myapp 12.5% 256MiB / 512MiB 50.0% 1.2MB / 834KB 120MB / 0B # 特定のコンテナだけ確認する $ docker stats web-nginx # 一度だけ取得して終了する(スクリプトで使う場合) $ docker stats --no-stream web-nginx CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O a1b2c3d4e5f6 web-nginx 0.01% 5.5MiB / 7.767GiB 0.07% 648B / 648B 0B / 0B

CPU %:ホストCPUコア全体に対する使用率
MEM USAGE / LIMIT:使用中のメモリ / コンテナのメモリ上限(未設定の場合はホスト全体のメモリ量)
NET I/O:ネットワークの送受信量
BLOCK I/O:ディスクの読み書き量

MEM % が 80% を超えていたらコンテナのメモリ不足の可能性があります。
CPU % が常に高い場合は、コンテナ内のプロセスに異常がないか docker exec で確認しましょう。

トラブルシューティング|よくある失敗と対処法

1. bashが見つからない場合のエラー

docker exec -it コンテナ名 bash を実行した際に以下のエラーが出る場合、そのイメージに bash がインストールされていません。

OCI runtime exec failed: exec: "bash": executable file not found in PATH: unknown

対処法:bash の代わりに sh または /bin/sh を使います。

# bashがないAlpine系イメージではshを使う $ docker exec -it alpine-container sh / #

2. コンテナが起動直後にExitedになる(クラッシュループ)

docker ps で確認するとすぐに Exited になってしまうコンテナは、起動スクリプトやアプリのエラーで即座に終了していることが多いです。

# 停止中も含めてコンテナを確認する $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES c3d4e5f6a7b8 myapp "..." 10 secs ago Exited (127) 9 secs ago myapp # ログでエラーの原因を確認する $ docker logs myapp /bin/sh: /app/start.sh: not found # 終了コードも確認できる $ docker inspect --format '{{.State.ExitCode}}' myapp 127

ExitCode の一般的な意味:
0:正常終了(コンテナの意図した終了)
1:アプリのエラー(docker logs で詳細を確認)
127:コマンドが見つからない(スクリプトパスの誤りが多い)
137:OOMキル(メモリ不足でカーネルが強制終了)
143:SIGTERMを受けて正常終了

3. docker logsに何も出ない

コンテナが動いているのに docker logs が空の場合、アプリのログ出力先をファイルに向けている可能性があります。
docker exec でコンテナに入り、アプリのログファイルを直接確認してください。

# アプリのログファイルがある場所を探す $ docker exec web-nginx find /var/log -name "*.log" -type f /var/log/nginx/access.log /var/log/nginx/error.log # ログファイルの内容を確認する $ docker exec web-nginx tail -20 /var/log/nginx/error.log

本記事のまとめ

docker exec・docker logs・docker inspect の3コマンドをまとめます。
やりたいこと コマンド
コンテナにシェルで入る docker exec -it コンテナ名 bash
コンテナ内でコマンドを実行する docker exec コンテナ名 コマンド
コンテナのログを見る docker logs コンテナ名
リアルタイムでログを追う docker logs -f コンテナ名
最後のN行だけ表示する docker logs --tail N コンテナ名
コンテナの詳細設定を確認する docker inspect コンテナ名
IPアドレスだけ取り出す docker inspect --format コンテナ名
リソース使用状況をリアルタイム監視する docker stats コンテナ名
コンテナ障害の切り分けは、まず docker logs でエラーを確認し、次に docker exec でコンテナ内部に入って詳細を調査、必要に応じて docker inspect で設定を確認するという流れが基本です。
この3コマンドを使いこなせるようになると、コンテナの「中身が見えない」不安がなくなり、Dockerを使った開発・運用の自信が格段に上がります。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Dockerコンテナの本番運用まで含めた実践的なDocker講座を用意しています。
Dockerマスター講座の詳細はこちら >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。