Docker 镜像分层原理
镜像 = 只读层叠加
Docker 镜像由一层层只读的 diff 堆叠而成,容器启动时在最上面挂一个可写层。
分层结构 Mermaid
关键性质
- 相同层只存一份:多个镜像共享
debian base,磁盘和传输都省 - 层有哈希指纹:pull 新 tag 时,只有哈希不同的层才需要下载
- 层内不可变:改文件会产生新层,旧数据仍然占空间
减小镜像的三个手段
1. 多阶段构建
FROM golang:1.22 AS builder
WORKDIR /src
COPY . .
RUN go build -o app .
FROM debian:bookworm-slim
COPY --from=builder /src/app /usr/local/bin/app
CMD ["app"]
2. 合并清理到同一层
# 坏:产生两个层,中间产物永远留在镜像里
RUN apt update
RUN rm -rf /var/lib/apt/lists/*
# 好:一层搞定
RUN apt update && \
apt install -y curl && \
rm -rf /var/lib/apt/lists/*
3. 写好 .dockerignore
node_modules、.git、构建产物统统挡在外面。
经验值
Go 后端多阶段构建后一般 < 20MB;Python 应用压到 80–120MB 比较正常。