Dockerは、コンテナの作成、デプロイ、運用を効率的に行うためのツールとして広く利用されています。その中でもDocker Composeは、複数のコンテナを定義して一斉に立ち上げたり管理したりするために不可欠なツールです。この記事では、特にdocker compose exec bashコマンドに焦点を当て、コンテナへのアクセス方法から実践的なユースケースまでを体系的に解説します。
Docker Composeとは?
まず、Docker Composeの概要を簡単に押さえておきましょう。Docker Composeは、YAML形式の設定ファイルを使用して、アプリケーションサービスを定義します。この設定ファイルを元に、docker compose upコマンドによって、複数のコンテナを連携してスタートさせることができます。これにより、複数のサービスが相互に連携するかたちでアプリケーションを構築する際のセットアップが大幅に簡素化されます。
exec bashコマンドの基本
docker compose execコマンドは、実行中のコンテナ内でコマンドを実行するために使用されます。特にbashを使うことで、コンテナ内のシェルにアクセスし、直接コマンドを実行したり、ファイルを編集したり、サービスの状態を確認したりすることが可能です。
基本的な使い方は、以下の通りです。
# Docker Compose V2(現在の標準)
docker compose exec <service_name> bash
# Docker Compose V1(旧バージョン)
docker-compose exec <service_name> bash
<service_name>には、compose.yml(またはdocker-compose.yml)で定義されたサービス名を指定します。Docker Compose V2以降はハイフンなしのdocker composeが標準コマンドです。このコマンドを実行すると、そのサービスが動作しているコンテナ内のbashシェルが起動し、通常のLinuxシェルと同様に操作できます。
よく使うオプション
-it オプション(インタラクティブTTY)
ターミナルで対話的に操作する場合は -it オプションを付けるのが基本です。
docker compose exec -it <service_name> bash
-i(--interactive):標準入力を開いたままにする-t(--tty):疑似ターミナルを割り当てる
実際には docker compose exec はデフォルトでTTYを割り当てるため、多くの場合 -it なしでも同じ動作をします。ただし、シェルスクリプトから呼び出す場合やパイプを使う場合には -T(TTY無効)オプションが役立ちます。
# スクリプトからコマンドを実行する場合(TTYなし)
docker compose exec -T web cat /etc/hosts
–user オプション(実行ユーザーを指定)
# rootユーザーで実行
docker compose exec --user root web bash
# 特定のユーザーIDで実行
docker compose exec --user 1000 web bash
–workdir オプション(作業ディレクトリを指定)
docker compose exec --workdir /var/www/html web bash
複数コマンドをまとめて実行する
シェルに入らず、複数のコマンドを一度に実行したい場合は bash -c を使います。
# セミコロンで複数コマンドを連結
docker compose exec web bash -c 'cd /app && npm install && npm run build'
# バックアップして圧縮まで一連で実行
docker compose exec db bash -c 'mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" mydb | gzip > /backup/mydb.sql.gz'
&&を使うと前のコマンドが成功した場合のみ次を実行します。エラーが起きた場合に途中で止めたいときに便利です。
exec bashを使うメリット
exec bashコマンドを活用することで、以下のようなメリットがあります。
-
トラブルシューティングが容易になる
コンテナ内のシステムリソースやログファイルに直接アクセスして問題を診断できます。これにより問題の発見と修正を迅速に行えます。 -
リアルタイムなシステム監視
動作中のコンテナでリアルタイムにソフトウェアの動作を確認できるため、パフォーマンスのボトルネックや障害のトラブルシューティングが可能です。 -
すぐにコマンドやスクリプトを実行できる
環境のセットアップやテストをすぐに行え、環境が正しく動作しているかどうかの確認が簡単です。
実践的なユースケース
ログファイルの確認・監視
アプリケーションのログをリアルタイムで確認したいときに役立ちます。
# アプリケーションログをリアルタイム表示
docker compose exec web bash -c 'tail -f /var/log/nginx/access.log'
# エラーログだけを抽出
docker compose exec web bash -c 'grep ERROR /var/log/app/app.log | tail -50'
# ログファイルのサイズ確認
docker compose exec web bash -c 'du -sh /var/log/*'
なお、標準出力に流れているログは docker compose logs -f <service_name> でも確認できますが、ファイルに書き出されたログや特定のフィルタリングが必要な場合は exec bash が便利です。
DB操作(MySQL / PostgreSQL)
データベースコンテナに接続してクエリを実行する場合の典型的なパターンです。
# MySQLのCLIに接続
docker compose exec db bash -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD"'
# 特定のデータベースに直接接続
docker compose exec db bash -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" mydb'
# SQLクエリを直接実行(対話なし)
docker compose exec -T db bash -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" mydb -e "SELECT COUNT(*) FROM users;"'
# PostgreSQLの場合
docker compose exec db bash -c 'psql -U postgres -d mydb'
# PostgreSQLでSQLを実行
docker compose exec -T db bash -c 'psql -U postgres -d mydb -c "SELECT COUNT(*) FROM users;"'
データベースのバックアップ・リストア
# MySQLのバックアップ(コンテナ外に出力)
docker compose exec -T db bash -c 'mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" mydb' > backup.sql
# バックアップをコンテナ内に保存
docker compose exec db bash -c 'mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" mydb > /backup/mydb.sql'
# リストア
docker compose exec -T db bash -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD" mydb' < backup.sql
設定ファイルの確認・編集
コンテナ内の設定ファイルを直接確認したり、動作確認のために一時的に変更したりする場合です。
# Nginxの設定ファイルを確認
docker compose exec web bash -c 'cat /etc/nginx/nginx.conf'
# 設定ファイルを編集(viを使用)
docker compose exec web bash -c 'vi /etc/nginx/conf.d/default.conf'
# 設定の文法チェック
docker compose exec web bash -c 'nginx -t'
# PHPの設定確認
docker compose exec php bash -c 'php -i | grep memory_limit'
# 環境変数を一覧表示
docker compose exec web bash -c 'env | sort'
パッケージインストールや依存関係の確認
# Node.jsのパッケージインストール
docker compose exec node bash -c 'cd /app && npm install'
# Pythonの依存関係確認
docker compose exec app bash -c 'pip list'
# Rubyのgem一覧
docker compose exec app bash -c 'bundle list'
実践例:MySQLコンテナでの利用
具体的な利用例として、MySQLのコンテナを考えてみましょう。サービス名がdbのMySQLコンテナがあるとします。
MySQLのCLIにアクセス
docker compose exec db mysql -u root -p
このコマンドで、MySQLのコマンドラインインターフェースに直接アクセスでき、SQLクエリを実行したり、データベースの設定を変更したりすることができます。
データベースのバックアップ
bashシェルを利用して、データベースのバックアップを取得することも簡単です。
docker compose exec db bash -c 'mysqldump -u root -p database_name > /path/to/backup.sql'
このようにして、バックアッププロセスを自動化し、効率よく保守管理を行えます。
docker compose exec と docker compose run bash の違い
execとrunは似ているようで、使いどころが大きく異なります。
| コマンド | 対象コンテナ | 主な用途 |
|---|---|---|
docker compose exec bash |
既に起動中のコンテナ | デバッグ・監視・設定確認 |
docker compose run bash |
新しいコンテナを起動 | 一時的な処理・マイグレーション・テスト |
docker compose exec bash を使う場面
# 起動中のwebサービスにアクセスしてデバッグ
docker compose exec web bash
# 起動中のDBにアクセスしてデータ確認
docker compose exec db bash -c 'mysql -u root -p mydb -e "SHOW TABLES;"'
docker compose run bash を使う場面
# DBマイグレーションを一時コンテナで実行
docker compose run --rm app bash -c 'python manage.py migrate'
# 依存関係をインストールして終了(使い捨てコンテナ)
docker compose run --rm node bash -c 'npm install && npm run build'
# テストを実行
docker compose run --rm app bash -c 'pytest tests/'
runで使う--rmオプションを付けると、コンテナ終了後に自動で削除されます。マイグレーションやビルドなど「一度実行したら終わり」の処理に最適です。
一方、execは既に起動しているコンテナを操作するため、サービスが稼働中でないと使えません。長時間のデバッグや、動作中のサービスに対するリアルタイム操作にはexecが適しています。
留意点
exec bashを使う際には、以下の点に留意する必要があります。
-
適切な権限設定
管理者権限が必要な操作を行う際には、権限設定に注意を払いましょう。特にrootユーザーで操作する場合には細心の注意が必要です。 -
コンテナ内の変更は揮発的
exec bashでコンテナ内を変更しても、コンテナを再起動すると元に戻ります。恒久的な変更はDockerfileやcompose.ymlに反映させましょう。 -
資源の監視
リソースの既存の使用状況も常に把握して、余計な負荷をかけないようにしましょう。特に大規模なデータ操作やバックアップ中は全体のリソースに影響が及ぶ可能性があります。 -
スクリプトの実行チェック
外部のスクリプトを実行する際は事前に内容をしっかり確認し、意図しない動作を防ぎましょう。
まとめ
Docker Composeでのexec bashの使い方をまとめると、以下のポイントが重要です。
- 基本コマンド:
docker compose exec <service> bashで起動中コンテナのシェルに入れる - -itオプション:対話的な操作では
-it、スクリプトからは-Tを使い分ける - 複数コマンド:
bash -c 'cmd1 && cmd2'でまとめて実行できる - exec vs run:起動中コンテナへの操作は
exec、一時的な処理はdocker compose run --rmを使う
実行中のコンテナを直接操作できるこの機能を利用することで、デバッグ・ログ確認・DB操作・設定変更など、あらゆるコンテナ管理作業を効率化できます。
なお、Docker Composeを使わず単独コンテナに bash でアクセスする方法については docker run bash でコンテナ内に入る方法:-it オプション・exec との違い・よく使うフラグを完全解説も参考にしてください。


コメント