15 - 实战:把 FastAPI 打成 Docker 部署到 Serverless
这一章把后端这条支线跑通:写 Dockerfile → 打镜像 → 推镜像仓库 → 部署到 Serverless → 用 CI/CD 自动化。以一个 FastAPI 服务为例,衔接 Docker 入门。
第一步:准备一个 FastAPI 服务
一个最小后端 main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/api/hello")
def hello():
return {"message": "Hello from Serverless!"}
依赖 requirements.txt:
fastapi
uvicorn[standard]
第二步:写 Dockerfile
把它打成镜像(详细写法见 Docker 系列第 05 章):
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Serverless 平台通常通过环境变量 PORT 指定端口,这里监听它
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
提示:不同 Serverless 平台对”监听哪个端口”有要求,有的固定 9000、有的通过
PORT环境变量下发。部署前看一眼平台文档,把端口对上。
第三步:本地构建并验证
docker build -t my-backend .
docker run -p 8000:8000 my-backend
访问 http://localhost:8000/api/hello 能返回 JSON,就说明镜像没问题。本地能跑,线上就能跑——这就是 Docker 的价值。
第四步:推送到镜像仓库
先开通云厂商的镜像仓库(阿里云 ACR / 腾讯云 TCR),登录后打标签并推送:
# 登录镜像仓库
docker login registry.cn-hangzhou.aliyuncs.com
# 打标签(指向你的仓库地址)
docker tag my-backend registry.cn-hangzhou.aliyuncs.com/your-namespace/my-backend:v1
# 推送
docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/my-backend:v1
第五步:部署到 Serverless
以”Serverless 容器”类产品为例(阿里云 SAE / 函数计算容器镜像、腾讯云云托管):
- 新建一个服务/应用
- 部署方式选容器镜像,填入刚才推送的镜像地址
- 配置端口(和 Dockerfile 里一致)、内存规格、实例伸缩范围(如最小 0、最大 10)
- 配置需要的环境变量(数据库连接串、AI API 密钥等,见第 5、6 部分)
- 部署,平台会拉取镜像、启动实例,给你一个访问地址
访问 https://你的服务地址/api/hello,能返回 JSON,后端就上线了。
[配图:Dockerfile → build → 推 ACR → Serverless 部署 → 拿到访问地址,一条流水线]
第六步:用 CI/CD 自动化
回顾第 08 章后端支线,用 GitHub Actions 让它 push 即部署(完整示例见 example/):
# .github/workflows/deploy-backend.yml(示意)
name: 部署后端
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 登录镜像仓库
run: docker login -u ${{ secrets.ACR_USER }} -p ${{ secrets.ACR_PASS }} registry.cn-hangzhou.aliyuncs.com
- name: 构建并推送镜像
run: |
IMG=registry.cn-hangzhou.aliyuncs.com/your-namespace/my-backend:${{ github.sha }}
docker build -t $IMG .
docker push $IMG
- name: 通知 Serverless 用新镜像部署
run: |
# 调用云厂商 CLI / API,把服务更新为新镜像
echo "deploy $IMG ..."
用
github.sha(本次提交号)当镜像标签,好处是每个版本镜像都不同,方便回滚——想回退就让 Serverless 换回上一个 tag。
部署后检查清单
- 访问
/api/hello能正常返回 - 没请求一段时间后再访问,第一次略慢(冷启动,正常)
- 改代码 push,几分钟后线上自动更新
- 密钥/连接串都放在环境变量 / Secrets,没写进代码
小结
- 后端实战链路:FastAPI → 写 Dockerfile → build → 本地验证 → 推镜像仓库 → 部署 Serverless → CI/CD 自动化。
- 端口要和平台要求对齐;敏感信息走环境变量 / Secrets。
- 用提交号做镜像 tag,方便回滚。
前端、后端都上线了。但后端要存数据、要调 AI——这些”状态”和”能力”放哪?进入第五部分:数据库与 AI,全用云端服务。
下一章 → 16 - 为什么数据库要用云托管