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

1概要

この記事では、Spring Bootアプリケーションを分離した環境で実行するためにSpring Bootアプリケーションをドッキングする方法について説明します。

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

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

2共通ベース画像

私たちは Docker自身のビルドファイルフォーマットを使うつもりです: Dockerfile__。

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

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

FROM alpine:edge
MAINTAINER baeldung.com
RUN apk add --no-cache openjdk8
COPY files/UnlimitedJCEPolicyJDK8/**  \
 /usr/lib/jvm/java-1.8-openjdk/jre/lib/security/----

**  **  FROM ** :キーワード__FROM__は、__Docker__に与えられた画像を使用するように指示します。

build-baseとしてのそのタグ。この画像がローカルライブラリにない場合は、
__https://hub.docker.com/explore/[DockerHub]__、または任意のオンライン検索
他の設定されたリモートレジストリが実行されます
**  **  MAINTAINER ** :__MAINTAINER__は通常、メールアドレスです。

画像の作者
**  **  RUN ** :__RUN__コマンドを使って、シェルコマンドラインを実行します。

ターゲットシステム内。ここでは__Alpine Linuxの__パッケージを利用しています
__Java 8 OpenJDK__をインストールするためのマネージャ__apk__
**  **  COPY ** :最後のコマンドは__Docker__にいくつかのファイルから__COPY__を指示します。

ローカルファイルシステム、特にbuildディレクトリのサブフォルダ、指定されたパスのイメージへ

** 要件:** チュートリアルを正しく実行するには、http://www.oracle.com/technetwork/java/javase/downloads/jce8-downloadから__Java Cryptography Extension(JCE)無制限強度管轄ポリシーファイル__をダウンロードする必要があります。 -2133166.html[__Oracle__]。

ダウンロードしたアーカイブを__filesという名前のローカルフォルダに解凍するだけです。

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

[source,bash,gutter:,true]

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

** 注意:**  __ tag__オプションはイメージに名前を付け、__ rm = true__は中間イメージが正常に作成された後に削除します。

このシェルコマンドの最後の文字はドットで、build-directory引数として機能します。

[[Dockerize]]

===  **  3スタンドアロンのSpring BootアプリケーションをDockerizeする**

ドッキングできるアプリケーションの例として、__https://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-config[spring-cloud-config/server]__を取りますリンクから:/spring-cloud-configuration[春のクラウド設定のチュートリアル]。準備ステップとして、実行可能なjarファイルを組み立てて__Docker__ビルドディレクトリにコピーする必要があります。

[source,bash,gutter:,true]

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__を作成します。

[source,text,gutter:,true]

FROM alpine-java:base MAINTAINER baeldung.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__
**  **  COPY ** :__Docker__にjarファイルを画像にコピーさせます。

**  **  ENV ** :このコマンドはいくつかの環境変数を定義します。

コンテナで実行されているアプリケーションによって尊重されます。ここで私たちは
カスタマイズを定義する
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html[__Spring
jar-executableに渡すために、Boot Application__ configuration]を起動します。
後
**  **  ENTRYPOINT ** /**  CMD ** :これは、起動時に実行可能ファイルになります。

コンテナは起動中です。これらを__JSON-Array__として定義する必要があります。
__ENTRYPOINT__を__CMD__と組み合わせて使用​​する人もいます
アプリケーション引数
**  **  VOLUME ** :私たちのコンテナは隔離された状態で実行されるためです

直接ネットワークにアクセスできない環境では、
設定リポジトリのmountpoint-placeholder
**  **  EXPOSE ** :ここで私たちは__Docker__と言います

リストです。コンテナが起動しているとき、このポートはホストに公開されます。

__Dockerfile__から画像を作成するには、以前と同じように__docker build__を実行する必要があります。

[source,bash,gutter:,true]

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

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

[source,bash,gutter:,true]

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

** 注:** コンテナーは不変ですが、アプリケーションの終了後にイメージにコミットされないと、ボリュームに保管されているデータは複数のコンテナーにわたって永続的になります。

最後に、イメージからコンテナを実行することができます。

[source,bash,gutter:,true]

$> docker run --name=config-server --publish=8888:8888 \ --volume=spring-cloud-config-repo:/var/lib/spring-cloud/config-repo \ config-server:latest

** まず、コンテナを**  __– name__ ** する必要があります。そうでなければ、1つになります

自動的に選ばれる
** そして、公開ポート(__Dockerfile__を参照)を__ ** に公開する必要があります

私たちのホスト上のポート。値は以下の形式で与えられます。
__「ホストポート:コンテナポート」__ container-portだけが指定されている場合、
ランダムに選択されたホストポートが使用されます。このオプションを省略すると、
コンテナは完全に隔離されます
**  __ **   -  volume **  __オプションを指定すると、ホスト上のディレクトリにアクセスできます。

(絶対パスとともに使用する場合)または以前に作成した__Docker__
volume(__volume-name__と一緒に使用した場合)コロンの後の道
コンテナ内のマウントポイントを指定します
** 引数として、使用する画像を__Docker__に指示する必要があります。ここで私たちは

以前の '__docker build__'ステップからの__image-name__を与えなければなりません
** もっと便利なオプション:

** **  **  -it **   - 対話モードを有効にして__pseudo-tty__を割り当てます

** **  **  -d **   - 起動後にコンテナから切り離す

コンテナをデタッチモードで実行した場合は、次のコマンドを使用して詳細を確認し、停止して削除できます。

[source,bash,gutter:,true]

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

[[Composite]]

===  **  4依存するアプリケーションをコンポジットにドッキングする**

__Docker__コマンドと__Dockerfiles__は、個々のコンテナを作成するのに特に適しています。しかし、孤立したアプリケーションのネットワークで操作したい場合、コンテナ管理はすぐに雑然とします。

** これを解決するために、__Docker__には__Docker Compose __という名前のツールが用意されています。たとえば、1つのコマンドでサービスの合成を開始または停止したり、複数のサービスのログ出力を1つの__pseudo-tty__にマージしたりできます。

異なるdockerコンテナで実行されている2つのアプリケーションの例を作成しましょう。それらは互いに通信し、ホストシステムに「単一のユニット」として提示されます。リンク:/spring-cloud-configuration[春のクラウド設定のチュートリアル]に記述されている__spring-cloud-config/client__の例をビルドして__files__フォルダーにコピーします。

これが私たちの__docker-compose.yml__になります。

[source,text,gutter:,true]

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__、a.k.aを定義します。

容器。このセクションは必須です
** **  **  build ** :与えられた場合、__docker-compose__はから画像を構築することができます

__Dockerfile__
** ** **  **  context ** :与えられているなら、それはbuild-directoryを指定します。

__Dockerfile__が検索されます
** ** **  **  dockerfile ** :与えられた場合、それは__Dockerfile__のための代替名を設定します

** **  **  image ** :__Docker__に、画像に付ける名前を指示します。

ビルド機能が使用されます。それ以外の場合は、この画像を
ライブラリまたは__remote-registry__
** **  **  networks ** :これは使用する名前付きネットワークの識別子です。 A

与えられた__name-value__は__networks__セクションにリストされなければなりません
** **  **  volumes ** :これは使用する名前付きボリュームと

コロンで区切って、ボリュームをマウントするマウントポイント。同様に
__networks__セクション、__ volume-name__は別の名前で定義する必要があります。
__volumes__セクション
** **  **  links ** :これは__this__間に内部ネットワークリンクを作成します。

サービスと記載されているサービス。 __このサービスは接続できるようになります
リストされたサービスに対して、コロンの前の部分は
__services__セクションからの__service-name__とコロンの後の部分
公開されたサービスでサービスが待機しているホスト名を指定します
港
** **  **  depends__on ** :これは__Docker__にサービスを開始するように指示します。

リストされたサービスは正常に開始されました。 ** 注意:** これは
コンテナレベル!依存関係__アプリケーション__を起動するための回避策
まず、__config-client-entrypoint.sh__を参照してください。
** **  **  logging ** :ここでは__json-fileドライバを使っています。

デフォルトのもの別の方法として、特定の住所オプションを指定した「syslog」または
使用できません
**  **  networks ** :このセクションでは、利用可能な__networks__を指定しています

この例では、__docker-compose__にaを作成させます。
タイプ「ブリッジ」の__network__という名前です。オプション__external__が
__true__に設定すると、指定された名前の既存のものを使用します。
**  ** ボリューム** :これは__networks__セクションとよく似ています

先に進む前に、ビルドファイルの構文エラーをチェックします。

[source,bash,gutter:,true]

$> docker-compose config

これが、__config-client__イメージを構築するための__Dockerfile.client__になります。これは__Dockerfile.server__とは異なり、__OpenBSD netcat__(次のステップで必要)を追加インストールして__entrypoint__を実行可能にします。

[source,text,gutter:,true]

FROM alpine-java:base MAINTAINER baeldung.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__になります。ここでは、__config-server__の準備ができているかどうかを確認するために、ループ内で__netcat__を使用します。 IPアドレスの代わりに__link-nameを使って__config-server__にアクセスできることに注意してください。

[source,bash,gutter:,true]

#!/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つのコマンドで起動します。

[source,bash,gutter:,true]

$> docker-compose up --build

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

[source,bash,gutter:,true]

$> docker-compose down

__docker-compose__の優れた機能は** サービスを拡張する能力** です。

たとえば、__Docker__に、__config-server__用に1つのコンテナ、__config-client__用に3つのコンテナを実行するように指示できます。

しかし、これが正しく動作するためには、__Docker__に1つを選択させるために__docker-compose.yml__から__container__name__を削除する必要があり、衝突を避けるために__exposed port configuration__を変更する必要があります。

その後、私たちは以下のようにサービスを拡張することができます。

[source,bash,gutter:,true]

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

[[Conclusion]]

===  **  5結論**

これまで見てきたように、__Docker__コンテナとして__Spring Boot Application__を実行し、__docker-compose__を使って依存型コンテナを作成することで、カスタムの__Docker__イメージを構築することができます。

build-filesについて詳しくは、公式の__https://docs.docker.com/engine/reference/builder/[Dockerfile reference]__および__https://docs.docker.com/compose/composeを参照してください。 -file/[docker-compose.yml参照]__。

いつものように、このチュートリアルのソースコードは__https://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-config/server[on Github]__にあります。