概要
Spring Boot での Java 開発環境を Docker で構築します。
Java 11 と gradle を使います。
Hello World! を表示させるところまで。
(更新 : リモートデバッグの方法を追記)
完成品
実行方法
$ cd docker
$ docker-compose up -d
環境
MacOS Catalina 10.15.2
Docker for Mac 2.1.0.5
IntelliJ IDEA Ultimate 2019.3.1
OpenJDK 11(homebrew でインストール済み)
ローカルでの手順
プロジェクトの作成
IntelliJ がない場合
https://start.spring.io/
こちらで同様の選択をして Generate すると zip でダウンロードされるので、それを使います。
IntelliJ がある場合
※ 最近の IntelliJ から spring initializer 使う場合は src 以下ディレクトリが自動作成されないので
IntelliJ を持っていても、上記 zip ダウンロードして読み込むほうがいいのかも…
何か問題があるらしく、オプションを消したらしい。
- IntelliJ で Create New Project
Hello World の作成
src/main/java/com.mika.app 配下にある Application.java を修正
※ initializer で指定したプロジェクト名によってファイル名は異なります。
package com.mika.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class Application {
@RequestMapping("/")
String Index() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
この段階で IntelliJ で実行してみる → たぶん失敗します。
public class Application { の横にある実行ボタンを押す。
dependencies に色々入れすぎて無駄に動いているので、コメントアウトが必要です。
build.gradle の一部をコメントアウト
dependencies {
// implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// implementation 'org.springframework.boot:spring-boot-starter-security'
// implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// runtimeOnly 'mysql:mysql-connector-java'
// annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
testImplementation 'org.springframework.security:spring-security-test'
}
これで再度実行
http://localhost:8080 を表示して Hello World が表示されているのを確認。
確認したら停止ボタンで止める。
Dockerfile, docker-compose.yml の作成
docker ディレクトリを作成し、その配下に Dockerfile, docker-compose.yml を作成
docker-compose を使う理由は、今後ここに MySQL や nginx なども建てる予定のため。
FROM openjdk:11
ENV APP_ROOT /app
COPY . $APP_ROOT
WORKDIR $APP_ROOT
ENTRYPOINT ["sh", "./gradlew", "bootRun"]
version: '3'
services:
web:
build:
# Dockerfile の app のコピーのために必要なパス指定
context: ../
# context のパスから見た Dockerfile の場所
dockerfile: docker/Dockerfile
volumes:
# :より左の部分は自分の環境に合わせる
- ~/Dev/java/spring-boot:/app
ports:
- "8080:8080"
Docker 環境の起動
$ cd docker
$ docker-compose up
起動されることを確認し、再度 http://localhost:8080 が表示されることを確認。
HotDeploy
spring-boot-devtools を利用しているので、HotDeploy が適用されています。
Application.java の Hello World の文字を変えてみると
数秒後に Java が再起動されるのが確認できます(docker-compose up のログから)
ブラウザをリロードすると変更した文字になっているのを確認できます。
(更新)IntelliJ で HotDeploy が効いてなかったので設定を追加
Build, Execution, Deployment の Compiler で Build project automatically にチェック
Advanced Settings の Compiler で Allow auto-make to start even if developed application is currently running にチェック
IntelliJ でリモートデバッグ
IntelliJ の設定
開発する上でブレークポイントとか置いて止めたいので、リモートデバッグの設定をします。
まずは IntelliJ のメニューから Run → Edit Configurations... を開き
左上の + ボタンから Remote を選択します。
以下のような設定のまま OK を押して閉じます。
※ ここの Command line arguments for remote JVM にかかれているコマンドを
build.gradle に追記するのでコピーしておきます。
build.gradle に以下を追記
bootRun {
// for remote debug
jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
}
docker-compose.yml の修正
リモートデバッグで 5005 ポートを利用するので、それを記載。
ports:
- "8080:8080"
# for remote debug
- "5005:5005"
docker 起動
再度 docker-comose up して、待ち受ける状態になっていることを確認する。
web_1 | > Task :bootRun
web_1 | Listening for transport dt_socket at address: 5005
IntelliJ でさきほど設定した remote-debug
でデバッグを起動しておく
Application.java の Hello World にブレークポイントを置いて
http://localhost:8080 にアクセスすると、その位置で止まることが確認できる。
おわりに
とりあえずかんたんに構築する方法をまとめました。