专栏进度:01 / 03 (Docker 专题)
你是否经历过安装 psycopg2 或 pandas 时,因为服务器缺少某个 C 语言库而折腾一个下午?
Docker 的核心价值在于:它将你的代码、解释器、依赖库、甚至操作系统配置,全部打成一个只读的 “镜像(Image)”。

一、 核心概念:分层存储与缓存机制

Docker 镜像不是一个大文件,而是像洋葱一样的一层层叠加。

缓存命中:如果你在 Dockerfile 中先复制 requirements.txt 再进行 pip install,只要你的依赖没变,Docker 就会直接跳过安装过程。

不可变性:一旦镜像构建完成,无论分发到哪台服务器,运行结果完全一致。

二、 实战:编写一个专业的 Python Dockerfile

反面教材(臃肿且缓慢):

Dockerfile

FROM python:3.9
COPY . /app
RUN pip install -r /app/requirements.txt # 每次改代码都会重新触发安装,慢死!
CMD [“python”, “/app/main.py”]
专家写法(精简且极速):

Dockerfile

  1. 选择轻量化基础镜像

FROM python:3.9-slim

  1. 设置工作目录

WORKDIR /app

  1. 先复制依赖清单(利用缓存)

COPY requirements.txt .

  1. 安装依赖

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

  1. 复制业务代码(变动最频繁的部分放在最后)

COPY . .

  1. 设置非 root 用户(出于安全性考虑)

RUN useradd -m myuser
USER myuser

CMD [“python”, “main.py”]

三、 镜像瘦身:多阶段构建(Multi-stage Builds


有些编译工具(如 gcc)只在安装包时有用,运行代码时完全是赘肉。

Dockerfile

阶段一:构建环境

FROM python:3.9-slim AS builder
RUN apt-get update && apt-get install -y gcc
COPY requirements.txt .
RUN pip install --user -r requirements.txt

阶段二:运行环境

FROM python:3.9-slim
WORKDIR /app

仅仅从 builder 阶段拷贝安装好的包,不带走 gcc 等垃圾

COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH

CMD [“python”, “main.py”]

四、 避坑指南:.dockerignore 是必须的

很多新手会把 .git、pycache 甚至是本地的 .env 敏感文件也打进镜像。这不仅增加了体积,还泄露了密钥。
动作建议:在项目根目录建立 .dockerignore,排除一切不需要的文件。

更多推荐