Spring BootアプリケーションのDockerizing

Spring Bootアプリケーションのドッキング

1. 概要

この記事では、Spring Boot Applicationをドッキングして、分離された環境(別名)で実行する方法に焦点を当てます。 container

さらに、相互に依存し、仮想プライベートネットワークで相互にリンクされているコンテナの構成を作成する方法を示します。 また、単一のコマンドでそれらを管理する方法についても説明します。

https://hub.docker.com//alpine/[_Alpine Linux]を実行して、Java対応の軽量ベースイメージを作成することから始めましょう。

2. 共通ベースイメージ

Docker’s独自のビルドファイル形式であるDockerfileを使用します。

Dockerfileは、原則として、イメージを構築するためのコマンドを含む行単位のバッチファイルです。 これらのコマンドをファイルに入れる必要はありません。コマンドラインにも渡すことができるためです。ファイルの方が便利です。

それでは、最初のDockerfileを書いてみましょう。

FROM alpine:edge
MAINTAINER example.com
RUN apk add --no-cache openjdk8
COPY files/UnlimitedJCEPolicyJDK8/* \
  /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/
  • FROM:キーワードFROMは、ビルドベースとしてタグ付きの特定のイメージを使用するようにDockerに指示します。 このイメージがローカルライブラリにない場合は、DockerHubまたはその他の構成済みのリモートレジストリでオンライン検索が実行されます。

  • MAINTAINERMAINTAINERは通常、画像の作成者を識別する電子メールアドレスです。

  • RUNRUNコマンドを使用して、ターゲットシステム内でシェルコマンドラインを実行しています。 ここでは、Alpine Linux’sパッケージマネージャーapkを使用してJava 8 OpenJDKをインストールします

  • COPY:最後のコマンドは、DockerからCOPYに、ローカルファイルシステムからビルドディレクトリのサブフォルダーへのいくつかのファイルを、指定されたパスのイメージに指示します。

REQUIREMENTS:チュートリアルを正常に実行するには、OracleからJava Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Filesをダウンロードする必要があります。 ダウンロードしたアーカイブを‘files'.という名前のローカルフォルダーに抽出するだけです。

最終的にイメージをビルドしてローカルライブラリに保存するには、次を実行する必要があります。

docker build --tag=alpine-java:base --rm=true .

NOTICE:–tagオプションはイメージに名前を付け、–rm=trueは正常にビルドされた後に中間イメージを削除します。 このシェルコマンドの最後の文字はドットであり、ビルドディレクトリの引数として機能します。

3. スタンドアロンのSpringBootアプリケーションをDocker化する

ドッキングできるアプリケーションの例として、spring cloud configuration tutorialからspring-cloud-config/serverを取得します。 準備手順として、実行可能なjarファイルをアセンブルし、それをDockerビルドディレクトリにコピーする必要があります。

tutorials $> cd spring-cloud-config/server
server    $> mvn package spring-boot:repackage
server    $> cp target/server-0.0.1-SNAPSHOT.jar \
               ../../spring-boot-docker/files/config-server.jar
server    $> cd ../../spring-boot-docker

次に、次の内容でDockerfile.serverという名前のDockerfileを作成します。

FROM alpine-java:base
MAINTAINER example.com
COPY files/spring-cloud-config-server.jar /opt/spring-cloud/lib/
COPY files/spring-cloud-config-server-entrypoint.sh /opt/spring-cloud/bin/
ENV SPRING_APPLICATION_JSON= \
  '{"spring": {"cloud": {"config": {"server": \
  {"git": {"uri": "/var/lib/spring-cloud/config-repo", \
  "clone-on-start": true}}}}}}'
ENTRYPOINT ["/usr/bin/java"]
CMD ["-jar", "/opt/spring-cloud/lib/spring-cloud-config-server.jar"]
VOLUME /var/lib/spring-cloud/config-repo
EXPOSE 8888
  • FROM:イメージのベースとして、前のセクションで作成したJava対応のAlpine Linuxを使用します

  • COPYDockerにjarファイルをイメージにコピーさせます

  • ENV:このコマンドを使用すると、コンテナーで実行されているアプリケーションによって尊重されるいくつかの環境変数を定義できます。 ここでは、カスタマイズされたSpring Boot Application configurationを定義して、後でjar実行可能ファイルに渡します。

  • ENTRYPOINT/CMD: This will be the executable to start when the container is booting. 一部のアプリケーション引数ではENTRYPOINTCMDと組み合わせて使用​​するため、これらをJSON-Arrayとして定義する必要があります。

  • VOLUME:コンテナは分離された環境で実行され、直接ネットワークにアクセスできないため、構成リポジトリのマウントポイントプレースホルダーを定義する必要があります

  • EXPOSE:ここでは、アプリケーションがリストしているポートをDockerに通知しています。 このポートは、コンテナの起動時にホストに公開されます

Dockerfileからイメージを作成するには、前と同じように‘docker build'を実行する必要があります。

$> docker build --file=Dockerfile.server \
     --tag=config-server:latest --rm=true .

ただし、イメージからコンテナを実行する前に、マウント用のボリュームを作成する必要があります。

$> docker volume create --name=spring-cloud-config-repo

NOTICE:コンテナは不変ですが、アプリケーションの終了後にイメージにコミットされていない場合、ボリュームに格納されているデータは複数のコンテナにわたって保持されます。

最後に、画像からコンテナを実行できます。

$> docker run --name=config-server --publish=8888:8888 \
     --volume=spring-cloud-config-repo:/var/lib/spring-cloud/config-repo \
     config-server:latest
  • まず、コンテナを–nameする必要があります。 そうでない場合は、自動的に選択されます

  • 次に、公開されたポート(Dockerfileを参照)をホスト上のポートに–publishする必要があります。 値は‘host-port:container-port'の形式で与えられます。 コンテナポートのみが指定されている場合、ランダムに選択されたホストポートが使用されます。 このオプションを省略した場合、コンテナは完全に分離されます

  • –volumeオプションは、ホスト上のディレクトリ(絶対パスで使用される場合)または以前に作成されたDockerボリューム(volume-nameで使用される場合)へのアクセスを提供します。 コロンの後のパスは、コンテナ内のmountpointを指定します

  • 引数として、使用する画像をDockerに指示する必要があります。 ここでは、前の「docker build」ステップからのimage-nameを指定する必要があります

  • さらに便利なオプション:

    • -it –インタラクティブモードを有効にし、pseudo-ttyを割り当てます

    • -d –起動後にコンテナからデタッチします

分離モードでコンテナを実行した場合、次のコマンドを使用して、コンテナの詳細を調べて停止し、削除できます。

$> docker inspect config-server
$> docker stop config-server
$> docker rm config-server

4. コンポジット内の依存アプリケーションをDockerize

DockerコマンドとDockerfilesは、個々のコンテナーの作成に特に適しています。 しかし、operate on a network of isolated applicationsにしたい場合は、コンテナー管理がすぐに乱雑になります。

To solve that, Docker provides a tool named Docker Compose.これには、YAML形式の独自のビルドファイルが付属しており、複数のコンテナーの管理に適しています。 例:1つのコマンドでサービスの複合を開始または停止したり、複数のサービスのログ出力を1つのpseudo-ttyにマージしたりできます。

異なるDockerコンテナで実行されている2つのアプリケーションの例を作成しましょう。 それらは互いに通信し、「単一ユニット」としてホストシステムに提示されます。 以前にconfig-serverで行ったように、spring cloud configuration tutorialで説明されているspring-cloud-config/clientの例をビルドしてfilesフォルダーにコピーします。

これはdocker-compose.ymlになります:

version: '2'
services:
    config-server:
        container_name: config-server
        build:
            context: .
            dockerfile: Dockerfile.server
        image: config-server:latest
        expose:
            - 8888
        networks:
            - spring-cloud-network
        volumes:
            - spring-cloud-config-repo:/var/lib/spring-cloud/config-repo
        logging:
            driver: json-file
    config-client:
        container_name: config-client
        build:
            context: .
            dockerfile: Dockerfile.client
        image: config-client:latest
        entrypoint: /opt/spring-cloud/bin/config-client-entrypoint.sh
        environment:
            SPRING_APPLICATION_JSON: \
              '{"spring": {"cloud":  \
              {"config": {"uri": "http://config-server:8888"}}}}'
        expose:
            - 8080
        ports:
            - 8080:8080
        networks:
            - spring-cloud-network
        links:
            - config-server:config-server
        depends_on:
            - config-server
        logging:
            driver: json-file
networks:
    spring-cloud-network:
        driver: bridge
volumes:
    spring-cloud-config-repo:
        external: true
  • version:使用するフォーマットバージョンを指定します。 これは必須フィールドです。 ここでは新しいバージョンを使用していますが、legacy formatは「1」です

  • services:このキーの各オブジェクトは、service、別名コンテナを定義します。 このセクションは必須です

    • build:指定された場合、docker-composeDockerfileからイメージを構築できます

      • context:指定されている場合、Dockerfileがルックアップされるビルドディレクトリを指定します

      • dockerfile:指定されている場合、Dockerfileの代替名を設定します

    • image:ビルド機能が使用されているときにイメージに付ける名前をDockerに指示します。 それ以外の場合は、ライブラリまたはremote-registryでこの画像を検索しています

    • networks:これは使用する名前付きネットワークの識別子です。 特定のname-valueは、networksセクションにリストされている必要があります

    • volumes:これは、使用する名前付きボリュームと、ボリュームをマウントするマウントポイントをコロンで区切って識別します。 同様に、networksセクションでは、volume-nameを別のvolumesセクションで定義する必要があります

    • links:これにより、thisサービスとリストされたサービスの間に内部ネットワークリンクが作成されます。 Thisサービスは、リストされたサービスに接続できます。これにより、コロンの前の部分はservicesセクションのservice-nameを指定し、コロンの後の部分はサービスのホスト名を指定します。公開されたポートでリッスンしています

    • depends_on:これは、リストされたサービスが正常に開始された場合にのみ、サービスを開始するようにDockerに指示します。 NOTICE:これはコンテナレベルでのみ機能します! 依存するapplicationを最初に開始する回避策については、config-client-entrypoint.shを参照してください。

    • logging:ここでは、デフォルトの‘json-file'ドライバーを使用しています。 または、特定のアドレスオプションを持つ‘syslog'または‘none'を使用できます。

  • networks:このセクションでは、サービスで使用できるnetworksを指定しています。.この例では、docker-composeにタイプ%(の名前付きnetworkを作成させます。 t5)s私たちのために。 オプションexternaltrueに設定されている場合、指定された名前の既存のオプションが使用されます

  • volumes:これはnetworksセクションと非常によく似ています

続行する前に、構文エラーがないかビルドファイルを確認します。

$> docker-compose config

これは、config-clientイメージを構築するためのDockerfile.clientになります。 Dockerfile.serverとは異なり、OpenBSD netcat(次のステップで必要)を追加でインストールし、entrypointを実行可能にします。

FROM alpine-java:base
MAINTAINER example.com
RUN apk --no-cache add netcat-openbsd
COPY files/config-client.jar /opt/spring-cloud/lib/
COPY files/config-client-entrypoint.sh /opt/spring-cloud/bin/
RUN chmod 755 /opt/spring-cloud/bin/config-client-entrypoint.sh

そして、これはconfig-client service用にカスタマイズされたentrypointになります。 ここでは、ループ内でnetcatを使用して、config-serverの準備ができているかどうかを確認します。 IPアドレスの代わりにlink-name,config-serverに到達できることに注意する必要があります。

#!/bin/sh
while ! nc -z config-server 8888 ; do
    echo "Waiting for upcoming Config Server"
    sleep 2
done
java -jar /opt/spring-cloud/lib/config-client.jar

最後に、イメージを構築し、定義済みのコンテナを作成して、1つのコマンドで開始できます。

$> docker-compose up --build

コンテナを停止し、Dockerから削除し、接続されているnetworksvolumesを削除するには、反対のコマンドを使用できます。

$> docker-compose down

docker-composeの優れた機能は、ability to scale servicesです。 たとえば、Dockerに、config-serverに対して1つのコンテナーを実行し、config-clientに対して3つのコンテナーを実行するように指示できます。

ただし、これを正しく機能させるには、docker-compose.ymlからcontainer_nameを削除して、Dockerに選択させる必要があります。また、衝突を回避するために、exposed port configurationを変更する必要があります。 。

その後、次のようにサービスを拡張できます。

$> docker-compose build
$> docker-compose up -d
$> docker-compose scale config-server=1 config-client=3

5. 結論

これまで見てきたように、カスタムDockerイメージを構築し、Spring Boot ApplicationDockerコンテナーとして実行し、docker-composeで依存コンテナーを作成できるようになりました。

ビルドファイルの詳細については、公式のDockerfile referencedocker-compose.yml referenceを参照してください。

いつものように、このチュートリアルのソースコードはon Githubにあります。