Docker を使用したスプリングブート開発

AtSea Shop は、さまざまなオペレーティング システムにデプロイでき、エンタープライズ開発環境と運用環境の両方に合わせてカスタマイズできるストアフロント アプリケーションの例です。前回の投稿では、アプリのアーキテクチャについて説明しました。 この投稿では、 コンテナで実行されるJava RESTバックエンドをデバッグするように開発環境を設定する方法について説明します。

REST アプリケーションの構築

私はSpring Bootフレームワークを使用して、AtSeaショップで使用される製品、顧客、注文テーブルを管理するRESTバックエンドを迅速に開発しました。 このアプリケーションは、Spring Bootの組み込みアプリケーションサーバー、RESTインターフェイスのサポート、および複数のデータソースを定義する機能を利用します。 Java で記述されているため、基本オペレーティング システムに依存せず、 Windows コンテナーまたは Linux コンテナーで実行されます。これにより、開発者は異種アーキテクチャに対してビルドできます。

プロジェクトのセットアップ

AtSeaプロジェクトでは、新しいDocker機能であるマルチステージビルドを使用しているため、複数のイメージを使用して、アプリケーションに必要なすべてのコンポーネントを含む単一のDockerイメージをビルドできます。マルチステージ・ビルドでは、Maven コンテナーを使用してアプリケーション jar ファイルをビルドします。その後、jar ファイルが Java 開発キット・イメージにコピーされます。これにより、Maven がアプリケーションに含まれていないため、よりコンパクトで効率的なイメージが得られます。同様に、React ストアフロントクライアントは Node イメージに組み込まれ、コンパイルアプリケーションも最終的なアプリケーションイメージに追加されます。

私はAtSeaアプリケーションを書くためにEclipseを使いました。 リモートデバッグ用に IntelliJ または Netbeans を構成する方法については、 Docker Labs リポジトリを参照してください。AtSeaアプリのgithubリポジトリでコードをチェックアウトすることもできます。

リポジトリをクローンしてアプリケーションをビルドし 、ルートディレクトリをプロジェクトに設定して[完了]をクリックしてプロジェクトをEclipseにインポートしました

    ファイル>インポート Maven >既存の Maven プロジェクト> 

私はSpring Bootを使用していたので、spring-devtoolsを利用してアプリケーションでリモートデバッグを行いました。 私は春のブート開発ツールの依存関係をpom.xmlファイルに追加する必要がありました。

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

開発者ツールは、アプリケーションが jar として完全にパッケージ化されると自動的に無効になることに注意してください。 開発中に開発ツールを確実に利用できるようにするために、 <excludeDevtools> スプリングブートメイヴンビルドプラグインで 構成をfalseに設定しました。

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

この例では、開発とデバッグに特に必要なコンテナーの簡略化されたビルドを作成する Docker C ompose ファイルを使用します。

 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 ファイルは、環境変数に依存することなく、シークレットを使用してパスワードや証明書などの他の機密情報をプロビジョニングします  。この例では PostgreSQL を使用していますが、アプリケーションはシークレットを使用して、Spring Boot データソースとして定義された任意のデータベースに接続できます。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;
}

また、アプリケーション サーバーがリモート デバッグ用にポート 5005 を開き、ビルドによって Dockerfile-dev ファイルが呼び出され、リモート デバッグが有効になっているコンテナーがビルドされることにも注意してください。 これは、デバッガーのトランスポートとアドレスを指定するエントリポイントで設定されます。

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 ファイルを使用して作成を実行します。

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

Dockerはイメージをビルドし、AtSeaショップデータベースとアプリケーションサーバーコンテナを起動します。ただし、Eclipse のリモート・デバッガーがアプリケーションにアタッチされるまで、アプリケーションは完全にはロードされません。 リモートデバッグを開始するには、[ 実行]をクリックします>デバッグ構成...

[リモート Java アプリケーション] を選択し、[新規] ボタンを押して構成を作成します。 「デバッグ構成」パネルで、構成に名前を付け、AtSea プロジェクトを選択して、host とポートの接続プロパティーを 5005 に設定します。 [デバッグ>適用] をクリックします。 

9D6C9743 E348 4C76 8515 1743162101AD

アプリケーションサーバーが起動します。

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)

リモート デバッグをテストするには.java製品の一覧を返す ProductController にブレークポイントを設定します。

B0e7f813 c3de 4d1e b52d af6d4821c58e 1

curlまたはHTTPリクエストを行うためのお好みのツールを使用してテストできます。

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

Eclipse はデバッグ・パースペクティブに切り替わり、そこでコードをステップスルーできます。

E7edc918 c6b0 44e2 b6c9 7ef71cd223d6 1

AtSea Shop の例は、ユーザーとあなたのチームが使い慣れているツールを使用して、通常の開発環境の一部としてコンテナーを使用することがいかに簡単かを示しています。 アプリケーションをダウンロードして、コンテナーを使用した開発を試すか、独自の Spring Boot REST アプリケーションの基礎として使用します。

もっと興味がありますか? Dockercon 2017 の開発者向けリソースとビデオをご覧ください。