目次

docker exec コマンド入門:実行中のコンテナ内でコマンドを実行する

docker exec は実行中のコンテナ内でコマンドを実行します。コンテナに接続して問題を調べるときによく使います。デバッグの手順全体については、ログの確認とデバッグを参照してください。

構文

docker exec [オプション] コンテナ コマンド [引数...]
docker exec -it web sh        # コンテナのシェルに接続
docker exec web nginx -t      # コマンドを実行して結果を取得

オプション

docker exec のオプションは多くありません。以下は docker exec --help に表示されるすべてのオプションです。

オプション説明
-i, --interactive標準入力を開いたままにし、入力できるようにする
-t, --ttyTTY を割り当てる。対話操作では -i と組み合わせて -it を使う
-u, --user ユーザー[:グループ]指定したユーザー(名前または UID)で実行する
-w, --workdir パスコンテナ内の指定したディレクトリで実行する
-e, --env 名前=値今回の実行に環境変数を設定する
--env-file ファイルファイルから環境変数を読み込む
-d, --detachバックグラウンドで実行し、すぐに戻る
--privilegedこのコマンドに追加の権限を与える(デバッグ用。通常は使わないでください)
--detach-keys切り離しキーを変更する(既定値は Ctrl+P、Ctrl+Q)

以下の例では、起動時に環境変数 APP_MODE=demo を設定した web という名前の nginx コンテナを使います。

docker run -d --name web -e APP_MODE=demo nginx:1.30-alpine

コマンドを実行する

$ docker exec web nginx -v
nginx version: nginx/1.30.5

$ docker exec web sh -c "ls /etc/nginx/conf.d && echo \$APP_MODE"
default.conf
demo
  • 最初のコマンドはコンテナ内で nginx -v を実行し、結果をそのまま出力します。
  • &&、パイプ、変数を使うときは、sh -c "..." でコンテナ内のシェルに処理させます。\$APP_MODE の \ によってホストのシェルによる変数の置換を防ぎ、demo はコンテナ内の値を示します。

対話形式でコンテナに接続する

docker exec -it web sh

接続するとプロンプトが / # に変わります。通常の Linux と同じように操作できます。exit と入力して終了しても、コンテナは停止しません。イメージに bash があれば、bash も使えます。

-u、-w、-e

$ docker exec -u nginx web id
uid=101(nginx) gid=101(nginx) groups=101(nginx)

$ docker exec -w /usr/share/nginx/html web ls
50x.html
index.html

$ docker exec -e GREETING=hi web sh -c "echo \$GREETING"
hi
  • -u nginx:nginx ユーザーとして実行します(コンテナの既定ユーザーは root です)。ファイル権限の問題を調べるときに便利です。
  • -w /usr/share/nginx/html:指定したディレクトリで実行します。先に cd するのと同じです。
  • -e GREETING=hi:この実行にだけ環境変数を設定します。コンテナ自体の設定は変わりません。

-d:バックグラウンドで実行する

$ docker exec -d web sh -c "sleep 2; touch /tmp/done"

$ docker exec web ls /tmp
done

-d を指定するとコマンドをバックグラウンドで実行し、すぐに戻ります。2 秒後に確認すると、/tmp/done が作成されています。結果を待つ必要のない作業の開始に適しています。

コンテナが実行中ではない

$ docker stop web
web

$ docker exec web ls
Error response from daemon: container 1ec4fdc5c592b09b64e8f28869c37f89ab17163f88bfcb09e82815a44b0e1164 is not running

docker exec は実行中のコンテナでのみ使えます。停止中のコンテナは、先に docker start してください。コンテナが起動直後に終了する場合は exec で接続できません。docker logs でログを確認するか、docker run --rm -it --entrypoint sh イメージ で新しいコンテナを起動して調べてください。

関連する章

練習問題

練習:1 つのコマンドで、nginx ユーザーとして web コンテナの /etc/nginx ディレクトリ内のファイルを一覧表示してください。

解答
docker exec -u nginx -w /etc/nginx web ls

よくある質問

docker exec と docker run はどう違いますか?

docker run はイメージから**新しいコンテナを作成**します。docker exec は**すでに実行中のコンテナ**で追加のプロセスを実行します。exec が終了しても、コンテナ自体には影響しません。

docker exec -it コンテナ bash で executable file not found と表示されるのはなぜですか?

コンテナに bash がないためです。たとえば Alpine ベースのイメージには sh しかありません。docker exec -it コンテナ sh に変更してください。

コンテナ内で変更したファイルは、コンテナを再作成した後も残りますか?

残りません。exec での変更はコンテナの書き込み可能レイヤーに保存されるため、コンテナを削除すると消えます。残しておく変更は Dockerfile に記述するか、ボリュームに保存してください。

更新日 2026年10月14日