docker exec は、起動中のコンテナ内でコマンドを実行するための必須コマンドです。シェルに入ってデバッグする・ファイルを確認する・環境変数を調べる、といった日常的な操作はほぼすべてこのコマンドで完結します。
この記事では基本構文から主要オプション、実践的なユースケース、よくあるエラーの対処まで体系的に解説します。
docker exec の基本構文
基本構文は次のとおりです。
docker exec [オプション] コンテナ名(またはID) コマンド [引数...]
最もよく使う形は、インタラクティブなシェルセッションを開く以下のパターンです。
# bash が使えるコンテナ(Ubuntu、Debian 系など)
docker exec -it mycontainer bash
# bash がない軽量コンテナ(Alpine Linux など)
docker exec -it mycontainer sh
対象は「起動中のコンテナ」のみです。停止中のコンテナに対しては実行できません。
実行中のコンテナ名・ID を確認する
docker exec を使う前に、コンテナ名または ID を確認します。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx ... 10 minutes ago Up 10 minutes 80/tcp webserver
NAMES 列の値(例: webserver)か CONTAINER ID の先頭数文字が使えます。
よく使うオプション一覧
| オプション | 説明 | 用途 |
|---|---|---|
-i |
標準入力を開いたままにする(interactive) | コマンドへの入力が必要なとき |
-t |
疑似 TTY(端末)を割り当てる | シェル操作・プロンプト表示 |
-it |
-i と -t の組み合わせ(最頻出) |
インタラクティブなシェルセッション |
-d |
バックグラウンドで実行(detached) | デーモン的なコマンドを非同期実行 |
-e KEY=VALUE |
環境変数を指定して実行 | 一時的な設定変更 |
--user USER |
実行ユーザーを指定 | root 以外で操作したいとき |
--workdir DIR |
作業ディレクトリを指定 | 特定パスでコマンドを実行 |
--env-file FILE |
ファイルから環境変数を読み込む | 複数の環境変数を一括指定 |
--privileged |
拡張権限で実行 | カーネルレベルの操作(注意して使用) |
オプション別の使い方
-it:インタラクティブなシェルセッション
最も頻繁に使うパターンです。コンテナ内に「入る」感覚で操作できます。
docker exec -it mycontainer bash
シェルを抜けるには exit または Ctrl+D を使います。コンテナは終了せず、起動したままです。
-d:バックグラウンド実行
シェルに入らず、コマンドをバックグラウンドで実行します。
# nginx の設定を再読み込みする(非対話的)
docker exec -d webserver nginx -s reload
# ログファイルをローテーションするスクリプトを実行
docker exec -d myapp /opt/scripts/rotate-logs.sh
–user:実行ユーザーの指定
デフォルトでは root として実行されます。特定ユーザーに切り替えるには --user を使います。
# ユーザー名で指定
docker exec --user www-data -it mycontainer bash
# UID/GID で指定
docker exec --user 1000:1000 -it mycontainer bash
-e:環境変数を一時指定
コンテナを再起動せずに、特定の環境変数を渡してコマンドを実行できます。
docker exec -e DEBUG=true -e LOG_LEVEL=verbose myapp node server.js
–workdir:作業ディレクトリを指定
docker exec --workdir /var/log/nginx -it mycontainer bash
実践的なユースケース
1. コンテナ内でのデバッグ
アプリケーションのログを確認したり、プロセスの状態を調べるのに使います。
# ログファイルをリアルタイムで追う
docker exec -it mycontainer tail -f /var/log/app.log
# プロセス一覧を確認
docker exec mycontainer ps aux
# ネットワーク接続状況を確認
docker exec mycontainer ss -tuln
# 環境変数をすべて表示
docker exec mycontainer env
2. ファイルの確認・操作
# 設定ファイルの内容を表示
docker exec mycontainer cat /etc/nginx/nginx.conf
# ファイルが存在するか確認
docker exec mycontainer ls -la /var/www/html/
# 設定ファイルを一時的に編集(vi が入っている場合)
docker exec -it mycontainer vi /etc/myapp/config.yaml
3. データベースコンテナの操作
# MySQL に接続
docker exec -it mysql-container mysql -u root -p
# PostgreSQL に接続
docker exec -it postgres-container psql -U postgres
# Redis CLI を起動
docker exec -it redis-container redis-cli
4. 複数コマンドをまとめて実行
bash -c を使うと、複数のコマンドを一度に渡せます。
docker exec mycontainer bash -c "cd /app && npm run build && echo '完了'"
5. ファイルをコンテナ内に流し込む
# ホストのSQLファイルをMySQLに流し込む
docker exec -i mysql-container mysql -u root -psecret mydb < dump.sql
(注: -t を付けると標準入力のリダイレクトができなくなるため、この場合は -i のみ使います)
6. パッケージのインストール(デバッグ用)
# Ubuntu/Debian 系
docker exec -it mycontainer bash -c "apt-get update && apt-get install -y curl"
# Alpine 系
docker exec -it mycontainer sh -c "apk add --no-cache curl"
ただし、コンテナを再作成すると変更は失われます。恒久的に必要な場合は Dockerfile に追記してください。
bash がない場合(Alpine Linux など)
Alpine Linux ベースのイメージには bash がデフォルトで含まれていません。sh を使うか、bash をインストールします。
# sh を使う
docker exec -it mycontainer sh
# bash をインストールしてから使う
docker exec -it mycontainer sh -c "apk add --no-cache bash && bash"
docker exec と docker attach の違い
| コマンド | 用途 | 特徴 |
|---|---|---|
docker exec |
コンテナ内で新しいプロセスを起動 | 終了してもコンテナは動き続ける |
docker attach |
コンテナのメインプロセスに接続 | Ctrl+C でコンテナが停止することがある |
通常のデバッグや操作には docker exec -it ... bash が安全です。
よくあるエラーと対処法
Error: No such container
Error response from daemon: No such container: mycontainer
コンテナ名か ID が間違っています。docker ps で正確な名前を確認してください。
Error: Container is not running
Error response from daemon: Container mycontainer is not running
対象コンテナが停止しています。docker start mycontainer で起動してから再実行してください。
OCI runtime exec failed: exec: "bash": executable file not found
OCI runtime exec failed: exec: "bash": executable file not found in $PATH: unknown
bash が入っていない軽量イメージです。bash の代わりに sh を使ってください。
the input device is not a TTY
the input device is not a TTY
CI/CD 環境などでは -t オプションが使えません。-t を外して -i のみ指定してください。
よく使うコマンドのチートシート
# シェルに入る
docker exec -it <コンテナ名> bash
docker exec -it <コンテナ名> sh # bash がない場合
# 1回限りのコマンド実行
docker exec <コンテナ名> <コマンド>
# バックグラウンド実行
docker exec -d <コンテナ名> <コマンド>
# 別ユーザーで実行
docker exec --user <ユーザー名> -it <コンテナ名> bash
# 環境変数を渡す
docker exec -e KEY=VALUE <コンテナ名> <コマンド>
# 複数コマンドを一度に実行
docker exec <コンテナ名> bash -c "cmd1 && cmd2"
# ファイルを標準入力から渡す
docker exec -i <コンテナ名> <コマンド> < input.txt
まとめ
docker exec は Dockerを使う上で最も頻繁に使うコマンドの一つです。
-itでインタラクティブなシェルセッション-dでバックグラウンド実行--userで実行ユーザーを変更-eで環境変数を一時指定
これらのオプションを組み合わせることで、コンテナのデバッグ・操作・管理のほとんどの作業をカバーできます。停止中のコンテナには使えない点だけ覚えておけば、日常的なコンテナ操作で迷うことはほぼなくなるでしょう。

コメント