fbpx

CL LAB

HOME > CL LAB > 2017年Dockerブログ記事トップ5 (第4位): Dockerを用いたSpring Bootの開発 #docker

2017年Dockerブログ記事トップ5 (第4位): Dockerを用いたSpring Bootの開発 #docker

 ★ 1

本稿は Top 5 blogs of 2017: Spring Boot Development with Docker (2017/12/28) の和訳です。

2017年のDockerブログ記事トップ5をご紹介します。今回は第4位にランクインした、マルチパートチュートリアルシリーズの1つ、Dockerを使用したSpring Boot開発についての記事をご紹介します。

AtSea Shopは、異なるOS上にデプロイでき、なおかつエンタープライズ開発と運用環境の両者向けにカスタマイズできる、店頭アプリケーションの例です。私の前回の記事では、このアプリケーションのアーキテクチャについて述べました。今回は、コンテナ内で実行されるJava RESTのバックエンドをデバッグするために、どのように開発環境を設定すればよいかについてお話しします。

RESTアプリケーションを構築する

Spring Bootフレームワークを使用しRESTのバックエンドを迅速に開発しました。これはAtSea Shopにおいて製品、顧客、注文などのテーブルを管理するものです。このアプリケーションはSpring Boot内蔵のアプリケーションサーバーなので、RESTのインターフェースをサポートしており、複数のデータソースを定義できます。またJavaで書かれているので、一般的なOSに対して汎用性があり、WindowsもしくはLinuxコンテナのどちらでも運用が可能です。これにより開発者は異なる種類のアーキテクチャに対しても構築ができます。

プロジェクトの設定

AtSeaプロジェクトでは、Dockerの新しい特長であるマルチステージビルドを使用します。これは、アプリケーションに必要なすべてのコンポーネントを含む1つのDockerイメージを構築するために、複数のイメージを使えるようにする機能です。マルチステージビルドは、アプリケーションのJarファイルを構築するためにMavenコンテナを使用します。ここで構築したJarファイルは、JDK (Java Development Kit) イメージに複製されます。Mavenはアプリケーションに含まれていないので、これによってよりコンパクトで効率のよいイメージが構築できます。同様にReact ストアフロントクライアントは Node イメージ内で構築され、コンパイルアプリケーションもまた、最終アプリケーションイメージに追加されます。

私はEclipseを使用してAtSeaアプリケーションを書きました。リモートデバッグのためにIntelliJまたはNetbeansの設定情報が必要な方は、Docker Labsリポジトリをご参照ください。コードについてはAtSeaアプリケーションgithubリポジトリも合わせてご参照ください。

私はこちらのリポジトリをクローンし、Rootディレクトリをプロジェクトに設定することで、プロジェクトをEclipseにインポートしました。そしてFinishをクリックします。

    File > Import > Maven > Existing Maven Projects 

Spring Bootを使用したので、リモートデバッグを実行するためにspring-devtoolsを活用しました。Spring Boot-devtools dependencyをpom.xmlファイルに追加する必要がありました。

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
</dependency>

開発者ツールは、アプリケーションがJarファイルとして完全にパッケージ化された際に、自動的に無効となる点に留意してください。開発中にdevtoolsが利用可能な状態にしておくために、spring-boot-mavenのビルドプラグインでfalseとなるよう、設定を行いました。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

この例は、開発とデバッグに特化したコンテナの、簡略化された構築を作成するDockerComposeファイルを使用します。

version: "3.1"
 
services
:
  database
:
    build
:
       context
: ./database
    image
: atsea_db
    environment
:
      POSTGRES_USER
: gordonuser
      POSTGRES_DB
: atsea
    ports
:
     - "5432:5432"
    networks
:
     - back-tier
    secrets
:
     - postgres_password
 
  appserver
:
    build
:
       context
: .
       dockerfile
: app/Dockerfile-dev
    image
: atsea_app
    ports
:
     - "8080:8080"
      - "5005:5005"
    networks
:
     - front-tier
      - back-tier
    secrets
:
     - postgres_password
 
secrets
:
  postgres_password
:
    file
: ./devsecrets/postgres_password
 
networks
:
  front-tier
:
  back-tier
:
  payment
:
    driver
: overlay

このComposeファイルはパスワードや証明書のような機微情報をプロビジョニングするために、環境変数に基かない、Docker Secret機能を使用します。この例ではPostgreSQLを使いますが、アプリケーションはSpring Bootのdatasourceとして定義されたいかなるデータベースにも、この機密情報を使って接続できます。JpaConfiguration.javaより:

public DataSourceProperties dataSourceProperties() {
        DataSourceProperties dataSourceProperties = new DataSourceProperties();
 
    // Set password to connect to database using Docker secrets.
    try(BufferedReader br = new BufferedReader(new FileReader("/run/secrets/postgres_password"))) {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();
        while (line != null) {
            sb.append(line);
            sb.append(System.lineSeparator());
            line = br.readLine();
        }
         dataSourceProperties.setDataPassword(sb.toString());
     } catch (IOException e) {
        System.err.println("Could not successfully load DB password file");
     }
    return dataSourceProperties;
}

またappserverはリモートデバッグのために5005番ポートを開くこともご留意ください。リモートデバッグがオンになったコンテナを構築するためのDockerfile-devファイルを呼び出す点においても同様です。デバッガのためにtransportとaddressをENTRYPOINT内で設定します。

ENTRYPOINT ["java",
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005","-jar",
"/app/AtSea-0.0.1-SNAPSHOT.jar"]

リモートデバッグ

アプリケーションでリモートデバッグを開始するためには、docker-compose-dev.yml fileを使用して、Docker Composeを実行してください。

docker-compose -f docker-compose-dev.yml up --build

Dockerはイメージを構築し、AtSea Shop データベースとappserverコンテナを起動します。しかしながら、このアプリケーションはEclipseのリモートデバッガをアプリケーションにアタッチするまで完全には読み込まれません。Run > Debug Configurations …をクリックすればリモートデバッグが開始します。

Remote Java Applicationを選択し、新しいボタンを押すと設定が作られます。Debug Configurationsパネル内で、設定に名前をつけてください。AtSeaプロジェクトを選択し、ホストと5005番ポートに接続プロパティを設定してください。Apply > Debugをクリックしてください。  

appserverが起動します。

appserver_1|2017-05-09 03:22:23.095 INFO 1 --- [main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
appserver_1|2017-05-09 03:22:23.118 INFO 1 --- [main] com.docker.atsea.AtSeaApp                : Started AtSeaApp in 38.923 seconds (JVM running for 109.984)

リモートデバッグをテストするには、製品リストが返されるProductController.java でブレークポイントを設定してください。

curlまたはHTTPリクエストを作成するお好みのツールを使ってテストを行えます。

curl -H "Content-Type: application/json" -X GET  http://localhost:8080/api/product/

Eclipseはコードに移行するとき、デバッグ視点に切り替わります。

今回のAtSea Shopの事例は、読者の方々にとっておそらくなじみ深い、通常の開発環境ツールの一部としてコンテナを使用することができ、いかに簡単であるかを示しています。このアプリケーションをダウンロードして、コンテナを使った開発をぜひお試しください。また独自のSpring Boot RESTアプリケーションの基盤として、こちらのアプリケーションをお使いください。

もっとお知りになりたい方は、次に挙げる開発者リソースとDockercon 2017の動画をご覧ください。

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post