このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
新しいコンテナを作成してコマンドを実行する
![](https://www.infra-linux.com/wp-content/uploads/2024/04/cmd-new-container01-1024x552.png)
「コンテナ内でコマンドを実行する方法」では、「docker compose exec」コマンドを使用して既存のコンテナ内でコマンドを実行させました。ここでは、「docker compose run」コマンドを使って新しいコンテナを作成して、そのコンテナ内でコマンドを実行させていきます。
「MariaDBコンテナの構築」で解説している操作を行っていることが前提となります。
ディレクトリの移動
「desktop/docker/mariadb」ディレクトリに移動しておきます。
・「cd desktop/docker/mariadb」コマンドを実行します。
PS C:\Users\joeac> cd desktop/docker/mariadb
PS C:\Users\joeac\Desktop\docker\mariadb>
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」と表示されます。この表示はコンテナが停止したことを意味しています。
・停止したコンテナに「docker compose exec」コマンドの実行
停止中のコンテナに対して「docker compose 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
「service “testdb” is not running」と表示されます。コンテナが動作していないため、このようなメッセージが表示されるのです。
新しいコンテナを作成してコマンドを実行
現在のコンテナの状況を確認しておきます。
・Docker Desktopの「Containers」タブを確認します。
停止中のコンテナが1だけ、あります。
![](https://www.infra-linux.com/wp-content/uploads/2024/04/cmd-new-container02-1024x555.jpg)
それでは、新しいコンテナを作成して、そのコンテナ内でコマンドを実行させてみます。
新しいコンテナを作成してコマンドを実行するには、「docker compose run」コマンドを使用します。構文は、以下のとおりです。
【構文】
docker compose run <サービス名> <コンテナで実行させるコマンド>
Docker Composeでは、1つのプロジェクトで複数のサービスを扱うため、サービス名を指定してコマンドを実行させる必要があります。
・「docker compose run testdb ls」コマンドを実行します。
新たに作成されたコンテナで「ls」コマンドが実行されます。
PS C:\Users\joeac\Desktop\docker\mariadb> docker compose run testdb ls
[+] Building 0.0s (0/0) docker:default
[+] Building 0.0s (0/0) docker:default
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の「Containers」タブを確認します。
![](https://www.infra-linux.com/wp-content/uploads/2024/04/cmd-new-container03-1024x557.jpg)
コンテナが増えています。
「docker compose run」コマンドは、既に作成されているコンテナを起動して、コマンドを実行するものではありません。
「docker compose run」コマンドは、新たにコンテナを作成してから、そのコンテナ内でコマンドを実行するということです。
さらに「docker compose run」コマンドを実行する
・もう一度、「docker compose run」コマンドを実行してみます。
・「docker compose run testdb ls」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\mariadb> docker compose run testdb ls
[+] Building 0.0s (0/0) docker:default
[+] Building 0.0s (0/0) docker:default
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の「Containers」タブを確認します。
![](https://www.infra-linux.com/wp-content/uploads/2024/04/cmd-new-container04-1024x553.jpg)
コンテナが増えています。
つまり、
「docker compose run」コマンドを実行する度にコンテナが増殖するということです。
不要なコンテナは、後でまとめて「docker system prune」コマンドで削除すれば、よいわけですが、コマンドを実行する度に、コンテナが増えるということに注意してください。
「docker compose run」の「–rm」オプション
「docker compose run」コマンドで「–rm」オプションを指定する。
「docker compose run」コマンドで「–rm」オプションを指定すと、そのコンテナが終了したら自動的に削除されます。
・「docker compose run –rm testdb ls」コマンドを実行します。
PS C:\Users\joeac\Desktop\docker\mariadb> docker compose run --rm testdb ls
[+] Building 0.0s (0/0) docker:default
[+] Building 0.0s (0/0) docker:default
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の「Containers」タブを確認します。
![](https://www.infra-linux.com/wp-content/uploads/2024/04/cmd-new-container04-1024x553.jpg)
コンテナが増えていません。
Docker Desktopで様子を確認すると、新たなコンテナが作成され、コマンドの実行が終わると消えてなくなることが確認できます。実際に操作をして確認してみてください。
まとめ
・「docker compose exec」コマンド
「docker compose exec」コマンドは、既存のコンテナ内でコマンドを実行する。
・「docker compose run」コマンド
「docker compose run」コマンドを使うと新しいコンテナを作成して、そのコンテナ内でコマンドを実行させることができます。ただし、新しいコンテナが作成されるため、コンテナが、このコマンドを実行する度に増えていきます。ただし、「–rm」オプションを指定すると、コマンドの実行が終わると、自動的にコンテナが削除される。
・「docker compose run –rm」コマンド
このコマンドの以下の場合に便利そうです。
ちょっと、テスト的にコンテナ内でコマンドを試してみたいって場合に「docker compose run –rm」コマンドを利用すると便利そうです。