Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【Kubernetes Novice Tokyo #2】コンテナで動作する Java アプリケ...
Search
Takaichi00
June 30, 2020
Technology
630
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
360
自分から始めるアジャイルの道 ~内発的動機をきっかけに変わった価値観~
takaichi00
0
510
Java developer introduced to Rust-ADC2022
takaichi00
0
320
野球人・落合博満さんから学ぶ、アジャイルなマインドセット・プラクティス
takaichi00
1
930
【CICD2021】デプロイメントパイプラインの原理原則を再確認する / Confirm Deployment Pipeline Principle
takaichi00
11
4.8k
【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.4k
Other Decks in Technology
See All in Technology
[2026-09-30]ロックンロールは鳴り止まないっ - 信頼性かまってちゃん - 「データ駆動を投げ捨ててまで。」追いかける信頼性改善に向けた取り組みの話
tosite
0
200
サーバーフルコンピューティング?AWS Lambda
iwatatomoya
1
240
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
280
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
550
メルペイ 会計システム概要と歴史
mewuto
0
150
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
780
ミイダス株式会社 テックチームのご紹介 / MIIDAS Tech Team
miidas
0
150
FinTech 1-2 : Overview of FinTech
ks91
PRO
0
150
自主式軟體工廠
philipz
0
220
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.4k
ファミコンでPHPを動かす / PHP on the Famicom side b
tomzoh
0
130
freeeらしさをAIとともに作る / Creating the freee Experience with AI
ymrl
0
200
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Optimising Largest Contentful Paint
csswizardry
37
4k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Writing Fast Ruby
sferik
630
63k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
エンジニアに許された特別な時間の終わり
watany
109
250k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Chasing Engaging Ingredients in Design
codingconduct
0
340
First, design no harm
axbom
PRO
2
1.3k
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
ご清聴ありがとうございました