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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
340
自分から始めるアジャイルの道 ~内発的動機をきっかけに変わった価値観~
takaichi00
0
480
Java developer introduced to Rust-ADC2022
takaichi00
0
310
野球人・落合博満さんから学ぶ、アジャイルなマインドセット・プラクティス
takaichi00
1
930
【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
サービス内で複数のOP・ASを連鎖させる(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
260
AI開発に用いられるHPC技術について
gpuunite_official
0
280
Android skills に学ぶ
kokiko
0
180
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3.2k
AI駆動開発はどこまで来たのか? ファインディの最新実態調査で読み解く現在地 Devin Con Tokyo
akiratom
1
920
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
Windows の互換機能 - 古いプログラムはなぜ動作できるのか
murachiakira
PRO
0
100
RapidCopy2 Matrix I/Oエンジンによるファイルコピーソフトウェアの設計と実装
kengosawa2
1
410
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
970
internal/testlog で遊ぼう
rokuosan
0
220
Kiro入門|仕様駆動開発で変わるAI時代の開発スタイル
cmkudo
0
380
Microsoft MVP プログラムを紹介するから目指す人増えてくれ
tsubakimoto_s
0
110
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Mind Mapping
helmedeiros
PRO
1
330
Building Applications with DynamoDB
mza
96
7.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
400
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The agentic SEO stack - context over prompts
schlessera
0
880
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Building Adaptive Systems
keathley
44
3.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
Speed Design
sergeychernyshev
33
2k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
520
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
ご清聴ありがとうございました