Contents
dockerでSpringBootを起動する流れ
まず、docker環境構築の流れを押さえておきましょう。
- Dockerfile作成(イメージ定義)
- イメージを作成(ビルド)
- コンテナを起動
Dockerfile作成
SpringBootプロジェクトのルートディレクトリに、Dockerfileを作成します。
FROM openjdk:11
ARG JAR_FILE=target/*jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- 1行目...openjdkというdockerイメージを使用します。
- 2行目...dockerビルド時に、JAR_FILEというパラメータ名で.jarを受け取れるようにします。
- 3行目...ホストの.jarをコンテナにapp.jarとしてコピーします。
- 4行目...コンテナ起動時に"java -jar /app.jar"を実行します。
docker imageを作成(ビルド)
作成したDockerfileから、イメージを作成します。
$ docker build --build-arg JAR_FILE=build/libs/\*.jar -t sample-system .
[+] Building 2.3s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 36B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:11 2.2s
=> [auth] library/openjdk:pull token for registry-1.docker.io 0.0s
=> [1/2] FROM docker.io/library/openjdk:11@sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 196B 0.0s
=> CACHED [2/2] COPY build/libs/*.jar app.jar 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:a9c9ceae9583a9abad78c9516d7565f8ac810b912b999465b77d379c42b69661 0.0s
=> => naming to docker.io/library/sample-system 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sample-system latest a9c9ceae9583 34 hours ago 671MB
1行目...docker buildで、Dockerfileを元にイメージを作成します。
--build-arg JAR_FILE=build/libs/*.jar によって、イメージが実行するjarファイルを指定しています。
20行目...docker image lsで、イメージが作成されていることを確認してください。
docker desktopの場合は、この時点でImagesタブに作成したイメージが表示されています。
コンテナを起動
作成したイメージを元にdocker runコマンドでコンテナを起動します。
$ docker run -p 8081:8080 sample-system
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.3)
2022-02-14 12:25:58.609 INFO 1 --- [ main] c.s.o.OkozukaiSystemApplication : Starting OkozukaiSystemApplication using Java 11.0.14.1 on 217e4aa8adc7 with PID 1 (/app.jar started by root in /)
2022-02-14 12:25:58.610 INFO 1 --- [ main] c.s.o.OkozukaiSystemApplication : No active profile set, falling back to default profiles: default
2022-02-14 12:25:59.091 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-02-14 12:25:59.097 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-02-14 12:25:59.097 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-02-14 12:25:59.132 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-02-14 12:25:59.132 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 490 ms
2022-02-14 12:25:59.270 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2022-02-14 12:25:59.332 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-02-14 12:25:59.338 INFO 1 --- [ main] c.s.o.OkozukaiSystemApplication : Started OkozukaiSystemApplication in 0.991 seconds (JVM running for 1.192)
2022-02-14 12:26:16.434 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
1行目...8081:8080 はホストの8081ポートを、コンテナの8080ポートに接続するという意味です。
2行目以降でSpringBootが起動されており、8080ポートで起動しているのがわかります。
動作確認
docker runの時に指定したホストのポートを指定して、ブラウザからアクセスします。
自分の作成したアプリが表示されていればOKです。
SpringBootの変更を反映する
この記事で紹介している手順では、イメージにjarファイルが組み込まれています。
そのため、Gradle buildにより、ビルドし直し、/build/libs配下の.jarファイルを更新します。
$ ./gradlew build
その後、docker buildコマンドの箇所からやり直してください。