17 · 部署与 CI/CD:Docker 到云端
前端跑在浏览器里,后端跑在服务器上。本篇把"从
uvicorn到线上稳定运行"讲通:容器化、环境差异、CI/CD、云部署选项。
速览卡
| 项 | 内容 |
|---|---|
| 一句话定位 | 后端怎么打包、怎么自动化发布、怎么选云部署 |
| 核心内容 | Docker 化、环境变量与多环境、CI/CD 流水线、云部署选项(VM/PaaS/容器)、发布回滚 |
| 读完能回答 | Docker 到底解决了什么?CI 和 CD 有什么区别?上线出问题怎么回滚? |
| 相关板块 | C09 · 服务端语言上手 | C12 · 错误处理日志配置 | C08 · 可观测性 |
一、Docker 解决的核心问题
"在我电脑上能跑"不是能跑。 Docker 把"运行环境"也打包进去,保证本地、测试、生产一致。
| 维度 | 没有 Docker | 有 Docker |
|---|---|---|
| 环境一致性 | 手动装 Python/依赖,各机器漂移 | 镜像即环境 |
| 依赖隔离 | 全局安装互相污染 | 每个容器独立 |
| 伸缩 | 手工起进程 | 按镜像一键起 N 个 |
dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]前端对应物:容器 ≈ 一个"带好全部运行时的独立沙箱",类似浏览器的隔离但面向进程。
二、多环境:一套代码,三套配置
| 环境 | 用途 | 配置来源 | 数据库 |
|---|---|---|---|
| dev | 本地开发 | .env | 本地 |
| staging | 发布前验证 | 平台环境变量 | 独立测试库 |
| prod | 线上 | 环境变量 + 密钥服务 | 生产库 |
原则:代码只有一份,差异全部来自配置(见 C12)。密钥走环境变量/密钥服务,绝不进镜像和仓库。
三、CI / CD
3.1 两个阶段
| 阶段 | 干什么 | 类比 |
|---|---|---|
| CI(持续集成) | 每次提交:跑测试、lint、构建 | 提交前的自动检查 |
| CD(持续交付/部署) | 测试通过后自动发布到目标环境 | 一键上线 |
3.2 一个最小流水线
yaml
# 伪代码:GitHub Actions / GitLab CI
on: push
jobs:
test:
- install deps
- run pytest
deploy:
needs: test
- docker build
- push image
- deploy to cloud红线:测试不过不允许合并、不允许发布。CI 是质量闸门,不是摆设。
四、云部署选项
| 方案 | 适合 | 你要操心 |
|---|---|---|
| VM + Docker(云主机) | 小项目/想学原理 | 服务器、升级、监控 |
| PaaS(Render/Railway/云托管) | 个人项目快上线 | 少(平台管机器) |
| 容器平台(K8s/云容器服务) | 中大型 | 多,但弹性强 |
| Serverless(云函数) | 事件型、低频 | 冷启动、超时限制 |
推荐路径:个人全栈先用 PaaS 或单机 Docker 快速上线,理解了再上容器编排(K8s 属于"了解即可"层)。
五、发布与回滚
| 概念 | 做法 |
|---|---|
| 蓝绿发布 | 新旧两套并存,切流量 |
| 金丝雀发布 | 先放 5% 流量,观察后放全量 |
| 回滚 | 保留上一个可用镜像/版本,一键切回 |
没有回滚能力的发布不是发布,是赌博。 每次部署记录版本号,出问题 5 分钟内回滚。
自检清单
- [ ] 能给自己的后端写 Dockerfile 并本地跑通
- [ ] 能说清 dev/staging/prod 的配置差异与密钥管理
- [ ] 能说清 CI 和 CD 的区别,并跑通一个最小流水线
- [ ] 能根据项目规模选择部署方式
- [ ] 有回滚方案,发布前能一键切回旧版本
常见误区
- 误区:密钥写进 Dockerfile 或镜像。 镜像会被拉取分享,密钥=裸奔。
- 误区:CI 只是"跑一遍构建"。 不跑测试的 CI 形同虚设。
- 误区:生产 = 本地环境。 配置差异没处理好,本地好好的线上崩。
- 误区:上线后没法回滚。 没有回滚方案的发布流程是不完整的。
动手练习
练习 A:容器化你的 Todo API
给 C09 的 Todo API 写 Dockerfile + docker-compose(含 PostgreSQL),本地一键起整套。
练习 B:接一个 CI
把 pytest 接入 CI,故意留一个失败用例确认会阻断。
练习 C:部署到 PaaS
用 Render/Railway 或云托管把你的服务部署上线,配置环境变量,确认 /docs 可访问。
相关文档
本区
- 09 · 服务端语言上手 —— 容器化的对象
- 11 · 后端测试实战 —— CI 里跑什么
- 12 · 错误处理日志配置 —— 多环境配置
- 08 · 可观测性 —— 上线后怎么看
其他域
- 16 · CI 与 CD 与部署运维 —— 前端发布流水线对照
- 05 · 工程化与 LLMOps —— AI 应用的部署