ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

零基础入门python70:Docker Compose 编排完整后端

2026/9/8 19:04:10 拓冰建站 浏览量
零基础入门python70:Docker Compose 编排完整后端 零基础入门python70Docker Compose 编排完整后端上一篇课后练习讲解Dockerfile 使用 Python 3.11 slim、固定依赖和非 root 用户健康检查验证的是正在运行的应用不是“build 成功”。上一篇课后练习完整答案上一篇练习已经落实到完整文件运行下面代码可以观察本篇要求的成功和失败状态数据库写入全部放在明确事务边界内。答案要点Dockerfile 分层安装依赖、复制 app、非 root 运行 Uvicorndocker history 检查镜像不含 .env 和密钥。完整答案文件Dockerfile完整参考答案文件完整文件DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app ./app USER nobody CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]验收运行项目测试FastAPI/Flask 使用 python -m pytest -qDjango 使用 python manage.py test再按本文 curl 或 Docker 命令检查预期状态码。先复制 requirements 可利用依赖缓存生产镜像不包含.env、测试数据库和 Git非 root 用户降低进程被利用后的权限。生产不使用--reload。一、Compose 服务边界services:api:build:.env_file:.envports:[8000:8000]depends_on:postgres:{condition:service_healthy}redis:{condition:service_healthy}postgres:image:postgres:16environment:POSTGRES_DB:blogPOSTGRES_USER:blogPOSTGRES_PASSWORD:change-mehealthcheck:test:[CMD-SHELL,pg_isready -U blog -d blog]redis:image:redis:7-alpinehealthcheck:test:[CMD,redis-cli,PING]二、实际验收docker compose config docker compose up-d--pull never docker composepsdocker compose exec redis redis-cliPING确认 PostgreSQL healthy、Redis 返回 PONG、API 健康检查 200。停止 Redis 时公开列表仍可从数据库读取停止 PostgreSQL 时 API 返回可诊断的 503而不是无限等待。课后练习增加 MongoDB 和 migration 服务写出镜像不存在、端口冲突和健康检查失败三种排错记录。下一篇配置 Nginx 和 HTTPS。三、Compose 文件中的依赖关系services:api:build:.env_file:.envports:[8000:8000]depends_on:postgres:condition:service_healthyredis:condition:service_healthyrestart:unless-stoppedmigrate:build:.command:alembic upgrade headenv_file:.envdepends_on:postgres:condition:service_healthydepends_on的健康条件只保证 Compose 在健康后启动容器不能保证网络瞬间没有抖动应用仍应在启动阶段重试数据库连接。迁移服务必须是一次性任务不能让多个 API worker 同时执行alembic upgrade。数据库凭据放.env不要写在镜像或 Compose 文件里。四、卷、网络和停止顺序PostgreSQL 使用命名卷pgdataRedis 可使用redisdata保存重启后的缓存如果缓存可丢失也可以不挂卷。docker compose down不会删除卷down -v才会删除数据执行前必须确认环境。停止时先让 API 停止接收新请求再停止依赖避免大量 503。docker compose config docker compose up-d--pull never docker composepsdocker compose logs migrate docker compose exec redis redis-cliPING预期迁移日志显示Running upgradeRedis 返回PONGAPI/health返回 200。service api depends on undefined service是缩进或服务名拼写错误端口冲突可把宿主端口改为18000:8000容器内部仍用 8000镜像不存在时使用本地 tag 或先构建不能把--pull never的失败伪装成服务已启动。五、本篇练习增加 MongoDB 服务和一个mongo-init一次性脚本写健康检查失败、端口占用、数据库凭据错误三份排错记录。下一篇将把 Nginx 放到公网入口解释 TLS 终止和反向代理头。六、Compose 到生产的差别开发 Compose 可以映射 PostgreSQL 端口便于调试生产通常只把数据库放在内部网络不暴露宿主端口。restart: unless-stopped能处理偶发进程退出却不能修复坏迁移迁移 job 失败时 API 不应继续接收写请求。为每个服务设置 CPU/内存上限避免日志或异常重试耗尽主机资源。本篇结束完整模块文件本节不是代码片段而是本篇结束时该模块的完整版本。请先备份旧文件再整体替换替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理未涉及的代码先不要自行删减。完整配置services:api:build:./fastapi-blogports:[8000:8000]depends_on:[db,redis]db:image:mysql:8.4redis:image:redis:7-alpine