この記事では、アプリを、それぞれが独自のイメージを持つ複数の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を使用したリクエストに応じてトラフィックを再ルーティングする場所を知る必要があります。

default.conf
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ファイルがあるため、その場所にコピーすると古いファイルが上書きされます。

サーバー/Dockerfile
FROM nginx 
COPY ./default.conf /etc/nginx/conf.d/default.conf

DockerCompose

docker-compose.yml
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は、コンテナをどのように構築するか、この場合はどのファイルを使用するか、dockerfilecontextのどこにあるかを示します。
  • restartは、実行時にコンテナーに障害が発生した場合の対処方法をDockerに指示します。この場合、常にコンテナーの再起動を試行する必要があります。
  • portsは、ターミナルで作業しているときの-pフラグと同様に、必要なポートをデフォルトのポートに再マップします。
  • volumesは、各コンテナーに接続されている永続データです。 コンテナの一部とその依存関係を複製しているので、コンテナを破棄して新しいコンテナを開始すると、すべてを再インストールする時間を回避するためにそのキャッシュが保持されます。

最後に、docker-compose upコマンドと--buildフラグを使用してサービスを作成し、コンテナーを結合してDockerfileを構築できます。

$ docker-compose up --build

すべてをコピーしてnpm installを実行しているため、これにはしばらく時間がかかる場合がありますが、完了すると、server_1nginx_1、およびclient_1が同時に実行されます。

まとめ

これは非常に単純なユースケースだったかもしれませんが、Docker Composeは間違いなく、ほとんどすべてのDockerプロジェクトで使用する主要なツールの1つです。