docker-compose
を使用したマルチコンテナアプリケーションの管理
- 概要
docker-composeを使用すると、マルチコンテナアプリケーションを定義および管理できます。使いやすい定義ファイルを使用することにより、このようなアプリケーションスタックの展開が簡単になります。
- 目的
この記事では、docker-composeを使用してマルチコンテナアプリケーションを作成する方法について説明します。
- 所要時間
この記事の理解には20分ほどを要します。
- 目標
コンテナベースの独自のアプリケーションスタックを作成できるようになります。
- 要件
アプリケーションコンテナイメージ、またはアプリケーションの構築に使用する関連するソースファイル。
1 マルチコンテナアプリケーションの管理に関係するツール #
docker-composeは、マルチコンテナアプリケーションを作成するためのツールです。デフォルトではDockerが使用されますが、DockerはSLE Microには存在しません。Dockerをバイパスして、代わりにPodmanを使用するには、podman-docker
スクリプトを使用します。したがって、既存のスクリプトを、DockerではなくPodmanを使用するように変更する必要はありません。以下のセクションでは、ツールの詳細について説明します。
1.1 Podmanについて #
PodmanはPod Manager Toolの略称です。Podmanはデーモンレスコンテナエンジンであり、コンテナとコンテナイメージを使用してアプリケーションを実行および展開できます。Podmanは、コンテナを管理するためのコマンドラインインタフェースを提供します。
Podmanはデーモンを持たないため、systemdとの統合が提供されています。これにより、systemdユニット経由でコンテナを制御できるようになります。このようなユニットを既存のコンテナ向けに作成できるほか、システムにコンテナが存在しない場合にコンテナを起動できるユニットを生成することもできます。Podmanはコンテナ内でsystemdを実行できます。
Podmanを使用すると、コンテナをポッドとして編成できます。ポッドは同じネットワークインタフェースとリソースを共有します。コンテナのグループをポッドに編成する代表的なユースケースは、データベースを実行するコンテナ、およびそのデータベースにアクセスするクライアントが含まれるコンテナです。
1.1.1 Podmanのインストール #
PodmanはデフォルトでSLE Microに含まれます。ただし、Podmanが見つからない場合は、次の説明に従ってインストールできます。
次のコマンドを実行します。
>
sudo
transactional-update pkg install podman*システムを再起動して、新しいスナップショットで起動します。
1.2 podman-docker
について #
podman-docker
は、ユーザが実行するdocker
コマンドを、渡された引数と同じ引数を使用して対応するpodman
コマンドに変更するbashスクリプトです。したがって、すべてのDockerスクリプトを変更せずに使用できます。
1.2.1 podman-docker
のインストール #
podman-docker
は、デフォルトではSLE Microにインストールされていません。これをインストールするには、次の手順に従います。
次のコマンドを実行して、
podman-docker
パッケージをインストールします。transactional-update pkg install podman-docker
システムを再起動して、最新のスナップショットに切り替えます。
1.3 docker-composeについて #
docker-composeは、マルチコンテナアプリケーションを管理するためのツールです。docker-composeでは、単一ホスト上に複数の隔離された環境を設定しながら、環境間で変数を使用することができます。docker-composeを使用すると、変更されたコンテナのみを再作成することができ、マルチコンテナアプリケーション全体を破棄する必要はありません。
docker
コマンドはpodman
コマンドに置き換え
SLE Microでは、docker-composeを実行すると常にpodman-docker
スクリプトを使用してPodmanを呼び出します。これは、SLE MicroにはDockerが存在しないためです。
1.3.1 docker-composeのインストール #
docker-composeがシステムに存在しない場合は、次の手順に従ってインストールできます。
次のコマンドを実行します。
>
sudo
transactional-update pkg install docker-composeインストールが完了したら、システムを再起動して新しいスナップショットで起動します。
2 マルチコンテナアプリケーションの作成 #
マルチコンテナアプリケーションを作成するには、次の手順に従います。
設定ファイル
compose.yml
を作成します。詳細については、2.1項 「compose.yml
の作成」を参照してください。必要なディレクトリ構造を準備します。
compose.yml
ファイルは、作業ディレクトリの最上位に置くことをお勧めします。必要に応じて、コンテナ化されたアプリケーションで使用されるサービスに固有の、独自のコンテナファイルを記述します。たとえば、Goアプリケーションを展開するには、必要な設定と依存関係を含む、Goアプリケーションのコンテナファイルを作成します。
作業ディレクトリ内にサービスごとにサブディレクトリを作成し、そこにサービス固有のファイルを配置することを推奨します。
マルチコンテナアプリケーションを展開します。詳細については、2.2項 「マルチコンテナアプリケーションの展開」を参照してください。
2.1 compose.yml
の作成 #
マルチコンテナアプリケーションを作成するには、compose.yml
ファイルを作成し、できれば作業ディレクトリに配置する必要があります。このファイルは1つのファイルにすることも、フラグメントや拡張機能を利用して、よりきめ細かいアプローチを使用することもできます。複数のdocker-composeファイルをマージして、アプリケーションモデル全体を定義することもできます。
compose.yml
ファイルはアプリケーションを定義します。以下の要素を含めることができます。
- service
サービスとはアプリケーションのコンピューティングコンポーネントです。定義に関する詳細については、2.1.1項 「サービスの定義」を参照してください。
- networks
network
ステートメントを使用してカスタムネットワークを定義し、特定のサービスをカスタムネットワークに割り当てることができます。詳細については、2.1.2項 「ネットワークの定義」を参照してください。- volumes
コンテナエンジンによって管理されるディレクトリで、サービスはここにデータを保存および共有します。
- 環境変数
サービスに渡す環境変数のリストを使用しなければならない場合もあります。詳細については、environment variables referenceを参照してください。
- configs
サービスに必要なすべての設定ファイルを
configs
セクションで宣言する必要があります。詳細については、configs
definitionを参照してください。
2.1.1 サービスの定義 #
サービスを定義する場合、使用するコンテナイメージを指定するか、サービスを構築する元になるソースファイルを用意する必要があります。
サービスコンテナをイメージから作成するには、image
ステートメントを使用します。
services: db: image: database
Podmanは、compose.yml
ファイルで宣言されたイメージ名がローカルコンテナストレージにあるかどうかをチェックします。ない場合、Podmanは、設定されたレジストリの1つからイメージを取得します。
サービスをソースファイルから構築するには、ソースファイルを用意してコンテナファイルを作成し、その両方を同じディレクトリに配置します。その後、compose.yml
ファイルで次のようにbuild
ステートメントを使用します。
services: db: build: PATH_TO_SOURCE_FILES
特定のサービスを別のサービスの後に開始する必要がある場合は、depends_on
ステートメントを使用します。
services: db: image: database depends_on: system: condition: SERVICE_CONDITION
SERVICE_CONDITIONは、service_started
、service_healthy
、またはservice_completed_successfully
のいずれかになります。
services
の定義に関する詳細については、services
specificationを参照してください。
2.1.2 ネットワークの定義 #
デフォルトでは、docker-composeはデフォルトのネットワークを作成し、アプリケーションスタック内の各コンテナはそのネットワークに含まれます。デフォルトのネットワークはdocker-composeによって自動的に作成されるため、compose.yml
ファイルで宣言する必要はありません。
カスタムネットワークを定義し、特定のサービスをそのネットワークに割り当てることもできます。たとえば、2つのネットワークnetwork1
とnetwork2
を作成するには、次のスニペットを追加します。
networks: network1: # Use a custom driver driver: custom-driver-1 network2: # Use a custom driver and name the network driver: custom-driver-2 name: custom_network
既存のネットワークを使用することもできます。この場合、ネットワークをexternalとしてマークします。
networks: network1: name: network1 external: true
networks
の仕様の全詳細については、networks
specificationを参照してください。
2.1.3 compose.yml
の例 #
次のcompose.yml
の例では、Prometheus監視システムとGrafana分析システムを使用するアプリケーションスタックを定義します。
services: prometheus: image: prom/prometheus container_name: prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' ports: - 9090:9090 restart: unless-stopped volumes: - ./prometheus:/etc/prometheus - prom_data:/prometheus grafana: image: grafana/grafana container_name: grafana ports: - 3000:3000 restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=grafana volumes: - ./grafana:/etc/grafana/provisioning/datasources volumes: prom_data:
この例のプロジェクト構造は次のようになります。
. ├── compose.yaml ├── grafana │ └── datasource.yml ├── prometheus │ └── prometheus.yml └── README.md
2.2 マルチコンテナアプリケーションの展開 #
適切なディレクトリ構造とcompose.yml
ファイルを作成したら、マルチコンテナアプリケーションを展開できます。
実行しようとしているコンテナがまだ存在しないことを確認します。
>
podman ps --all必要に応じて、特定のコンテナを削除します。
>
podman rm -fCONTAINER_IDcompose.yml
が存在するディレクトリから次のコマンドを実行して、マルチコンテナアプリケーションを起動します。>
docker compose up -ddocker-composeにより、そのマルチコンテナアプリケーション用に別のネットワークが作成されます。
実行中のコンテナを一覧にすると、コンテナが実行中でポートがマップされていることを確認できます。
>
podman ps
3 マルチコンテナアプリケーションの管理 #
マルチコンテナアプリケーションを作成した後に、docker-compose
コマンドを使用して管理操作を実行できます。コマンドの構文は次のとおりです。
>
docker compose[OPTIONS]COMMAND
このコマンドは、管理するマルチコンテナアプリケーションのcompose.yml
ファイルが存在するディレクトリと同じディレクトリから実行します。または、-f, --file
オプションを使用してcompose.yml
ファイルへのパスを指定します。たとえば、マルチコンテナアプリケーションを終了して削除するには、次のコマンドを実行します。
>
docker compose -f ./test/compose.yml down
その他の役立つコマンド:
- images
マルチコンテナアプリケーション内のコンテナが使用するすべてのイメージを一覧にします。
>
docker compose images- pause
すべてのコンテナを一時停止します。
>
docker compose pause[SERVICE]- ps
マルチコンテナアプリケーション内のコンテナを一覧にします。
>
docker compose ps- rm
停止したコンテナを削除します。
>
docker compose rm- start/stop
コンテナを開始または停止します。
>
docker compose stop[SERVICE]
オプションとコマンドの完全なリストについては、次のコマンドを実行します。
>
docker-compose --help
4 法的事項 #
Copyright © 2006–2024 SUSE LLC and contributors. All rights reserved.
この文書は、GNUフリー文書ライセンスのバージョン1.2または(オプションとして)バージョン1.3の条項に従って、複製、頒布、および/または改変が許可されています。ただし、この著作権表示およびライセンスは変更せずに記載すること。ライセンスバージョン1.2のコピーは、「GNUフリー文書ライセンス」セクションに含まれています。
SUSEの商標については、https://www.suse.com/company/legal/を参照してください。その他の第三者のすべての商標は、各社の所有に帰属します。商標記号(®、™など)は、SUSEおよび関連会社の商標を示します。アスタリスク(*)は、第三者の商標を示します。
本書のすべての情報は、細心の注意を払って編集されています。しかし、このことは正確性を完全に保証するものではありません。SUSE LLC、その関係者、著者、翻訳者のいずれも誤りまたはその結果に対して一切責任を負いかねます。