初心者必見!Docker Execコマンドでコンテナ内のBashを利用する方法と注意点

環境&ワークフロー

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 で環境変数を一時指定

これらのオプションを組み合わせることで、コンテナのデバッグ・操作・管理のほとんどの作業をカバーできます。停止中のコンテナには使えない点だけ覚えておけば、日常的なコンテナ操作で迷うことはほぼなくなるでしょう。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント