如何优化 Docker 镜像大小

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Docker 已成为在容器化环境中构建、部署和管理应用程序的广泛采用的技术。然而,Docker 镜像的大小会对应用程序的性能、部署时间和存储需求产生重大影响。本教程将指导你完成优化 Docker 镜像大小的过程,涵盖基本概念、实用技术和最佳实践,以帮助你构建更高效、更轻量级的容器。

理解 Docker 镜像基础

什么是 Docker 镜像?

Docker 镜像是一个轻量级的、独立的、可执行的包,它包含运行应用程序所需的一切——代码、运行时环境、系统工具、库和设置。Docker 镜像是 Docker 容器的构建块,而 Docker 容器是 Docker 镜像的运行时实例。

Docker 镜像层

Docker 镜像是由一系列层构建而成的。每一层代表镜像的 Dockerfile 中的一条指令。这些层相互堆叠形成最终的镜像。当镜像更新时,只重新构建更改的层,这使得构建和分发镜像的过程变得高效。

graph TB subgraph Docker 镜像层 layer1[层 1] --> layer2[层 2] layer2 --> layer3[层 3] layer3 --> layer4[层 4] layer4 --> layer5[层 5] end

Docker 镜像大小

Docker 镜像的大小差异很大,从几兆字节到几吉字节不等,这取决于应用程序和所使用的基础镜像。通常更喜欢较小的镜像,因为它们构建、下载和部署速度更快,并且在主机系统上占用的存储和内存更少。

基础镜像 大小
alpine:latest 5.6 MB
ubuntu:latest 77.8 MB
nginx:latest 133 MB
python:3.9-slim 113 MB

Docker 镜像仓库

Docker 镜像通常存储在 Docker 仓库中,Docker 仓库是用于存储和分发 Docker 镜像的服务。最流行的仓库是 Docker Hub,它提供了一个 Docker 镜像的公共存储库。开发人员也可以设置自己的私有仓库来存储和管理自己的自定义镜像。

优化镜像大小的技术

选择更小的基础镜像

你为 Docker 镜像选择的基础镜像会对最终镜像大小产生重大影响。使用更小的基础镜像,如 alpinescratch,可以大幅减小整体镜像大小。

## 使用较大的基础镜像
FROM ubuntu:latest
## 使用较小的基础镜像
FROM alpine:latest

尽量减少层数

Dockerfile 中的每条指令都会在镜像中创建一个新层。尽量减少层数有助于减小整体镜像大小。

## 不良做法:多个 RUN 命令
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

## 良好做法:合并 RUN 命令
RUN apt-get update \
 && apt-get install -y curl wget

使用多阶段构建

多阶段构建允许你在单个 Dockerfile 中使用多个 FROM 语句,每个语句使用不同的基础镜像。这样可以通过仅包含必要组件来帮助你创建更小的最终镜像。

## Dockerfile
FROM golang:1.16 AS builder
COPY.? /app
RUN go build -o /app/myapp

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

利用镜像缓存

Docker 的镜像缓存机制有助于优化构建过程并减少构建镜像所需的时间。通过重用缓存层,Docker 可以避免重新构建未更改的镜像部分。

清理未使用的 Docker 资源

随着时间的推移,你的 Docker 环境可能会积累未使用的镜像、容器、网络和卷,这可能会占用大量磁盘空间。定期清理这些未使用的资源有助于保持你的 Docker 环境精简高效。

## 清理未使用的 Docker 资源
docker system prune -a

构建更小 Docker 镜像的最佳实践

使用精简基础镜像

如前所述,使用更小的基础镜像,例如 alpinescratch,可以显著减小 Docker 镜像的大小。这些精简基础镜像仅包含必要的软件包和依赖项,从而将整体占用空间降至最低。

## 使用精简基础镜像
FROM alpine:latest

避免安装不必要的软件包

在 Dockerfile 中安装软件包时,仅安装应用程序运行所需的软件包。避免安装不需要的额外工具或实用程序,因为它们会增加镜像的大小。

## 不良做法:安装不必要的软件包
RUN apt-get update \
 && apt-get install -y curl wget vim

## 良好做法:仅安装必要的软件包
RUN apt-get update \
 && apt-get install -y curl

利用多阶段构建

如前一节所述,多阶段构建可以通过分离构建和运行时环境来帮助你创建更小的最终镜像。

## 使用多阶段构建的 Dockerfile
FROM golang:1.16 AS builder
COPY.? /app
RUN go build -o /app/myapp

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

使用.dockerignore 排除不必要的文件

.dockerignore 文件允许你指定应从 Docker 构建上下文排除的文件和目录。这有助于减小构建上下文的大小,从而减小最终镜像的大小。

#.dockerignore
.git
*.md
Dockerfile

优化镜像层

通过使用 && 运算符合并多个 RUN 命令并避免不必要的层来优化你的 Dockerfile。这有助于减少镜像中的层数,从而使整体大小更小。

## 不良做法:多个 RUN 命令
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

## 良好做法:合并 RUN 命令
RUN apt-get update \
 && apt-get install -y curl wget

定期清理未使用的资源

如前所述,定期清理未使用的 Docker 资源,如图像、容器、网络和卷,有助于保持你的 Docker 环境精简高效。

## 清理未使用的 Docker 资源
docker system prune -a

通过遵循这些最佳实践,你可以有效地优化 Docker 镜像的大小,使其在构建、分发和部署时更高效。

总结

在本全面的教程中,你将通过了解 Docker 镜像的基础知识、探索各种减小镜像大小的技术以及遵循构建更小且更高效容器的最佳实践,来学习如何优化 Docker 镜像的大小。通过实施本指南中涵盖的策略,你可以提高基于 Docker 的应用程序的性能、部署和整体管理水平。