Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【Kubernetes Novice Tokyo #2】コンテナで動作する Java アプリケ...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Takaichi00
June 30, 2020
Technology
620
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【Kubernetes Novice Tokyo #2】コンテナで動作する Java アプリケーションのイメージサイズを小さくする方法
Takaichi00
June 30, 2020
More Decks by Takaichi00
See All by Takaichi00
individual_or_organization
takaichi00
0
320
自分から始めるアジャイルの道 ~内発的動機をきっかけに変わった価値観~
takaichi00
0
480
Java developer introduced to Rust-ADC2022
takaichi00
0
310
野球人・落合博満さんから学ぶ、アジャイルなマインドセット・プラクティス
takaichi00
1
920
【CICD2021】デプロイメントパイプラインの原理原則を再確認する / Confirm Deployment Pipeline Principle
takaichi00
11
4.7k
【JTF2021】SonarQube をより有効活用する / Effective SonarQube
takaichi00
1
2.7k
JJUG CCC 2021 Spring-Resolving OOME with JFR
takaichi00
2
3.8k
【Yahoo! JAPAN Agile 2nd】野球人・落合博満さんから学ぶスクラムマスター / デベロッパー
takaichi00
0
2.8k
【Developers Boost 2020】凡人エンジニアの生存戦略
takaichi00
1
3.3k
Other Decks in Technology
See All in Technology
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1.3k
AIは実装を速くする。では、私たちは何を今作るべきか?-立場を越えてリリースに向き合ったチーム開発の実践 / 20260801 Hiromi Nakaya and Naoki Takahashi
shift_evolve
PRO
3
370
Webアクセシビリティ入門 2026
recruitengineers
PRO
1
260
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
SnowflakeCoCoでデータエンジニアリング!
foursue
0
170
【CEDEC2026】『Relink』を拡張せよ - 『GRANBLUE FANTASY: Relink - Endless Ragnarok』の開発速度と品質を守るCI運用
cygames
PRO
0
120
AIエージェントの知識表現と推論に なぜグラフが使われるのか - 記号的AIの復権とニューラルAIとの統合
yohei1126
1
280
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
0
270
QAタスクをスキル化したいときに考えること
aomoriringo
0
180
モダンフロントエンド 開発研修
recruitengineers
PRO
1
300
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
190
AI時代の強いチームの作り方
yuukiyo
23
15k
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Fireside Chat
paigeccino
42
4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Paper Plane
katiecoart
PRO
2
52k
Leo the Paperboy
mayatellez
8
2.1k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
790
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
820
Building Applications with DynamoDB
mza
96
7.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
WCS-LA-2024
lcolladotor
0
790
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Transcript
コンテナで動作する Java アプリケーションのイ メージサイズを小さくする方法 髙市 智章 (Tomoaki Takaichi) Jun, 30,
2020 Kubernetes Novice Tokyo #2 #k8snovice
自己紹介 @Takaichi00 tomoaki.takaichi.5 ・髙市 智章(タカイチ トモアキ) ・Java / Node でのシステム開発
・CI / CD ・Container / k8s ・アジャイル開発実践 共著: クリーンなコードへの SonarQube即効活用術 http://u0u0.net/RSvx
❏ コンテナで動作する SpringBoot の Docker イメージを小さ くさせたい場合、以下のことを実施する ❏ Alpine Linux
ベースのイメージを利用する ❏ Custom Runtime とマルチステージビルドを利用する 要約 AdoptOpenJDK AdoptOpenJDK-Alpine Custom Runtime 436 MB 358 MB 85.5 MB
❏ The Twelve-Factor App の IX. 廃棄容易性 では、プロセ スは素早く起動/終了ができることが求められている ❏
コンテナ実行時、k8s のノード上に使用する Docker イ メージがない場合は、外部からイメージをダウンロードす る必要がある ❏ Docker イメージを小さくすることは、素早いスケールと デプロイを可能にするためにも重要な要素の一つ なぜ Docker のイメージサイズを小さくするか
❏ SpringBoot で Hello World を返す REST API を用意 ❏
公式の AdoptOpenJDK が提供する Docker イメージ上で起 動する SpringBoot をコンテナで動作させる
❏ 公式が提供する Ubuntu ベースの AdoptOpenJDK Docker イメージ を利用して build すると
Docker のイメージサイズ は 436MB になった (※ SpringBoot の jar ファイルは 16.5MB) SpringBoot をコンテナで動作させる $ docker build -t demo-official-openjdk:latest .
❏ 公式の AdoptOpenJDK は Alpine Linux 上で Java が実 行できる
Docker イメージも提供している ❏ Alpine Linux ベースの Docker イメージを利用するだけ でもコンテナサイズは 358 MB まで小さくすることができ た (※ SpringBoot の jar ファイルは 16.5MB) Alpine Linux ベースのイメージを利用する $ docker build -t demo-official-openjdk-alpine:latest .
❏ Java9 から追加されたモジュールシステムを利用すること で、ある jar を起動するのに必要最低限な Java の実行環 境 (Custom
Runtime) を構築できる ❏ 公式が提供する AdoptOpenJDK の代わりに、作成した必 要最低限な Java の実行環境 (Custom Runtime)を利用す ることで容量を削減することができる Custom Runtime を作成する AdoptOpenJDK SpringBoot jar Custom Runtime SpringBoot jar >
Custom Runtime を作成する ❏ jdeps コマンドで SpringBoot の起動に必要な依存モ ジュールを調べる ※
jdeps コマンドは jar に含まれる jar を再帰的に解析はしないため、 SpringBoot を解析する場合は実行可 能 jar を展開して手動で解析する必要 がある (今回の発表のは本質ではない ため詳しくは以下を参照) SpringBootのdockerイメージを必要最小限に絞りたい (2019年9月版) https://www.m3tech.blog/entry/2019/09/13/110000 get-springboot-module.sh
Custom Runtime を作成する ❏ jdeps コマンドで SpringBoot の起動に必要な依存モ ジュールを調べる 実行結果
実行コマンド (前ページの ShellScript を実行) java.base,java.desktop,java.instrument,java.management.rmi,java.namin g,java.prefs,java.scripting,java.security.jgss,java.sql,jdk.httpserver,jdk. unsupported ./get-springboot-module.sh demo-0.0.1-SNAPSHOT.jar 11
❏ jlink コマンドで必要なモジュールだけを含んだ Java の実 行環境 (Custom Runtime) を作成する Custom
Runtime を作成する jlink --strip-debug --no-header-files --no-man-pages --compress=2 --module-path $JAVA_HOME \ --add-modules java.base,java.desktop,java.instrument,java.management.rmi,java.naming,java.prefs,java.scri pting,java.security.jgss,java.sql,jdk.httpserver,jdk.unsupported \ --output jre-min 実行コマンド
❏ マルチステージビルドを利用すれば、あるステージの生成 物を別のステージにコピーすることができる ❏ Custom Runtime を作成するステージと、作成した Custom Runtime 上で
SpringBoot を起動するステージ に分ける マルチステージビルドを利用して Custom Runtime 上で SpringBoot を起動する Custom Runtime Custom Runtime SpringBoot jar COPY adoptopenjdk/openjdk11:alpine as java-builder alpine:3.12.0 jlink create
❏ Dockerfile の構成は次の通り マルチステージビルドを利用して Custom Runtime 上で SpringBoot を起動する 1.
Custom Runtime を生成するステージ 2. 生成した Custom Runtime を使って SpringBoot を起動するステージ ~ 中略 (Alpine Linux 上で Java を起動するために必要な設定) ~ Custom Runtime の作成 前のステージで作成した Custom Runtime をコピー
❏ 最初のステージで Custom Runtime を作成し、それを次 のステージにコピーすることで Custom Runtime 上で SpringBoot
が起動する Docker イメージを作成できる ❏ このように build した Docker イメージは、85.5MB とサ イズが削減されていることがわかる マルチステージビルドを利用して Custom Runtime 上で SpringBoot を起動する $ docker build -t demo-custom-runtime:latest . AdoptOpenJDK AdoptOpenJDK-Alpine Custom Runtime 436 MB 358 MB 85.5 MB
❏ コンテナで動作する SpringBoot の Docker イメージを小 さくする場合、以下のことを実施する ❏ Alpine Linux
ベースのイメージを利用する ❏ Custom Runtime とマルチステージビルドを利用する まとめ AdoptOpenJDK AdoptOpenJDK-Alpine Custom Runtime 436 MB 358 MB 85.5 MB
参考資料 ❏ Spring Boot の Docker Image を小さくする方法 ❏ https://qiita.com/Takaichi00/items/517132e01c844d426c09
❏ サンプルコード (Github) ❏ https://github.com/Takaichi00/java-container-build-sample
ご清聴ありがとうございました