Traffine I/O

日本語

2022-06-13

Docker Composeを使用したマルチコンテナの実行

はじめに

この記事では、Docker Composeを使用してマルチコンテナを実行する方法について説明し、基本的な内容、Composeファイルの構造、サービスの定義、ネットワークやボリュームの設定、そしてアプリケーションライフサイクルの管理についてカバーします。

Composeファイルの構造

Docker Composeファイルは、マルチコンテナのアプリケーションに必要なサービス、ネットワーク、およびボリュームを定義するYAMLファイルです。ファイルは通常、プロジェクトディレクトリのルートにdocker-compose.ymlという名前で配置されます。Composeファイルの基本的な構造は、次のトップレベル要素を含みます。

  • version
    Composeファイルのフォーマットバージョンを指定します。異なるバージョンは、異なる機能と構文をサポートしています。

  • services
    アプリケーションを構成するサービスのリスト。各サービスは、Dockerイメージまたはビルドコンテキストで定義されるコンテナに対応します。

  • networks (オプション)
    アプリケーションのカスタムネットワークのリスト。ネットワークは、サービス間の通信を可能にし、特定のドライバとオプションで構成することができます。

  • volumes (オプション)
    アプリケーションの名前付きボリュームのリスト。ボリュームは、コンテナの永続的なストレージを提供し、サービス間でデータを共有するために使用できます。

サービスの定義

サービスはアプリケーションの中心的なコンポーネントであり、Composeファイルのサービスセクション内で定義されます。各サービスはコンテナを表し、Dockerイメージまたはビルドコンテキストから構築されます。サービスを定義するには、次の手順に従ってください。

  1. servicesセクションの下に、サービスの説明的な名前(例:webdatabaseredis)を持つ新しいエントリを追加
  2. imageキーを使用してサービスに使用するDockerイメージを指定。Docker Hubから公式イメージを使用するか、プライベートリポジトリからカスタムイメージを使用することができます。
  3. (オプション)カスタムイメージをビルドする必要がある場合は、imageキーの代わりにbuildキーを使用し、ビルドコンテキスト(通常はDockerfileへのパス)を指定
  4. (オプション) 現在のサービスに依存する任意のサービスを指定するためにdepends_onキーを使用。これにより、依存するサービスが現在のサービスの前に開始されるようになります。
  5. (オプション) ポート、ボリューム、環境、ネットワークなど、サービスに対して任意の追加設定を構成

以下は、相互依存関係を持つWebサービス、Redisサービス、およびPostgreSQLサービスを定義するComposeファイルの例です。

docker-compose.yml
version: '3.9'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app
  app:
    build: ./app
    depends_on:
      - redis
      - db
  redis:
    image: redis:alpine
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb

この例では、webサービスがappサービスに依存しており、appサービスはredisサービスとdbサービスの両方に依存しています。この構成により、サービスが正しい順序で開始されることが保証されます。例では、redisdbが最初に開始され、次にappが開始され、最後にwebが開始されます。

ネットワークの構成

デフォルトでは、Docker Composeはアプリケーションの単一のデフォルトネットワークを作成し、全てのサービスをそれに接続します。ただし、より詳細な制御のためにカスタムネットワークを定義することができます。カスタムネットワークを作成するには、次の手順に従ってください。

  1. networksセクションの下に、ネットワークの説明的な名前(例: frontendbackend)を持つ新しいエントリを追加
  2. (オプション) driverおよびdriver_optsキーを使用してネットワークドライバとオプションを指定
  3. servicesセクションで、カスタムネットワークに接続する各サービスに対してnetworksキーを使用。ネットワーク名をネットワークキーのリストアイテムとして指定します。

以下は、異なるサービスをそれらに接続する2つのカスタムネットワークを定義するComposeファイルの例です。

docker-compose.yml
version: '3.9'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app
    networks:
      - frontend
  app:
    build: ./app
    depends_on:
      - redis
      - db
    networks:
      - frontend
      - backend
  redis:
    image: redis:alpine
    networks:
      - backend
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    networks:
      - backend

networks:
  frontend:
  backend:

この例では、2つのカスタムネットワークfrontendおよびbackendを作成しました。 webおよびappサービスはfrontendネットワークに接続され、 appredis、およびdbサービスはbackendネットワークに接続されています。この構成により、アプリケーションのフロントエンドとバックエンドコンポーネントが分離されます。

ボリュームの構成

Docker Composeを使用すると、名前付きボリュームを作成してデータを永続化し、サービス間で共有することができます。名前付きボリュームを作成するには、次の手順に従ってください。

  1. volumesセクションの下に、ボリュームの説明的な名前(例: db_dataapp_uploads)を持つ新しいエントリを追加
  2. servicesセクションで、名前付きボリュームをマウントする各サービスに対してvolumesキーを使用します。形式は<source>:<target>のソース(ボリューム名)とターゲット(コンテナ内のマウントポイント)を指定します。

以下は、名前付きボリュームを定義し、それをPostgreSQLサービスにマウントするComposeファイルの例です。

docker-compose.yml
version: '3.9'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app
  app:
    build: ./app
    depends_on:
      - redis
      - db
  redis:
    image: redis:alpine
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

この例では、db_dataという名前の名前付きボリュームを作成し、それをdbサービスコンテナ内の/var/lib/postgresql/dataディレクトリにマウントしました。この構成により、PostgreSQLデータがコンテナの再起動間でも永続化され、必要に応じて複数のサービス間で共有できるようになります。

Docker Composeを使用したアプリケーションのビルドと実行

Dockerイメージのビルド

ComposeファイルがカスタムDockerイメージのビルドを必要とするサービスを指定している場合、アプリケーションを起動する前にこれらのイメージをビルドする必要があります。Composeファイルで定義された必要なサービスに対応する全てのイメージをビルドするには、 docker-compose.ymlファイルがある同じディレクトリで次のコマンドを実行します。

bash
$ docker-compose build

このコマンドは、Composeファイルで定義されたサービスに応じて、必要な全てのイメージをビルドします。特定のサービスのみをビルドする場合は、 buildコマンドの後にサービス名を指定できます。

bash
$ docker-compose build <service_name>

サービスとコンテナの起動

イメージがビルドされたら、Docker Composeを使用してアプリケーションを起動できます。サービスを起動し、それらに対応するコンテナを作成するには、次のコマンドを実行します。

bash
$ docker-compose up

デフォルトでは、このコマンドは前面で実行され、全てのサービスのログがコンソールに表示されます。デタッチドモード(バックグラウンド)でサービスを実行するには、 -dフラグを使用します。

bash
$ docker-compose up -d

また、 --scaleフラグに続いてサービス名とレプリカ数を指定することで、各サービスの望ましいスケールを指定できます。

bash
$ docker-compose up --scale <service_name>=<number_of_replicas>

コンテナの停止と削除

サービスを停止し、関連するコンテナを削除するには、次のコマンドを使用します。

bash
$ docker-compose down

このコマンドは、実行中の全てのサービスを停止し、コンテナを削除し、Composeファイルで定義されたネットワークとボリュームも削除します。コンテナ、ネットワーク、およびボリュームを削除せずにサービスを停止する場合は、代わりにstopコマンドを使用します。

bash
$ docker-compose stop

サービスのスケーリング

アプリケーションが水平スケーリングを必要とする場合、Docker Composeを使用すると、各サービスのレプリカ数を簡単に調整できます。特定のサービスをスケールするには、 scaleコマンドを使用して、サービス名に続いて望むレプリカ数を指定します。

bash
$ docker-compose up -d --scale <service_name>=<number_of_replicas>

サービスのスケーリングには、アプリケーションの性質に応じて、負荷分散やデータ分割などの追加の構成が必要な場合があることに注意してください。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!