CodeGym /课程 /Docker SELF /优化 Dockerfile

优化 Dockerfile

Docker SELF
第 14 级 , 课程 0
可用

6.1 理解镜像优化

Docker镜像虽然很小巧,但还是会占用一些空间。所以缩小其大小是一个重要任务,这有助于提升性能、加快下载和部署container的速度,还能降低存储开销。优化镜像可以通过改进Dockerfile来实现,因为Dockerfile可以有不同的组织方式。在这节课里,我们会讨论一些策略和最佳实践,来创建优化的、轻量级的Docker镜像。

为什么缩小Docker镜像大小很重要?

  1. 部署速度: 小的镜像可以更快地从Docker registry中下载并部署到container中,这在CI/CD自动化系统中特别重要。
  2. 资源高效使用: 轻量级镜像占用更少的磁盘空间,在传输时节省网络资源,并确保计算资源的更高效利用。
  3. 安全性: 小的镜像通常包含更少的无用组件,这降低了潜在漏洞的风险。
  4. 简化更新: 更新轻量级镜像速度更快,所需资源更少,从而加快维护过程。

6.2 减少 Docker 镜像大小的策略

1. 使用最小的基础镜像

选择基础镜像会直接影响最终 Docker 镜像的大小。使用像 alpine 这样的小型基础镜像可以显著减少镜像的大小。

示例:

将镜像 ubuntu 替换为 alpine

dockerfile

# FROM ubuntu:20.04
FROM alpine:3.12

alpine 是一个轻量级的 Linux 发行版,大约占用 5 MB,而 ubuntu 镜像可能占用数百 MB。

2. 减少层的数量

Dockerfile 中的每条指令都会为镜像添加一个新层。将多条命令合并到一条 RUN 指令中可以减少层的数量,从而帮助缩小镜像的总体大小。

示例:

优化前:

dockerfile

RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*

优化后:

dockerfile

RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*

删除包管理器的缓存 (rm -rf /var/lib/apt/lists/*) 可以通过清理安装过程中创建的临时文件进一步减小镜像大小。

3. 删除临时文件

删除临时文件和安装完包后的无用数据,可以保持镜像干净且轻量。

示例:

dockerfile


RUN apt-get update && apt-get install -y curl git && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

4. 使用 .dockerignore

.dockerignore 文件可以排除构建上下文中的无用文件和目录,从而减小镜像大小并加速构建过程。

.dockerignore 示例:

Terminal


node_modules
dist
*.log
Dockerfile*
.dockerignore

5. 多阶段构建 (multi-stage builds)

多阶段构建可以使用多个中间镜像来创建最终轻量镜像,只包含必要的文件和依赖项。

示例:

dockerfile


# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 最终阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

在此示例中,第一个阶段创建了应用程序的构建,最终阶段仅使用构建结果,从而减小了最终镜像的大小。

6. 优化安装包

仅安装必要的包,并使用包管理器的选项进行最小化安装,可以减小镜像大小。

示例:

使用 --no-install-recommends 参数进行优化:

dockerfile


RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
    rm -rf /var/lib/apt/lists/*

7. 压缩和最小化数据

使用压缩和数据最小化工具可以进一步减少镜像大小。

示例:

压缩文本文件和日志文件:

dockerfile


RUN gzip /path/to/large/file.log

8. 删除未使用的库和依赖项

删除安装必要包后遗留的未使用库和依赖项可以保持镜像轻量化。

示例:

对于 Python 应用:

dockerfile


RUN pip install --no-cache-dir -r requirements.txt

6.3 优化 Dockerfile 的示例

示例 1: Node.js 的优化 Dockerfile

dockerfile

FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
        
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

这个示例使用了多阶段构建。首先,在中间阶段构建应用程序,然后将构建结果复制到基于 Nginx 的最终镜像中。

示例 2: Python 的优化 Dockerfile

dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

在这个示例中,使用了轻量级的基础镜像 python:3.9-slim。依赖安装被放在一个单独的步骤中,这样可以在 requirements.txt 文件没有更改时利用 Docker 缓存。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION