ひとことで言うと
# コンテナに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.yml の services キー)を使う。
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 exec | docker 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 を使う。
関連記事
- Dockerの基本コマンドまとめ(run/stop/rm/ps)
- docker-composeの基本的な使い方
- Dockerfileの基本的な書き方
- Dockerのネットワーク設定の基本(bridge/host/none)
- Dockerのボリュームでデータを永続化する方法
おすすめのVPS/ドメイン/スクール
VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。