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 比较正常。

目录

图表