リンクされたサービスを起動せずにコマンドを実行する
このステップでは、マルチコンテナアプリケーションの一部である Docker コンテナで、他のリンクされたサービスを起動せずにコマンドを実行する方法を学びます。これは、データベースマイグレーションやセットアップスクリプト、デバッグコマンドを実行する際に、アプリケーションスタック全体を起動する必要がない場合に特に便利です。
Docker Compose はマルチコンテナアプリケーションを管理する標準ツールであり、特定のサービスでワンオフコマンドを実行する機能を備えていますが、ここでは基本的な Docker の概念を説明します。この環境には Docker Compose がプリインストールされていないため、docker run
コマンドとネットワーク機能に焦点を当てます。
Web アプリケーションとデータベースの 2 つのコンテナからなるシンプルなシナリオを想定します。Web アプリケーションには汎用のubuntu
イメージを、データベースにはpostgres
イメージを使用します。
まず、postgres
イメージをプルします:
docker pull postgres:latest
イメージがプルされていることを示す出力が表示されます。
Using default tag: latest
latest: Pulling from library/postgres
...
Status: Downloaded newer image for postgres:latest
docker.io/library/postgres:latest
次に、コンテナが名前で相互に通信できるように Docker ネットワークを作成します。
docker network create my-app-network
ネットワーク ID が表示されます。
<network_id>
続いて、postgres
コンテナを実行し、作成したネットワークに接続します。PostgreSQL ユーザーのパスワードも設定します。
docker run -d --network my-app-network --name my-database -e POSTGRES_PASSWORD=mypassword postgres
コンテナ ID が表示され、データベースコンテナがバックグラウンドで実行されていることがわかります。
<container_id>
ここで、「Web アプリケーション」コンテナがデータベースマイグレーションスクリプトなど、データベースとやり取りするコマンドを実行する必要があると想定します。通常、Docker Compose を使用している場合、Web サービスでコマンドを実行すると、Docker Compose がネットワーク設定とリンクを処理します。
docker run
のみを使用する場合、Web アプリケーションコンテナを実行してmy-database
に接続しようとすると、通常は同じネットワーク上にある必要があります。
同じネットワークに接続されたubuntu
コンテナでコマンドを実行し、データベースとやり取りする可能性のあるコマンドをシミュレートします。データベースコンテナを名前 (my-database
) で ping してみます。
docker run --network my-app-network ubuntu ping -c 4 my-database
このコマンドは以下の処理を行います:
ubuntu
イメージから新しいコンテナを作成
my-app-network
に接続
- コンテナ内で
ping -c 4 my-database
コマンドを実行
ubuntu
コンテナはmy-database
コンテナと同じネットワーク上にあるため、名前my-database
をデータベースコンテナの IP アドレスに解決して ping を実行できます。
ping のリクエストとレスポンスを示す出力が表示されます:
PING my-database (172.18.0.2) 56(84) bytes of data.
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from my-database.my-app-network (172.18.0.2): icmp_seq=4 ttl=64 time=0.054 ms
--- my-database ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3060ms
rtt min/avg/max/mdev = 0.050/0.053/0.054/0.001 ms
これは、コンテナでワンオフコマンドを実行し、同じネットワーク上の他のコンテナとやり取りできることを示しています(この場合、ubuntu
コンテナには典型的な「サービス」がありません)。重要なのは、コマンドを実行するコンテナを、やり取りが必要なサービスと同じネットワークに接続することです。
最後に、実行中のデータベースコンテナとネットワークをクリーンアップします。
docker stop my-database
my-database
docker rm my-database
my-database
docker network rm my-app-network
my-app-network