ひとことで言うと

# コンテナにbashで入る
docker exec -it コンテナ名 bash

# bashがない場合(Alpineイメージ)
docker exec -it コンテナ名 sh

# コンテナ内で1回だけコマンドを実行
docker exec コンテナ名 cat /etc/nginx/nginx.conf

コンテナ名は docker ps で確認できる。


docker exec の構文とオプション

docker exec [オプション] コンテナ名 コマンド [引数...]
オプション説明
-i標準入力を開いたまま(インタラクティブ)
-t疑似TTYを割り当て(ターミナル表示)
-u実行ユーザーを指定
-e環境変数を設定
-w作業ディレクトリを指定

シェルに入る時は -i-t を必ず両方付ける(-it)。-t がないとプロンプトが出ない。-i がないと入力が即座に閉じられる。


コンテナのシェルに入る

bash(ほとんどのイメージ)

docker exec -it my-nginx bash

sh(Alpineベースのイメージはbashがないのでshを使う)

docker exec -it my-alpine sh

rootで入る(パーミッション調査に便利)

docker exec -it -u root コンテナ名 bash

特定ユーザーで入る

docker exec -it -u www-data コンテナ名 bash

コンテナ内に入らずに1回だけコマンドを実行

# 設定ファイルを確認
docker exec my-nginx cat /etc/nginx/nginx.conf

# ファイル一覧
docker exec my-app ls -la /var/log/

# 環境変数を確認
docker exec my-app env

# プロセスを確認
docker exec my-app ps aux

環境変数を渡す

# 1つ渡す
docker exec -e DEBUG=true my-app node debug.js

# 複数渡す
docker exec -e NODE_ENV=production -e PORT=8080 my-app node app.js

作業ディレクトリを指定して実行

docker exec -w /app コンテナ名 ls

docker-compose 環境での使い方

docker-compose ではコンテナ名ではなく サービス名docker-compose.ymlservices キー)を使う。

docker-compose exec web bash
docker-compose exec db psql -U postgres
docker-compose exec web rails db:migrate

サービス名は docker-compose ps で確認できる。


よく使うデバッグパターン

ログをリアルタイムで確認

docker exec コンテナ名 tail -f /var/log/nginx/error.log

コンテナ間のネットワーク疎通を確認

docker exec my-app curl -v http://db:5432
docker exec my-app ping redis

コンテナ内の開放ポートを確認

docker exec コンテナ名 ss -tlnp

よくあるエラーと対処

bash: not found

Alpine系イメージには bash が入っていない。sh を使う:

docker exec -it コンテナ名 sh

the input device is not a TTY

-t が抜けている。シェルに入る時は必ず -it を付ける。

cannot exec in a stopped container

コンテナが停止中。先に起動する:

docker start コンテナ名
docker exec -it コンテナ名 bash

docker exec vs docker run

docker execdocker run
対象起動中のコンテナ新しいコンテナを作成して起動
用途起動中コンテナのデバッグフレッシュな環境で実行
状態既存のコンテナ状態を使うクリーンな状態から始まる

よくある質問

Q: docker exec -it の意味は? -i が標準入力を開いたまま、-t が疑似ターミナルを割り当てる。組み合わせることでインタラクティブなシェル操作が可能になる。

Q: コンテナ内でコマンドを実行するには? docker exec コンテナ名 コマンド。例: docker exec my-app ls /var/log

Q: 起動中のコンテナに入るには? docker exec -it コンテナ名 bash(Alpineは sh)。

Q: なぜ bash: not found になるのか? Alpine Linuxベースのイメージはbashを含まない。sh を使うと入れる。

Q: 停止中のコンテナに docker exec できる? できない。docker start コンテナ名 で起動してから実行する。

Q: docker exec と docker attach の違いは? docker exec はコンテナ内に新しいプロセスを起動する。docker attach はメインプロセス(PID 1)に接続する。デバッグには exec を使う。


関連記事

おすすめのVPS/ドメイン/スクール

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。