首页 / 部署
用 Docker 把 Python 网站一键部署到云服务器
“在我机器上能跑”是程序员最心虚的一句话。Docker 解决的正是这个问题:把应用和它的运行环境一起打包,搬到任何一台装了 Docker 的服务器上都能原样跑起来。下面是我部署 Python 网站的真实流程。
一、一个最小可用的 Dockerfile
Python 项目最怕镜像臃肿。用 slim 基础镜像、加 --no-cache-dir、写好 .dockerignore,镜像能小一大圈:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
二、用 docker-compose 编排多容器
一个网站通常不是单打独斗:应用、MySQL、后台静态资源最好分开。compose 一份文件就把关系定清楚,启动只要一条命令:
services:
api:
build: .
ports: ["8000:8000"]
depends_on: [db]
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: "***"
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
三、数据必须落盘,容器才能“随便删”
容器本身是易逝的——重启、更新、重建都会丢里面的东西。所以数据库、上传文件这类“状态”一定要挂到宿主机的卷上(如上例的 db_data)。这样哪怕把容器整个删掉重来,数据也还在。
关键纪律:更新应用时只重建“应用容器”,千万别把数据库容器也顺手重建了,否则数据卷以外的东西会丢。我习惯把数据库和应用分开管理,数据库容器几乎不动。
四、部署流程固化成几步
- 拉最新代码(
git pull) - 重新构建镜像(
docker compose build) - 平滑重启(
docker compose up -d) - 看健康检查(
docker ps状态是否为 healthy)
这一套跑熟之后,部署从“提心吊胆”变成了“机械操作”。
五、别忘了备份
Docker 让部署变简单,但备份不能省。我每天对 MySQL 做一次 mysqldump 并保留多份历史,真出问题能回滚到任意一天。部署再优雅,没有备份也等于零。
下一篇聊安全:小程序后端免不了要和微信打交道,接口怎么鉴权、分享链接怎么防篡改,我会在下一篇展开。