スポンサーリンク

Docker デプロイ(CD/CI)

dockerでSpringBootを起動する

投稿日:2022年2月14日 更新日:

dockerでSpringBootを起動する流れ

まず、docker環境構築の流れを押さえておきましょう。

  1. Dockerfile作成(イメージ定義)
  2. イメージを作成(ビルド)
  3. コンテナを起動

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コマンドの箇所からやり直してください。

参考文献

https://spring.pleiades.io/guides/gs/spring-boot-docker/

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Docker, デプロイ(CD/CI)

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.