
2.1 镜像是个"千层蛋糕"
Docker镜像就像一个千层蛋糕,每一层都有特定的作用:
- 底层:操作系统基础层(比如Ubuntu 20.04),提供运行环境;
- 中间层:各种软件和依赖(比如Python 3.9、Node.js 16);
- 顶层:你的应用程序和配置文件。
这种分层结构有个神奇的特性:只读共享。多个镜像可以共享相同的底层,节省存储空间。比如Ubuntu基础层被10个不同的镜像使用,硬盘上只存一份。
2.2 Dockerfile:镜像的"菜谱"
想制作自己的镜像,就要写一份"菜谱"------Dockerfile。它是一个文本文件,包含一系列指令,告诉Docker如何一步步构建镜像。
一个典型的Dockerfile长这样:
dockerfile
# 使用Python 3.9作为基础镜像(第一层)
FROM python:3.9-slim
# 设置工作目录(容器内的路径)
WORKDIR /app
# 复制当前目录下的requirements.txt到容器的/app目录(第二层)
COPY requirements.txt .
# 安装Python依赖(第三层)
RUN pip install -r requirements.txt
# 复制项目代码到容器(第四层)
COPY . .
# 暴露端口5000
EXPOSE 5000
# 容器启动时执行的命令
CMD ["python", "app.py"]
每一条指令都会创建一个新的镜像层,层层叠加,最终形成完整的镜像。
2.3 镜像瘦身五大妙招
镜像太大不仅占用硬盘,还会拖慢部署速度。这里分享几个实用的瘦身技巧:
2.3.1 选用精简基础镜像
基础镜像选得好,瘦身成功一半。常见的精简镜像:
alpine:基于Alpine Linux,体积只有几MB,但软件包较少;slim:官方提供的精简版,比如python:3.9-slim,比完整版小很多。
2.3.2 合并RUN指令
每条RUN指令都会创建一层,合并可以减少层数:
dockerfile
# ❌ 不推荐:两条RUN指令,创建两层
RUN apt-get update
RUN apt-get install -y python3
# ✅ 推荐:一条RUN指令,只创建一层
RUN apt-get update && apt-get install -y python3
2.3.3 清理缓存垃圾
安装软件时会产生缓存,记得及时清理:
dockerfile
# 安装完软件后清理apt缓存
RUN apt-get update && apt-get install -y python3 \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
2.3.4 使用.dockerignore
就像.gitignore一样,.dockerignore可以排除不必要的文件,减小构建上下文:
# .dockerignore文件内容
.git
__pycache__
*.log
.env
node_modules
2.3.5 多阶段构建
对于编译型语言(如Go、Java),可以使用多阶段构建,只保留运行时需要的文件:
dockerfile
# 第一阶段:编译
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# 第二阶段:运行(只保留编译后的可执行文件)
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
掌握了这些技巧,你的镜像就能轻松瘦身50%以上!
下一章,我们将学习容器的进阶操作技巧。