返回

以实例为证!-90%!看看 Docker Image 体积究竟有多好压缩!

后端

Docker Image 的体积是一项非常重要的指标,它直接影响着服务的部署速度和打包编译速度。如果 Image 体积过大,不仅会拖慢服务的部署速度,还会降低开发人员的生产效率。本文将通过一个真实的案例,向大家展示如何将 Docker Image 的体积减少 90%。

案例背景

我们有一个 Java Spring Boot 服务,使用 Maven 进行构建。该服务的 Docker Image 体积最初为 1.3GB。这个体积对于一个简单的 Java 服务来说实在是太大了。为了提高服务的部署速度和打包编译速度,我们决定对 Docker Image 进行优化。

优化步骤

  1. 使用多阶段构建

多阶段构建是一种 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。

  1. 使用 Alpine Linux 作为基础镜像

Alpine Linux 是一个非常轻量级的 Linux 发行版,它非常适合用于构建 Docker Image。相对于 Ubuntu 等传统的发行版,Alpine Linux 的体积更小、启动速度更快、安全性更高。

FROM alpine:3.10

使用 Alpine Linux 作为基础镜像后,Image 的体积从 600MB 减少到了 300MB。

  1. 精简应用代码

应用代码中可能存在一些不必要的代码或依赖项。这些代码或依赖项会增加 Image 的体积。因此,我们需要精简应用代码,删除不必要的代码或依赖项。

mvn dependency:tree | grep '\+- compile'

使用上面的命令可以列出项目的所有依赖项,然后我们可以根据依赖项的用途和必要性进行精简。

mvn clean install -DskipTests

在精简应用代码后,Image 的体积从 300MB 减少到了 100MB。

  1. 使用工具优化 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%。这大大提高了服务的部署速度和打包编译速度。

附录

以下是本文中提到的工具的链接: