Dockerを用いた複数のスプリングブートサービスの実行


このポストでは、Dockerの構成がどのようにローカル環境で複数のコンテナを構成して実行するのを簡単にするかについて見ます.

Dockerがなぜ構成するか?


最初に、複数のコンテナを実行するにはDockerを使う必要はありません.これを以前に示したように、コンテナを手動で起動して停止させるだけでこれを行うことができますpost . ただし、アプリケーションのコンテナ数が増えるにつれて、各コンテナを手動で管理することが面倒です.
Dockerの作成は、単一のYAMLファイルでマルチコンテナーアプリケーションを構成できるようにすることを簡素化します.を起動し、アプリケーション内のすべてのコンテナを1つのコマンドを停止します.

サンプルアプリコード


私はあなたがから引くことができるこの投稿のためのサンプルアプリを作成しましたGithub . 以下を含む
  • 2スプリングブートアプリケーション
  • 銀行口座サービス-を作成し、銀行の簡単なアカウントの詳細を読むための残りのAPIを公開
  • 銀行口座サービスのためのアプリケーション構成でREST APIを公開します
  • 2 DockerFiles -上記サービスのコンテナイメージを定義するには
  • マルチコンテナアプリケーションを定義するファイルを構成するDocker
  • 私は、ブートサービスの詳細についてはいけません.あなたがより多くの情報が欲しいならば、あなたはこれをチェックすることができます.

    銀行口座サービス


    銀行口座サービスのために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.jarwait スクリプトは、銀行口座サービスが続きます.サービスが実行されません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 .
  • 両方のために約20秒かかります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 .