サイトアイコン ITC Media

docker compose exec|コンテナ内でコマンドを実行

(最終更新月:2023年9月)

✔当記事は以下のような方に向けて書かれています

「docker compose execコマンドの具体的な活用方法が知りたい」

「docker compose execコマンドの文法を理解し、自在に使いこなしたい」

「docker compose execコマンドの実際の使用例が見たい」

✔当記事でお伝えする内容

当記事では、docker-compose execコマンドの基本理解から、その各種オプションを駆使した高度な利用法までを詳細に解説し、それぞれについて具体的な例を挙げています。

是非、最後までお読みください。

運営者プロフィール

現在はIT企業のプロダクトマネージャーとして、個人向け/社内向けシステムなど、複数のシステム開発・運営に携わっています。

Webサイト構築やECサイトの開発経験に加えて、PythonなどのプログラミングやSalesforceなどのクラウドアプリケーションに関する幅広い知識・経験を活かして「プログラミング初心者がスムーズに学べるサイト」を目指しています。

Githubでは、趣味で作成したアプリなどを公開しています。

https://github.com/Yulikepython/

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

docker compose execの基本概念

こちらでは、「docker-compose execの基本概念」についてお伝えしていきます。

docker compose execとは何か?

docker compose execは、実行中のコンテナでコマンドを実行するためのコマンドです。

コンテナ内でデータベースのマイグレーションを実行するなどに使えます。

このコマンドを使用すると、特定のコンテナで操作を行う際に便利です。

なぜdocker compose execを使うのか?

docker compose execを使用するメリットは、実行中のコンテナで簡単にコマンドを実行できることです。

デバッグや特定のタスクを実行する際に時間を節約できます。

例として、アプリケーションのデバッグセッションを開始するときなどに使用されます。

docker compose execの使用方法

こちらでは、「docker compose execの使用方法」について詳しく説明します。

docker-compose execの基本的な実行方法

docker-compose execの基本的な実行方法はシンプルです。

コマンドラインから以下を入力します。

docker-compose exec サービス名 コマンド

指定したコンテナ内でコマンドが実行されます。

docker-compose execの具体的な使用例

具体的な使用例を見てみましょう。

まずは以下のようなdocker-compose.ymlでコンテナを起動してください。

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "3030:80"

起動できたら、以下のコマンドを実行してみましょう。

docker compose exec web bin/bash

このコマンドは、”web”と名付けられたサービスのコンテナ内でbashシェルを起動するもの。

これにより、コンテナ内で直接操作できるようになります。

$ docker compose exec web bin/bash
root@c3fada7ce056:/# 

docker-compose execのコマンド解説

この部分では、docker compose execのコマンドについて深く掘り下げます。

詳細解説:docker compose execの各部分

docker-compose execコマンドは主に3つの部分から構成されます。

サービス名はdocker-compose.ymlファイルで定義され、実行するコマンドはコンテナ内で実行されるものです。

よく使われるものとしては、「web」「db」などがあります。

コマンド/bin/bashのまとめ

/bin/bashはUnixシステムでよく使用されるシェルの一種。

docker compose execと一緒に使用されることが多いです。

docker compose exec web /bin/bash

webサービスのコンテナ内でbashシェルを開始します。

このシェルは強力で多機能なため、多くの開発者によって愛用されています。

docker compose execのオプションと拡張

こちらでは、docker compose execのオプションと拡張に焦点を当てます。

docker compose execの主要なオプション

以下は、docker compose execの主要なオプションを一覧表にまとめたものです。

オプションを理解すれば、さまざまな操作を制御できるようになります。

オプション名説明コマンド例
-d, --detach実行をバックグラウンドで行います。docker compose exec -d web nginx -s reload
--privileged特権を持つプロセスとしてコマンドを実行します。docker compose exec --privileged web some-command
--user <user>指定したユーザーとしてコマンドを実行します。docker compose exec --user www-data web ls /var/www
--index=<index>複数のコンテナがある場合、指定したインデックスのコンテナでコマンドを実行します。docker compose exec --index=2 web cat /etc/hosts
-TTTYを割り当てません(例: バックグラウンドでの実行時など)。docker compose exec -T web php artisan migrate
--env <key=value>環境変数を設定してコマンドを実行します。docker compose exec --env DEBUG=true web some-command
--workdir, -wコマンドを実行する作業ディレクトリを指定します。docker compose exec -w /app web ls

docker compose execの追加機能

docker compose execには、より高度な使用ケースをカバーする追加機能もあります。

特定の環境変数をコマンドラインから渡すなどが可能です。

以下のようなケースを考えてみましょう。

あなたは、webという名前のサービスで動作しているアプリケーションに対して、データベースのマイグレーションを実行したいと考えています。このマイグレーションツールは、DB_HOSTという環境変数を使用してデータベースのホスト名を取得します。しかし、この一回だけ、異なるデータベースホストを使用してマイグレーションを実行したいと考えています。

実行できるコマンドは以下のとおりです。

docker compose exec --env DB_HOST=alternate-db-host web python manage.py migrate

この機能を使用することで、開発やデプロイのプロセスをさらに効率的におこなえます。

docker-composeの概念と親コマンド

次の部分では、「docker-composeの概念と親コマンド」について詳しく見ていきます。

docker-composeとは

docker-composeは、複数のコンテナを一緒に定義し、実行するためのツールです。

YAMLファイルを使用してサービス、ネットワーク、ボリュームなどを定義します。

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "3030:80"

これにより、一連のコンテナの管理が容易になります。

YAMLファイルについて詳しく知りたい方はこちらをご覧ください。

docker-composeコマンドとdocker composeコマンド

docker-composeとdocker composeについてお伝えします。

多くの記事では「docker-compose」が紹介され、当記事では主に「docker compose」で解説を進めているからです。

Docker CLI の compose コマンドは、 docker-compose コマンドとフラグの大部分をサポートします。このコマンドは、いずれ docker-comopse を置き換えるものとして期待されいます。

https://docs.docker.jp/compose/cli-command-compatibility.html

公式ページにあるとおり、docker composeのほうが新しく、ゆくゆくはdocker-composeを置き換えて行く予定とのこと。

今から始めるのであれば、docker composeがおすすめです。

docker compose execの親コマンドについて

docker compose execは、docker composeコマンドのサブコマンドのひとつ。

親コマンドとしてdocker composeが存在します。

ほかの子コマンドの例は以下のとおりです。

これらは、docker-compose execと同じファミリーに属しているといえるでしょう。

docker-compose execと関連コマンド

こちらでは、「docker-compose execと関連コマンド」について探求します。

docker-compose execとほかのコマンドの比較

docker compose execと似たコマンドにdocker compose runがあります。

しかし、execは実行中のコンテナでコマンドを実行するのに対して、runは新しいコンテナを作成して実行するもの。

docker compose run web bash

新しいwebコンテナでbashを開始します。

関連コマンドの使用例

関連コマンドの使用例として、docker compose logsを挙げます。

このコマンドは、サービスのログを表示するものです。

docker compose logs web

webサービスのログが表示されます。

これは、デバッグ時にdocker compose execと共に非常に役立つコマンドです。

よくある質問と回答

よくある質問についてまとめました。

これから学ぶ予定の方は目を通しておきましょう。

docker-compose execとdocker execの違いは何ですか?

違いは以下のとおりです。

以下はwebサービスのコンテナでbashを開始するコマンド。

docker compose exec web bash

以下は指定されたコンテナIDでbashを開始します。

docker exec container_id bash

docker-composeとdocker composeコマンドの違いってなんなの?

前述のとおり、docker composeの方が新しいコマンドです。

これから学ぶ方には、docker composeが良いでしょう。

Dockerの公式サイトでも、いずれはdocker composeがdocker-composeを置き換えていくことが言及されています。

compose コマンドと docker-compose の互換性 — Docker-docs-ja 24.0 ドキュメント

現状(2023年9月)時点では、どちらでも問題なく使えます。

まとめ

当記事では、docker-compose execコマンドについてお伝えしてきました。

docker compose execは、コンテナ化された環境での開発を迅速かつ効率的におこなうための強力なコマンドです。

docker compose exec db mysql -u root -p

dbサービスのコンテナでMySQLのルートユーザーとしてログインできます。

このような操作を容易にするため、開発者の間で広く使用されているのです。

モバイルバージョンを終了