网站首页 > 教程文章 正文
几个月前,我在公司部署一个基于Spring Boot的Java项目,构建出来的Docker镜像居然达到了 1.5GB+!
CI/CD 构建流程一跑就是十几分钟,推送镜像甚至会因为带宽和服务器空间告警,导致构建失败。
一开始我以为是依赖多、项目大,后来深入分析才发现:
镜像大,不是项目的问题,而是你不会减肥!
于是我从实际项目中总结出3个镜像优化技巧,最终将镜像体积缩小了80%以上,让CI/CD构建提速了接近一倍。
第一招:用多阶段构建,丢掉构建残渣
很多Java开发者写Dockerfile 都喜欢直接基于openjdk镜像构建:
这样写会把整个源码、构建工具、缓存统统打包进镜像,导致体积巨大。
我改用多阶段构建后立刻见效:
编译环境和运行环境彻底隔离,最终镜像中只保留必要的JRE和构建产物,直接瘦身数百MB!
第二招:换掉沉重的基础镜像
很多同事图省事直接用openjdk官方镜像:
结果一个镜像就400多MB起步。
而我在对比后选用了eclipse-temurin的17-jre-alpine版本,轻量又稳定。 甚至你也可以试试:
- eclipse-temurin:17-distroless
- gcr.io/distroless/java17
这些基础镜像移除了shell、包管理器、甚至glibc,体积大大减小,还提升了安全性。
第三招:用docker-slim精简镜像结构
就算你做好了多阶段构建,也别忘了最后一步收尾工作:清理冗余+自动瘦身。
我推荐你用这个神器:docker-slim (怎么安装参考github的slimtoolkit/slim项目)
它会自动分析哪些文件没被运行依赖,然后剔除,生成一个可运行的超小镜像。
我的经验是:
- 原始镜像 573MB → 瘦身后150MB,没出任何兼容问题。
- 每次构建前最好清理target/和.m2缓存,进一步缩减体积。
实战案例对比:瘦身效果,一图胜千言!
优化前后对比,一目了然:
原始镜像构建流程:
- openjdk镜像构建的demo-app:573MB
- 默认基础镜像openjdk:17:471MB
优化后逐步减重:
- 使用eclipse-temurin:17-jre精简后镜像:263MB
- 最终通过docker-slim精简后的镜像:150MB
几个关键节点:
- 替换基础镜像就能省下几百MB
- 多阶段构建+docker-slim,进一步瘦身效果更明显
- 镜像越小,推送速度越快,网络吞吐降低,部署失败率越低!
附加工具推荐:镜像优化利器
- docker-slim:镜像自动瘦身的利器,支持Java/Go/Node项目
- Dive:可视化分析每一层Docker Layer
- Jib:Google出品,构建Java镜像无需Dockerfile,自动优化层级结构
结语:别再为镜像发胖买单了!
镜像优化不只是省空间,更能加快部署效率、提升CI/CD稳定性,避免构建超时、推送失败的尴尬场景。
轻量构建不是未来,是现在就该做的事。
你有遇到过因为镜像太大而构建失败的经历吗?欢迎在评论区一起聊聊你的优化技巧!
- 上一篇: Docker容器与镜像详解(6大核心区别)
- 下一篇: Docker命令大全详解(39个常用命令)
猜你喜欢
- 2025-08-05 Docker Compose 编排实战:一键部署多容器应用!
- 2025-08-05 Docker 命令入门实战:搞懂这些才算真正入门!
- 2025-08-05 Docker 镜像构建加速与镜像瘦身实战,一篇就够!
- 2025-08-05 Docker 常用命令手册
- 2025-08-05 Docker命令大全详解(39个常用命令)
- 2025-08-05 Docker容器与镜像详解(6大核心区别)
- 2025-08-05 docker镜像操作
- 2025-08-05 Docker 一键清盘术,释放磁盘空间不求人
- 08-05 Docker Compose 编排实战:一键部署多容器应用!
- 08-05 Docker 命令入门实战:搞懂这些才算真正入门!
- 08-05Docker 镜像构建加速与镜像瘦身实战,一篇就够!
- 08-05Docker 常用命令手册
- 08-05Docker命令大全详解(39个常用命令)
- 08-05Docker镜像越来越大?我用这 3 个技巧直接瘦身 80%!附实战优化对比
- 08-05Docker容器与镜像详解(6大核心区别)
- 08-05docker镜像操作
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)