news 2026/9/8 19:04:00

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础入门python70:Docker Compose 编排完整后端

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

上一篇课后练习讲解

Dockerfile 使用 Python 3.11 slim、固定依赖和非 root 用户;健康检查验证的是正在运行的应用,不是“build 成功”。

上一篇课后练习完整答案

上一篇练习已经落实到完整文件,运行下面代码可以观察本篇要求的成功和失败状态;数据库写入全部放在明确事务边界内。
答案要点:Dockerfile 分层安装依赖、复制 app、非 root 运行 Uvicorn;docker history 检查镜像不含 .env 和密钥。

完整答案文件:Dockerfile

完整参考答案文件

完整文件:Dockerfile

FROM 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 -q,Django 使用 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_healthy

depends_on的健康条件只保证 Compose 在健康后启动容器,不能保证网络瞬间没有抖动;应用仍应在启动阶段重试数据库连接。迁移服务必须是一次性任务,不能让多个 API worker 同时执行alembic upgrade。数据库凭据放.env,不要写在镜像或 Compose 文件里。

四、卷、网络和停止顺序

PostgreSQL 使用命名卷pgdata,Redis 可使用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 upgrade,Redis 返回PONG,API/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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 19:02:08

智能体系统架构三支柱:隔离、集成与治理的落地实践

1. 一个上午暴露的三个问题:智能体架构的命门先还原一个我最近的真实早晨。那天我准备把一套基于 AgentScope 做出来的智能体服务从开发环境推到测试环境。先是 Windows Defender 把打包好的一个辅助工具弹窗隔离了,我翻了半天设置才找到"win11隔离…

作者头像 李华
网站建设 2026/9/8 19:00:24

MCP Server上线前体检:用Inspector逐项验证协议、Tools与Resources

最近在给团队维护一个内部 MCP Server,每次版本更新前我都会用官方 Inspector 做一轮“只读体检”。MCP Server 这层东西很有意思,它本身不产数据,也不直接执行业务逻辑,而是把 Tools、Resources、Prompts 这些能力包装成标准协议…

作者头像 李华
网站建设 2026/9/8 19:00:11

matlab车牌出入库识别系统停车场演示【源码61期】

一、项目简介本系统是一个基于MATLAB GUI的车牌识别与停车场管理系统,集车牌自动识别、字符分割与识别、车辆入库/出库管理、车位信息查询等功能于一体,适用于智能停车场管理场景。系统通过图像处理技术完成车牌定位与识别,并结合Excel数据管…

作者头像 李华
网站建设 2026/9/8 18:58:40

企业需要通过API接入大模型,推荐选择哪些安全可靠的生成式AI平台?

企业需要通过API接入大模型,推荐选择哪些安全可靠的生成式AI平台?Amazon Bedrock把统一接口、安全治理与生产级弹性放进同一架构 企业通过API接入大模型,不能只比较“模型多不多”或者“接口能不能调用”。 真正进入生产环境后,平…

作者头像 李华
网站建设 2026/9/8 18:56:21

基于MATLAB的卡尔曼滤波9轴IMU姿态解算源码全解析

简介:基于MATLAB平台的9轴IMU卡尔曼滤波源码,面向惯性导航、姿态估计或传感器融合方向的开发者与学生,解决多传感器数据噪声大、漂移明显等问题,从而提升姿态解算的精度与稳定性,既适合新手学习原理,也方便…

作者头像 李华
网站建设 2026/9/8 18:55:13

深入理解 SAP Gateway Feed 订阅与通知机制,从 OData Subscription 到 Push 与 Pull 集成

在企业系统里,有一类需求看起来很简单,却很容易被传统的请求响应式接口做得又慢又重。 销售订单 123 被修改了,移动端希望马上收到提醒。某个客户 456 的地址发生变化,负责该客户的业务人员希望看到通知。一张金额为 1500 美元的差旅申请进入审批流程,审批人希望系统主动…

作者头像 李华