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
Java × distroless で 軽量なコンテナイメージを / Java on Dist...
Search
Daisuke Garaike
May 29, 2026
Programming
780
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
https://jjugccc2026s.sessionize.com/session/1172902
Daisuke Garaike
May 29, 2026
More Decks by Daisuke Garaike
See All by Daisuke Garaike
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
440
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
930
立川で超かぐや姫!について話したい / Talking Cosmic Princess Kaguya! in Tachikawa
contour_gara
1
490
AR グラス + ミニ PC で実現する新しいモバイル環境
contour_gara
0
410
TDD 実践ミニトーク
contour_gara
1
440
Spring Boot と AWS S3 を使ったアプリケーションのテスト
contour_gara
0
170
ノート PC に Linux 入れてみたけど結構良かった
contour_gara
0
3.7k
JUnit5 から Kotest へ
contour_gara
0
220
社外での学びを社内に還元したい
contour_gara
1
610
Other Decks in Programming
See All in Programming
APNsからLive Activityを開始する話
yumnumm
0
160
The Rails Doctrine Decade
koic
2
560
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
620
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
490
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
1
2.3k
速習iPhone Duo対応
yuukiw00w
2
980
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
130
AWSに止められる覚悟してますか?
morizo_1984
2
530
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
960
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
34
16k
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
350
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
370
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
470
Bash Introduction
62gerente
615
220k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
570
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
Designing Experiences People Love
moore
143
24k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
720
How to make the Groovebox
asonas
2
2.5k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
940
How to Ace a Technical Interview
jacobian
280
24k
Transcript
Java × distroless で 軽量なコンテナイメージを 2026-05-30 JJUG CCC 2026 Spring
Daisuke Garaike
プロポーザルの変更点 • Java のバージョンを変更 ◦ 21 -> 25 2
Daisuke Garaike • Product Engineer ◦ ハンディ株式会社 ◦ Backend ▪
Kotlin, Java • サーバーサイド Kotlin, アジャイル, 自動テスト, プロダクト開発 3
アジェンダ 1. Distroless を使う モチベーション 2. Java アプリを Distroless で
動かす 3. コンテナイメージのサイズと 起動速度の比較 4. Java アプリを Distroless で 動かす際にやってほしいこと 4
Distroless を使うモチベーション 5
なぜコンテナアプリケーション • The Twelve-Factor App ◦ アプリを環境から切り離す ◦ アプリを入れ替え可能に •
ローカルでもクラウドでも 同じものが動く 6
JVM のイメージは重い • docker イメージのサイズ ◦ amazoncorretto: 132.64 MB ◦
eclipse-temurin: 143.42 MB ◦ 参考: ▪ debian: 47.03 MB • これらにアプリケーションが載る • 環境構築時に待たされる • 新規開発時に待たされる • Write Once, Run Anywhere と被っているから? 7
軽量イメージを使って問題解決 • debian-slim: 28.4 MB • Alpine Linux: 3.69 MB
• Distroless: 10.99 MB ◦ Google 管理 ◦ シェルがないため攻撃に強い ◦ Java で Distroless を使っている話を あまり聞かないので今回のテーマに 8
Java アプリを Distroless で動かす 9
サンプルアプリについて • Kotlin, Gradle, Java25, Spring Boot 4.0.6 • ルートエンドポイントに
GET すると "Hello World!" が返る 10
corretto # syntax=docker/dockerfile:1 FROM amazoncorretto:25.0.3-al2023 WORKDIR /deployments ARG JAR_FILE=build/libs/app.jar COPY
${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "app.jar"] 11
Distroless # syntax=docker/dockerfile:1 FROM gcr.io/distroless/java25-debian13:nonroot WORKDIR /deployments ARG JAR_FILE=build/libs/app.jar COPY
--chown=nonroot:nonroot ${JAR_FILE} app.jar CMD ["app.jar"] 12 • JVM は Temurin • Entrypoint に `java -jar` が 指定されている
Distroless x カスタム JRE # syntax=docker/dockerfile:1 FROM amazoncorretto:25.0.3-al2023 AS build
WORKDIR /jlink RUN jlink \ --verbose \ --compress=2 \ --strip-java-debug-attributes \ --no-header-files \ --no-man-pages \ --add-modules [依存モジュール] \ --output jre-min 13 • アプリ実行に必要なモジュール のみを集めた JRE • Spring Boot アプリの 依存モジュールの調べ方は 割愛 FROM gcr.io/distroless/java-base-debian13:nonroot WORKDIR /deployments COPY --from=build --chown=nonroot:nonroot /jlink/jre-min /opt/jre-min ENV JAVA_HOME=/opt/jre-min ENV PATH=$JAVA_HOME/bin:$PATH ARG JAR_FILE=build/libs/app.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "app.jar"]
Buildpacks x Distroless x カスタム JRE plugins { alias(libs.plugins.spring.boot) }
tasks.bootBuildImage { runImage = "gcr.io/distroless/java-base-debian13:nonroot" imageName = "distroless-jvm-examples-distroless-custom-jre-buildpack" environment = mapOf( "BP_JVM_JLINK_ENABLED" to "true", "BP_JVM_JLINK_ARGS" to "--add-modules [依存モジュール]", ) } 14 [versions] spring-boot = "4.0.6" [plugins] spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" }
コンテナイメージのサイズと 起動速度の比較 15
サイズの比較 16 イメージ 圧縮後サイズ corretto 265.43 MB distroless 94.62 MB
distroless-custom-jre 72.79 MB distroless-custom-jre-buildpack 87.92 MB
コンテナ実行環境での起動時間の比較 • コンテナ起動時間とイメージサイズ ◦ pull 時間 + アプリ起動時間 = コンテナ起動時間
• 実験手法 ◦ ECR + ECS Express ◦ デプロイ方式: カナリアデプロイ ▪ ベイク時間: 合計 6 分 ◦ 102 回再起動 17 引用: DevelopersIO, Classmethod, ECS Express Mode でデプロイにかかる時間を可能な限り短縮する, https://dev.classmethod.jp/articles/ecs-experss-reduce-deployment-time/
コンテナ実行環境での起動時間の比較 • 結果 18 秒 corretto Distroless Buildpacks x Distroless
x カスタム JRE Distroless x カスタム JRE • Dockerfile 形式同士: 軽量なほど起動時間が速い • サイズだけが起動時間に影響している訳ではない
Java アプリを Distroless で 動かす際にやってほしいこと 19
ローカルから docker で起動しておく • ローカルでもクラウドでも同じものを実行する ◦ The Twelve Factor App
• compose.yaml ◦ アプリ起動に必要な環境変数もまとめられる • 起動方法 ◦ Jar ファイルのビルド: gradle build ◦ コンテナ実行: docker compose up --build 20
コンテナレベルのブラックボックステスト • アプリの異常だけでなく コンテナの異常を検知できる • プラグインで自動化 ◦ テスト実行前: compose up
◦ テスト実行後: compose down 21 [versions] docker-compose = "0.17.21" [plugins] docker-compose = { id = "com.avast.gradle.docker-compose", version.ref = "docker-compose" } plugins { alias(libs.plugins.docker.compose) } dockerCompose { useComposeFiles = listOf("../compose.yaml") } tasks.test { useJUnitPlatform() mustRunAfter("composeUp") } tasks.composeDown { mustRunAfter("test") } tasks.register("integrationTest") { dependsOn("composeUp") dependsOn("test") dependsOn("composeDown") }
リモートデバッグ • ローカルでコンテナを実行してもデバッグが可能 • JRE に jdk.jdwp.agent を追加 • 5005
ポートの解放 • 環境変数 JAVA_TOOL_OPTIONS 22 services: distroless-custom-jre: build: context: ./app dockerfile: Dockerfile_distroless_custom_jre ports: - "8083:8080" - "5005:5005" environment: JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
docker compose のヘルスチェックが難しい • Dockerfile や compose.yaml のヘルスチェックは コンテナ内でコマンドを実行する •
curl がないためヘルスチェックができない • クラウドの場合は問題ないことが多いので 気にしていない 23
まとめ 24
まとめ • イメージサイズの軽量化は、これらの時間短縮につながる ◦ ローカル環境での初回 pull ◦ コンテナレジストリへの初回 push ◦
コンテナ実行環境での起動時間 • コンテナ起動時間の短縮は、 サイズだけではなくコンテナ構造も影響する • コンテナイメージを工夫する場合、 常にコンテナでアプリを起動するようにする 25
アンケートの回答お願いします 全体アンケート 26 セッション アンケート