[和訳] 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ファイルに追加する必要がありました。
org.springframework.boot
spring-boot-devtools
開発者ツールは、アプリケーションがJarファイルとして完全にパッケージ化された際に、自動的に無効となる点に留意してください。開発中にdevtoolsが利用可能な状態にしておくために、spring-boot-mavenのビルドプラグインでfalseとなるよう、設定を行いました。
org.springframework.boot
spring-boot-maven-plugin
false
この例は、開発とデバッグに特化したコンテナの、簡略化された構築を作成する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の動画をご覧ください。