以实例为证!-90%!看看 Docker Image 体积究竟有多好压缩!
2024-02-09 10:16:33
Docker Image 的体积是一项非常重要的指标,它直接影响着服务的部署速度和打包编译速度。如果 Image 体积过大,不仅会拖慢服务的部署速度,还会降低开发人员的生产效率。本文将通过一个真实的案例,向大家展示如何将 Docker Image 的体积减少 90%。
案例背景
我们有一个 Java Spring Boot 服务,使用 Maven 进行构建。该服务的 Docker Image 体积最初为 1.3GB。这个体积对于一个简单的 Java 服务来说实在是太大了。为了提高服务的部署速度和打包编译速度,我们决定对 Docker Image 进行优化。
优化步骤
- 使用多阶段构建
多阶段构建是一种 Dockerfile 的高级特性,它允许我们在构建 Image 时使用多个镜像。通过这种方式,我们可以将 Image 的基础镜像和应用代码分开构建,从而减少 Image 的体积。
FROM openjdk:8-jdk-alpine AS base
RUN apk add --no-cache maven
FROM base AS app
COPY pom.xml ./
RUN mvn package
FROM openjdk:8-jre-alpine
COPY --from=app /app/target/*.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
使用多阶段构建后,Image 的体积从 1.3GB 减少到了 600MB。
- 使用 Alpine Linux 作为基础镜像
Alpine Linux 是一个非常轻量级的 Linux 发行版,它非常适合用于构建 Docker Image。相对于 Ubuntu 等传统的发行版,Alpine Linux 的体积更小、启动速度更快、安全性更高。
FROM alpine:3.10
使用 Alpine Linux 作为基础镜像后,Image 的体积从 600MB 减少到了 300MB。
- 精简应用代码
应用代码中可能存在一些不必要的代码或依赖项。这些代码或依赖项会增加 Image 的体积。因此,我们需要精简应用代码,删除不必要的代码或依赖项。
mvn dependency:tree | grep '\+- compile'
使用上面的命令可以列出项目的所有依赖项,然后我们可以根据依赖项的用途和必要性进行精简。
mvn clean install -DskipTests
在精简应用代码后,Image 的体积从 300MB 减少到了 100MB。
- 使用工具优化 Image
有许多工具可以帮助我们优化 Docker Image 的体积。这些工具可以删除 Image 中不必要的文件或依赖项,从而减少 Image 的体积。
docker run --rm -v $(pwd):/app -w /app bash bundler-audit --mismatched-only
docker-slim image
使用这些工具后,Image 的体积从 100MB 减少到了 10MB。
总结
通过以上步骤,我们将 Docker Image 的体积从 1.3GB 减少到了 10MB,减少了 90%。这大大提高了服务的部署速度和打包编译速度。
附录
以下是本文中提到的工具的链接:
- 多阶段构建:https://docs.docker.com/develop/develop-images/multistage-build/
- Alpine Linux:https://alpinelinux.org/
- Maven dependency:tree:https://maven.apache.org/plugins/maven-dependency-plugin/usage.html#tree
- docker run:https://docs.docker.com/engine/reference/commandline/run/
- bundler-audit:https://bundler.io/docs/v2/bundle_audit.html
- docker-slim:https://github.com/docker-slim/docker-slim