このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Docker超入門:Docker Composeで新しいコンテナを作成してコマンドを実行する方法

Docker Composeで新しいコンテナを作成してコマンドを実行する方法

 これまで「docker compose exec」コマンドを使って、既存のコンテナの中でコマンドを実行する方法 を学びました。
でも、もしそのコンテナが停止中だったらどうなるでしょう?

実は「exec」は動いているコンテナにしか実行できないんです。
今回は、そんなときに活躍する「docker compose run」コマンドを使って、
新しいコンテナを作成してコマンドを実行する方法を紹介します!

作業ディレクトリの確認

まずは、MariaDBコンテナを構築したディレクトリに移動しましょう。

cd desktop/docker/mariadb

実行結果

PS C:\Users\joeac> cd desktop/docker/mariadb
PS C:\Users\joeac\Desktop\docker\mariadb>

MariaDBコンテナの停止

コンテナが実行中の場合は、いったん停止しておきます。

docker compose stop

実行結果

PS C:\Users\joeac\Desktop\docker\mariadb> docker compose stop
[+] Stopping 1/1
 ✔ Container mariadb-testdb-1  Stopped

「Container mariadb-testdb-1 Stopped」と表示されたら停止完了です。

停止中コンテナへの exec 実行を確認

停止している状態で「docker compose exec」を実行してみるとどうなるでしょう?

docker compose exec testdb ls

実行結果

PS C:\Users\joeac\Desktop\docker\mariadb> docker compose exec testdb ls
service "testdb" is not running

そう、execコマンドは停止中のコンテナでは使えないんです。
このメッセージが出たら、「新しいコンテナを作って実行するrunコマンド」を使うタイミングです。

新しいコンテナを作成してコマンドを実行(run)

現在のコンテナの状況を確認しておきます。
Docker Desktopの「Containers」タブを確認します。

停止中のコンテナが1だけ、あります。

ここからが本題です!
 「docker compose run」コマンドを使うと、新しいコンテナを作って、その中でコマンドを実行できます。

🔧 コマンド構文

docker compose run <サービス名> <実行するコマンド>

Composeは複数サービスを扱えるので、サービス名を指定してあげるのがポイントです。

📘例:新しいコンテナでlsを実行

docker compose run testdb ls

実行結果

PS C:\Users\joeac\Desktop\docker\mariadb> docker compose run testdb ls
bin   docker-entrypoint-initdb.d  lib    libx32  opt   run   sys  var
boot  etc                         lib32  media   proc  sbin  tmp
dev   home                        lib64  mnt     root  srv   usr

コンテナの中でlsコマンドが実行され、結果が表示されました。

コンテナの状態を確認してみよう

Docker Desktopの「Containers」タブを見てみましょう。
……なんと! コンテナが増えています!

「docker compose run」は既存のコンテナを使い回すのではなく、
新しいコンテナをその場で作って実行します。

つまり、このコマンドを使うたびにコンテナが1つ増えていくんです。

📘もう一度実行してみると…

docker compose run testdb ls

実行結果

PS C:\Users\joeac\Desktop\docker\mariadb> docker compose run testdb ls
(省略)
bin   docker-entrypoint-initdb.d  lib    libx32  opt   run   sys  var
boot  etc                         lib32  media   proc  sbin  tmp
dev   home                        lib64  mnt     root  srv   usr

再度実行すると、もう1つ新しいコンテナが作られます。
Docker Desktopを確認すると、確かにコンテナが増えているのがわかります。

runコマンドで作られるコンテナの特徴

特徴説明
新しいコンテナが作成される既存コンテナを再利用せず、新規作成される。
一度きりの実行コマンドを実行して終了したら、そのまま停止状態になる。
自動削除はされない明示的に削除するか、pruneでまとめて削除が必要
一時的なテストに便利実験的なコマンド実行に最適

このように、「run」は一時的な動作確認やコマンドテストにとても便利なんです。

--rm オプションで自動削除!

でも、runを実行するたびにコンテナが増えるのはちょっと面倒ですよね。
そんなときは、--rm オプションを付けましょう!

🔧 コマンド構文

docker compose run --rm <サービス名> <実行コマンド>

📘例:実行後に自動削除されるrun

docker compose run --rm testdb ls

実行結果

PS C:\Users\joeac\Desktop\docker\mariadb> docker compose run --rm testdb ls
(省略)
bin   docker-entrypoint-initdb.d  lib    libx32  opt   run   sys  var
boot  etc                         lib32  media   proc  sbin  tmp
dev   home                        lib64  mnt     root  srv   usr

Docker Desktopで確認すると……
コンテナは増えていません!

つまり、コマンド実行後にコンテナが自動削除されたということです。

💡オプション解説表

オプション説明
--rm実行後に自動でコンテナを削除します。
-dバックグラウンドで実行します(デタッチモード)。
--service-portsコンテナのポート設定を有効にします。
--no-deps他の依存サービスを起動しないようにします。

execとrunの違いをまとめてみよう!

比較項目docker compose execdocker compose run
動作対象既存のコンテナ新しいコンテナ
コンテナの状態実行中でなければNG停止中でもOK(新規作成)
コンテナ増殖増えない実行のたびに増える(--rmで防止可)
主な用途常駐中のコンテナでの操作一時的なコマンド実行・テスト
使用例docker compose exec testdb lsdocker compose run --rm testdb ls

まとめ

ここまでで、「docker compose run」コマンドの使い方が理解できたと思います。

ポイントを整理すると👇

  • exec は「動いているコンテナ」に対してコマンドを実行する。
  • run は「新しいコンテナ」を作ってコマンドを実行する。
  • run --rm を使えば実行後に自動削除されてスッキリ

「ちょっとだけ試したい」「テスト的にコマンドを実行したい」
そんなときに docker compose run --rm はとても便利です。

 Docker環境の管理をスムーズにするためにも、このコマンドの動きをしっかり押さえておきましょう! 🚀