Dockerを用いた複数のスプリングブートサービスの実行
10079 ワード
このポストでは、Dockerの構成がどのようにローカル環境で複数のコンテナを構成して実行するのを簡単にするかについて見ます.
最初に、複数のコンテナを実行するにはDockerを使う必要はありません.これを以前に示したように、コンテナを手動で起動して停止させるだけでこれを行うことができますpost . ただし、アプリケーションのコンテナ数が増えるにつれて、各コンテナを手動で管理することが面倒です.
Dockerの作成は、単一のYAMLファイルでマルチコンテナーアプリケーションを構成できるようにすることを簡素化します.を起動し、アプリケーション内のすべてのコンテナを1つのコマンドを停止します.
私はあなたがから引くことができるこの投稿のためのサンプルアプリを作成しましたGithub . 以下を含む 2スプリングブートアプリケーション 銀行口座サービス-を作成し、銀行の簡単なアカウントの詳細を読むための残りのAPIを公開 銀行口座サービスのためのアプリケーション構成でREST APIを公開します 2 DockerFiles -上記サービスのコンテナイメージを定義するには マルチコンテナアプリケーションを定義するファイルを構成するDocker 私は、ブートサービスの詳細についてはいけません.あなたがより多くの情報が欲しいならば、あなたはこれをチェックすることができます.
銀行口座サービスのためにDockerイメージを定義し始めます.
次に設定サービスDockerイメージを定義します.上記の銀行口座サービスのために作成されたイメージのわずかにより簡単なバージョン.単にサービスディレクトリを作成し、サービスジャーでコピーして実行します.
ここで、DockFilesをBank AccountとConfig Servicesに定義したので、次の手順でDockerを作成して、これらのイメージを使用してコンテナを実行する方法を説明します.
The
The
一般的にあなたの容器に意味のある名前を与える良い考え.後で参照する必要があります
The
The
ランニング ブリッジネットワークの作成 を使用してコンテナを起動します を使用してコンテナを起動します 両方のために約20秒かかります
コンテナーAがコンテナAが始まることができる前にコンテナBを実行するのを必要とするように、コンテナの間の依存関係を有するのは、一般的です.このシナリオを特定の程度に処理することができます
我々は、サンプルアプリケーションでも同様の問題があるので
docker-compose-wait は、上記の問題を解決する大きなコマンドラインユーティリティです.When defining the
我々は、下のログスニペットの中でこれを見ることができます.The
結局
このポストでは、どのようにDockerの構成を簡単に単一のノード環境で複数のコンテナを管理することが容易に見た.これは開発環境と自動化されたテスト環境に特に便利です.マルチノード環境で複数のコンテナを管理したいなら、Docker Swarmはより良い賭けです.我々はすぐに別のポストで群れを見ていきます.
郵便Running Multiple Spring Boot Services with Docker Compose 最初に現れたbriansdevblog .
Dockerがなぜ構成するか?
最初に、複数のコンテナを実行するにはDockerを使う必要はありません.これを以前に示したように、コンテナを手動で起動して停止させるだけでこれを行うことができますpost . ただし、アプリケーションのコンテナ数が増えるにつれて、各コンテナを手動で管理することが面倒です.
Dockerの作成は、単一のYAMLファイルでマルチコンテナーアプリケーションを構成できるようにすることを簡素化します.を起動し、アプリケーション内のすべてのコンテナを1つのコマンドを停止します.
サンプルアプリコード
私はあなたがから引くことができるこの投稿のためのサンプルアプリを作成しましたGithub . 以下を含む
銀行口座サービス
銀行口座サービスのためにDockerイメージを定義し始めます.
# MAINTAINER Brian HannawayFROM openjdk:8-jre-alpine
WORKDIR /app
# Add wait script to the image - script pulled from https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait
COPY /scripts/wait /app/RUN chmod +x /app
RUN apk --no-cache add curl
COPY /target/bank-account-service-0.0.1-SNAPSHOT.jar /app/
CMD ./wait && java -jar bank-account-service-0.0.1-SNAPSHOT.jar
FROM openjdk:8-jre-alpine
DocJkerにOpenJDK : 8 - JREアルパインベースイメージを使用するように伝えます.WORKDIR /app
Dockerに、/appというイメージの新しい作業ディレクトリを作成します.すべてのコマンドはこのディレクトリから実行されます.COPY /scripts/wait /app/
Dockerにコピーを指示するwait
ホストのスクリプトディレクトリからイメージの/appディレクトリへのスクリプト.待ち時間スクリプトの目的を詳細に説明します.RUN chmod +x /app
\/appディレクトリの内容を実行可能にするCOPY /target/bank-account-service-0.0.1-SNAPSHOT.jar /app/
ホストのターゲットディレクトリからサービスのjarをイメージ内の/appディレクトリにコピーするCMD ./wait && java -jar bank-account-service-0.0.1-SNAPSHOT.jar
はwait
スクリプトは、銀行口座サービスが続きます.サービスが実行されませんwait
スクリプトが終了しました.コンフィグ・サービス
次に設定サービスDockerイメージを定義します.上記の銀行口座サービスのために作成されたイメージのわずかにより簡単なバージョン.単にサービスディレクトリを作成し、サービスジャーでコピーして実行します.
FROM openjdk:8-jre-alpine
MAINTAINER Brian Hannaway
WORKDIR /app
COPY /target/config-server-0.0.1-SNAPSHOT.jar /app/
ENTRYPOINT ["java", "-jar", "config-server-0.0.1-SNAPSHOT.jar"]
Dockerの作成ファイルの定義
ここで、DockFilesをBank AccountとConfig Servicesに定義したので、次の手順でDockerを作成して、これらのイメージを使用してコンテナを実行する方法を説明します.
version: "3"
services:
config-service:
image: config-service
container_name: config-service
networks:
- micro-service-network
ports:
- 8888:8888
bank-service:
image: bank-service
container_name: bank-service
networks:
- micro-service-network
ports:
- 8080:8080
environment:
WAIT_HOSTS: config-service:8888
networks: micro-service-network:
version: "3"
DockerにDockerの構成ファイル形式のバージョン3を使用していることを伝えます.バージョン3の書き込み時に最新かつ推奨されるバージョンです.あなたが実行しているDockerのバージョンによって口述される使用するDockerを構成する形式のバージョン.私はDockerバージョン19.03.12を実行しています.DockerのバージョンのバージョンがあなたのDockerバージョンと互換性があるかどうかをチェックする場合はcompatibility matrix .サービス定義
The
services
セクションでは、アプリケーションを構成するコンテナを定義します.各サービス定義には、イメージからコンテナを起動するために必要なすべての構成が含まれます.各サービス定義の情報は、コマンドラインで一般的に供給するものです.config-service:
image: config-service
container_name: config-service
networks:
- micro-service-network
expose: - "8888"
設定サービス
The
config-service
セクションでは、設定Dockerが設定サービスコンテナを実行する必要があるすべてを定義しますimage
コンテナーを実行するイメージを作成します.container_name
開始時にコンテナに与えられた名前です.名前を指定しない場合、Composeは、ファイルとイメージ名の名前に基づいて1つを派生させます.例えば、config-service
ランdocker-compose up
, コンテナの派生名はboot-microservices-docker-compose_config-service_1
.一般的にあなたの容器に意味のある名前を与える良い考え.後で参照する必要があります
config-service
からbank-service
. で指定した名前を使用しますcontainer_name
.networks
ネットワークを定義するconfig-service
コンテナが起動すると起動します.この例ではmicro-service-network
, 後で定義します.expose
コンテナに公開されているポートを一覧表示します.ポートは、デフォルトのネットワークまたはコンテナが接続されている任意のネットワークのいずれかに公開されます.ポートはホストマシンに公開されません.これを行うには、ports
属性と適切なマッピングを提供します.銀行サービス
The
bank-service
定義は、我々がすでに定義したものと非常に類似していますimage
, container_name
, networks
and expose
属性はconfig-service
bank-service:
image: bank-service
container_name: bank-service
networks:
- micro-service-network
expose: - "8080"
environment:
WAIT_HOSTS: config-service:8888
The environment
属性はコンテナの環境変数のリストを指定するために使用されます.にbank-service
環境変数を指定するWAIT_HOSTS
そしてそれに値を与えるconfig-service:8888
. 要するに、これはコンテナの起動順序を制御し、config-service
が起きているbank-service
スタート後で詳しく説明します.ネットワーク定義
The
networks
セクションでは、サービスのネットワークを定義できます.我々のアプリケーションのためにmicro-service-network
. あなたが走るときdocker-compose up
, 開始する各コンテナは、micro-services-network
アプリケーション内の他のすべてのコンテナに表示されます.コンテナ名はサービス名と同じホスト名で参照できます.だから我々のサンプルアプリケーションではbanks-service
にアクセスできますconfig-service
ASconfig-service:8888.
明示的に定義しない場合network
, Dockerは、デフォルトで1つを作成し、それにファイルを作成するすべてのサービスを追加します.アプリケーションの実行
ランニング
docker-compose up
コマンドmicro-service-network
config-service
イメージ.コンテナはポート8888を公開するmicro-service-network
ホスト名を通して他のコンテナにアクセスできますconfig-service
. bank-service
イメージ.コンテナはポート8080を公開するmicro-service-network
ホスト名を通して他のコンテナにアクセスできますbank-service
. bank-service
and config-service
開始する.あなたが走るならばdocker container ls
あなたは、ちょうど作成された2つのコンテナを見るべきです.サービス依存と起動順序
コンテナーAがコンテナAが始まることができる前にコンテナBを実行するのを必要とするように、コンテナの間の依存関係を有するのは、一般的です.このシナリオを特定の程度に処理することができます
depends_on
属性.例えば、以下の構成ファイルはweb
サービスとdb
サービスweb
依存するdb
.version: '3'
services:
web:
image: myWebApp
depends_on:
- db
db:
image: postgres
上記の例では、コンフィギュレーションは依存関係の順序でコンテナを起動しますdb
開始前web
. Although depends_on
コンテナが起動される順序を設定します.db
コンテナは完全に動作する前にweb
コンテナ開始.我々は、サンプルアプリケーションでも同様の問題があるので
bank-service
試みる試みconfig-service
起動時.If config-service
完全には立ち上がっており、ポート8888でのリクエストを受けることはできません.bank-service
は失敗する.使用depends_on
属性を開始するconfig-service
まず、それは保証されませんconfig-service
完全に動作する前にbank-service
呼び出します.紹介ドッカー構成待ち
docker-compose-wait は、上記の問題を解決する大きなコマンドラインユーティリティです.When defining the
bank-service
以前に、我々はコピーをすることによってイメージに利用可能なDockerwait
スクリプトをapp
ディレクトリ.# Add wait script to the image - script pulled from https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /waitCOPY /scripts/wait /app/
それから、私たちはwait
コンテナを起動するときのjarファイルと一緒にスクリプト.CMD ./wait && java -jar bank-account-service-0.0.1-SNAPSHOT.jar
定義するとbank-service
Dockerの構成ファイルでは、我々は含まれてWAIT_HOSTS
参照する環境変数config-service
ポート8888で.我々が走るときdocker-compose up
, the wait
スクリプトconfig-service
ポート8888で.許可しませんbank-service
まで開始するコンテナconfig-service
はポート8888で稼働している.我々は、下のログスニペットの中でこれを見ることができます.The
wait
スクリプトがconfig-service
最初にポート8888で利用可能です.結局
config-service
ブートストラップで、ポート8888で稼働しています.The wait
次に、ホスト設定サービスを報告しますbank-service
コンテナを起動します.ラッピング
このポストでは、どのようにDockerの構成を簡単に単一のノード環境で複数のコンテナを管理することが容易に見た.これは開発環境と自動化されたテスト環境に特に便利です.マルチノード環境で複数のコンテナを管理したいなら、Docker Swarmはより良い賭けです.我々はすぐに別のポストで群れを見ていきます.
郵便Running Multiple Spring Boot Services with Docker Compose 最初に現れたbriansdevblog .
Reference
この問題について(Dockerを用いた複数のスプリングブートサービスの実行), 我々は、より多くの情報をここで見つけました https://dev.to/briansdevblog/running-multiple-spring-boot-services-with-docker-compose-5c2gテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol