DockerComposeを使用した複数のコンテナーの操作
この記事では、アプリを、それぞれが独自のイメージを持つ複数のDockerコンテナーの小さなネットワークにセグメント化する方法について説明します。
単一のコンテナーは、コマンドラインで必須に構築するのに十分簡単ですが、より複雑なことを行うと、すぐに手に負えなくなる可能性があります。 代わりに、docker-compose.yml
と呼ばれる新しい特殊なタイプの構成ファイルを使用します。 この宣言型のアプローチにより、各コンテナーでイメージをすばやく定義し、それらの間のネットワークをセットアップできます。
この例では、NGINXサーバー、Expressサーバー、およびReactアプリをセットアップします。 目標は、クライアントとサーバーを別々にホストし、NGINXが正しいコンテナへのリクエストを管理することです。これにより、/api
へのhttpリクエストはすべてサーバーコンテナに送信され、その他はすべてクライアントに送信されます。
前提条件
Dockerfileを使用してイメージを構築する方法を知っておくと役に立ちます。Dockerfileはここでブラッシュアップできますが、ほとんどの場合、スターターで処理されます。
スターターセットアップ
基本的なReactアプリとサーバーのセットアップと動作の単調さを省くために、このスターターを作成しました。 アプリ自体は、サーバーによってログに記録されるようにテキストを送信する単なる入力であり、特別なことは何もありません。 すべてを独自のコンテナーにセグメント化するため、クライアントとサーバーには依存関係のある独自の package.json ファイルがあります。必要に応じて、各フォルダーでnpm install
を個別に実行することを忘れないでください。ローカルでテストします。
NGINXセットアップ
NGINXサーバーは他のコンテナーとは異なります。 NGINXは、Reactアプリとサーバー間のルーターとして機能し、リクエストを正しいコンテナーに送信します。
特別な構成ファイルdefault.conf
では、upstream
を使用して、各コンテナーが実行されているサーバーポートをNGINXに通知します。 docker-compose.yml
で定義したサービス名を参照していることに注意してください。
server
はコントローラーであり、この場合はNGINXサーバーです。 Dockerは、コントローラーを見つけることができる場所と、proxy_pass
を使用したリクエストに応じてトラフィックを再ルーティングする場所を知る必要があります。
upstream client {
server client:3000;
}
upstream server {
server server:4000;
}
server {
listen 80;
location / {
proxy_pass http://client;
}
location /api {
proxy_pass http://server;
}
}
これで、この構成をより便利な場所に配置するためにdockerが必要になります。 NGINXコンテナにはすでに空のdefault.conf
ファイルがあるため、その場所にコピーすると古いファイルが上書きされます。
FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf
DockerCompose
version: '3'
services:
server:
build:
dockerfile: Dockerfile
context: ./server
volumes:
- /app/node_modules
- ./server:/app
nginx:
restart: always
build:
dockerfile: Dockerfile
context: ./controller
ports:
- '5000:80'
client:
build:
dockerfile: Dockerfile
context: ./client
volumes:
- /app/node_modules
- ./client:/app
これが何をしようとしているのかを正確に調べてみましょう。
service
は、特定の構成で各コンテナーを宣言します。これには、好きな名前を付けることができます。build
は、コンテナをどのように構築するか、この場合はどのファイルを使用するか、dockerfile
とcontext
のどこにあるかを示します。restart
は、実行時にコンテナーに障害が発生した場合の対処方法をDockerに指示します。この場合、常にコンテナーの再起動を試行する必要があります。ports
は、ターミナルで作業しているときの-p
フラグと同様に、必要なポートをデフォルトのポートに再マップします。volumes
は、各コンテナーに接続されている永続データです。 コンテナの一部とその依存関係を複製しているので、コンテナを破棄して新しいコンテナを開始すると、すべてを再インストールする時間を回避するためにそのキャッシュが保持されます。
最後に、docker-compose up
コマンドと--build
フラグを使用してサービスを作成し、コンテナーを結合してDockerfileを構築できます。
$ docker-compose up --build
すべてをコピーしてnpm install
を実行しているため、これにはしばらく時間がかかる場合がありますが、完了すると、server_1
、nginx_1
、およびclient_1
が同時に実行されます。
まとめ
これは非常に単純なユースケースだったかもしれませんが、Docker Composeは間違いなく、ほとんどすべてのDockerプロジェクトで使用する主要なツールの1つです。