Docker镜像瘦身技巧:给Docker镜像做瘦身

给Docker镜像做瘦身,这几个技巧新手也能上手


刚接触 Docker 的朋友经常会发现,自己随便跑一个 Python 应用,镜像就 1GB+,传输和部署都很慢。

其实通过几个Docker镜像瘦身技巧,你可以轻松将体积降到 200MB 以内。

本文会从准备到验证一步步讲清楚,零基础也能照着做。


准备前先搞清楚三个概念



  • 镜像层:Dockerfile 里每条 RUNCOPY 都会生成一层,层越多体积越大。

  • 基础镜像FROM 后面选什么系统,容量差很大(比如 CentOS 200MB,Alpine 5MB)。

  • 构建缓存:重复构建时会保留缓存层,但缓存也会占用空间。


操作前请确保已经安装 Docker(docker --version 检查),并在本地有一个待优化的项目目录(内含 Dockerfile)。


第一招:换掉大块头基础镜像


如果你还在用 FROM ubuntu:latestFROM centos:7,赶紧换成更轻量的版本:



  • FROM alpine:3.18(5MB,包管理器是 apk

  • FROM python:3.11-alpine(专门给 Python 用)

  • FROM node:18-alpine(给 Node.js 用)


改动后重新构建一次,镜像体积通常能直接减掉 80%。

例如原本基于 Ubuntu 的 Node.js 镜像约 800MB,换 Alpine 后不到 200MB。


第二招:多阶段构建,只留运行产物


这是最常用的Docker镜像瘦身技巧

假设你需要编译一个 Go 或 C 程序,可以用第一个阶段装编译器编译,第二个阶段只复制编译好的二进制文件。


示例 Dockerfile(Go 程序):


# 第一阶段:编译
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp

第二阶段:运行

FROM alpine:3.18
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/myapp /usr/local/bin/myapp
CMD ["myapp"]


这样最终镜像里只包含 Alpine 和编译好的程序,没有 Go 编译器、依赖包等,体积可控制在 20MB 左右。


第三招:合并 RUN 命令,减少层数


每一条 RUN 都会产生一个新层,可以用 && 把多条命令合并到一行,同时配合 --no-cache 或删除临时文件:


# 不推荐(3 层)
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean

推荐(1 层)

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


合并后不仅体积减少 30-50MB,构建也更快。


避坑指南



  • 删除文件不减少体积? 因为删除操作也在新层中,底层文件仍然存在。解决方法是:在同一 RUN 命令中先下载、使用、再删除,例如 RUN wget xxx && tar xf && 操作 && rm -rf xxx

  • 缓存带来的假瘦身:如果你用 --no-cache 构建了一次,但后续又用缓存构建,实际体积可能没变。建议清理缓存:docker builder prune -f

  • 别信 docker system df 欺骗:它显示的是所有镜像占用的物理空间,并非单个镜像实际层叠加大小。用 docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}" 查看单个镜像大小。


效果验证方法


构建完成后,运行以下命令查看大小:


docker images | grep myapp

对比优化前后的镜像大小。

例如之前是 1.2GB,优化后变为 150MB,说明技巧生效。

还可以用 docker history myalatest --no-trunc | head -5 查看每层大小,确认是否有异常大的层。


高频问题解答


Q:为什么我用 RUN rm -rf /tmp/* 后镜像没变小?

A:因为文件在之前层已经存在,删除层只是标记删除,底层仍占空间。请确保通过 COPYADD 后立即在同一条 RUN 里处理。


Q:多阶段构建后,第一阶段生成的层会占用最终镜像空间吗?

A:不会,Docker 只保留最终阶段的所有层,中间阶段不会进入最终镜像。


Q:使用 Alpine 时遇到报错怎么办?

A:Alpine 使用 musl libc,部分二进制可能有兼容性问题。可以用 RUN apk add --no-cache libc6-compat 解决。


总结


从换基础镜像、多阶段构建、合并 RUN 命令三招入手,你就能快速掌握Docker镜像瘦身技巧

建议先从最简单的基础镜像替换开始,等熟悉后再尝试更高级的多阶段构建。

遇到镜像体积不变问题时,优先检查是否在同一个 RUN 层内删除临时文件。

坚持这些习惯,你的镜像体积自然会降下来。

分享到:
上一篇
Linux网络配置静态IP教程
下一篇
服务器合规运营数据安全:云服务器合规运营:数据安全零
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意