D

Docker 镜像优化:减小大小以加快部署速度

2025-05-27

Docker 镜像优化:减小大小以加快部署速度

介绍

几个月前,在为客户进行一项关键部署时,我们遇到了一个意想不到的问题:部署耗时太长。罪魁祸首?Docker 镜像臃肿。这个过程不仅令人沮丧,还导致了我们无法承受的宕机。

这次经历教会了我一个重要的道理:小改变也能带来大影响。通过优化 Docker 镜像,我们成功将部署时间缩短了一半,节省了存储成本,并提升了 CI/CD 流水线的整体效率。今天,我将分享我们实现这一转变所采用的策略。


为什么要优化 Docker 镜像?

如果您曾经遇到过构建缓慢、部署时间过长或镜像仓库混乱不堪、体积过大等问题,那么您并不孤单。以下是减小镜像大小至关重要的原因:

  1. 更快的构建:您的开发周期变得更快,让您专注于重要的事情。
  2. 高效存储:较小的图像可以节省 Docker 注册表和机器上的磁盘空间。
  3. 更快的部署:通过网络部署较小的图像要快得多。
  4. 增强的安全性:组件越少,漏洞就越少。

我们缩小 Docker 镜像的那一天

我还记得第一次docker images在优化后跑步的情景。看到“之前”和“之后”的尺寸对比,感觉就像连续几周健身后站在体重秤上一样——你能感受到变化,这感觉很有成就感。

以下是我们为实现这一转变所遵循的具体步骤:


优化 Docker 镜像的 7 种有效方法

1. 选择最小基础镜像

我们不再一开始使用ubuntu:latest或其他大型图像,而是改用alpine。这一改变将图像大小从 800MB 减少到 30MB 以下。

例子:

FROM alpine:latest
Enter fullscreen mode Exit fullscreen mode

2. 使用多阶段构建

在许多项目中,例如 React 应用程序,我们可能有一些构建依赖项(例如 Node.js 和 npm),这些依赖项仅在构建过程中需要,但在生产镜像中不需要。通过使用多阶段构建,我们可以将构建环境与运行时环境分离,从而生成更小的镜像。

示例:

在此示例中,我们将对 React 应用程序使用多阶段构建:

# Build Stage
FROM node:16 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# Runtime Stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
Enter fullscreen mode Exit fullscreen mode

在上面的 Dockerfile 中

  • 第一阶段使用官方node:16镜像安装依赖项、构建React应用、生成静态文件。

  • 第二阶段使用较小的 nginx:alpine 镜像来为构建的 React 应用程序提供服务。

这种多阶段方法可确保最终图像中仅包含必要的构建工件(构建目录),从而使图像尺寸保持最小并针对生产进行优化。


3.删除不必要的文件

在调试过程中,我们经常在构建过程中包含临时文件。通过添加.dockerignore文件,我们可以确保这些文件永远不会被添加到镜像中。

.dockerignore 示例:

node_modules
*.log
.git
Enter fullscreen mode Exit fullscreen mode

4. 合并并最小化层

Dockerfile(例如,RUNCOPY、 )中的每条指令ADD都会在 Docker 镜像中创建一个新层。过多的层会导致镜像体积膨胀。将多条指令合并为一条RUN语句,可以减少层数并优化镜像。

例如:

不要这样写:

RUN apt-get update  
RUN apt-get install -y curl vim  
RUN apt-get clean  
RUN rm -rf /var/lib/apt/lists/*
Enter fullscreen mode Exit fullscreen mode

将它们合并为一个:

RUN apt-get update && apt-get install -y curl vim \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
Enter fullscreen mode Exit fullscreen mode

这种方法最大限度地减少了层数,并确保在同一层内删除临时文件(例如,缓存),从而使图像更小、更干净。


5.避免安装不必要的依赖项

最初,我们的 Docker 镜像带有额外的库,以防万一。随着时间的推移,我们意识到这会导致镜像臃肿,并带来不必要的安全风险。通过仅指定运行时实际需要的依赖项,我们使镜像更小巧,更安全。

例如,我们不会为每个项目安装大量的库,而是专注于最小的依赖关系并避免不必要的包。


6.使用docker-slim

彻底改变了我们流程的一项工具是docker-slim。该工具会自动分析您的图像,并通过删除不必要的部分(例如未使用的文件、二进制文件和库)来减小其大小,而不会影响功能。

我们发现使用后图像尺寸减少了 80% docker-slim,这使其成为我们优化策略中不可或缺的工具。

缩小图像的命令:

docker-slim build <image-name>
Enter fullscreen mode Exit fullscreen mode

7.定期审核和修剪镜像

Docker 镜像会随着时间的推移而累积,未使用的镜像或层会占用宝贵的空间。定期审核和清理未使用的镜像有助于维护干净的环境。

您可以通过运行以下命令删除未使用的图像和层:

修剪未使用图像的命令:

docker system prune -f
Enter fullscreen mode Exit fullscreen mode

删除所有未使用图像的命令:

docker image prune -a -f
Enter fullscreen mode Exit fullscreen mode

通过将定期修剪纳入您的工作流程,您可以确保您的 Docker 环境保持精简和高效。


衡量成功

实施这些优化后,我们曾经docker images比较过尺寸。结果令人震惊:

  • 优化前: 1.2GB
  • 优化后: 250MB

我们的部署不仅变得更快,而且我们的云存储成本也大幅下降。


结论

优化 Docker 镜像看似小事一桩,但它能给你的工作流程带来巨大的好处。无论你是独立开发者还是大型团队的一员,这些策略都能带来切实的改变。

那么,您还在等什么?深入研究您的Dockerfile,开始优化,享受更精简、更快速的部署带来的好处。


参考

  1. Docker 官方文档
  2. 编写 Dockerfile 的最佳实践

📖喜欢这个博客吗?你也可以在Hashnode上阅读我的文章,并在那里关注我,获取更多技术洞见!🚀


文章来源:https://dev.to/thenanjay/docker-image-optimization-reducing-size-for-faster-deployments-489g
PREV
前端性能优化
NEXT
你不是软件工程师,你只是“框架工程师”