このページで解説している内容は、以下の 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 usrDocker Desktopで確認すると……
コンテナは増えていません!

つまり、コマンド実行後にコンテナが自動削除されたということです。
💡オプション解説表
| オプション | 説明 |
|---|---|
| --rm | 実行後に自動でコンテナを削除します。 |
| -d | バックグラウンドで実行します(デタッチモード)。 |
| --service-ports | コンテナのポート設定を有効にします。 |
| --no-deps | 他の依存サービスを起動しないようにします。 |
execとrunの違いをまとめてみよう!
| 比較項目 | docker compose exec | docker compose run |
|---|---|---|
| 動作対象 | 既存のコンテナ | 新しいコンテナ |
| コンテナの状態 | 実行中でなければNG | 停止中でもOK(新規作成) |
| コンテナ増殖 | 増えない | 実行のたびに増える(--rmで防止可) |
| 主な用途 | 常駐中のコンテナでの操作 | 一時的なコマンド実行・テスト |
| 使用例 | docker compose exec testdb ls | docker compose run --rm testdb ls |
まとめ
ここまでで、「docker compose run」コマンドの使い方が理解できたと思います。
ポイントを整理すると👇
- exec は「動いているコンテナ」に対してコマンドを実行する。
- run は「新しいコンテナ」を作ってコマンドを実行する。
- run --rm を使えば実行後に自動削除されてスッキリ
「ちょっとだけ試したい」「テスト的にコマンドを実行したい」
そんなときに docker compose run --rm はとても便利です。
Docker環境の管理をスムーズにするためにも、このコマンドの動きをしっかり押さえておきましょう! 🚀
