首页 / 容器云原生 / FastAPI+PostgreSQL

FastAPI+PostgreSQL+Redis 一机上线:Docker Compose 容器化部署实战脚本

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

第1章:OK so,先把项目装进容器

⚙️STEP 1环境搭建🔧STEP 2编码实现STEP 3测试验证📋STEP 4部署上线

兄弟们开机!这里是 eccfy,今天不是讲概念,直接上屏幕:一个 FastAPI 后端、PostgreSQL、Redis,我现场用 Docker Compose 编排起来。这个流程适合搜索“Docker Compose教程”“Docker容器化部署怎么用”“docker compose下载”的同学,照着敲就能跑。

接下来新建目录,我这里测试机是 Ubuntu 22.04,2核4G,Docker 24.0,Compose v2.24。先确认环境:

docker version
docker compose version
mkdir app-demo && cd app-demo

如果没有 Docker,优先用官方 Docker Engine 安装方式;桌面端用户可以用 Docker Desktop。免费方案的限制很现实:国内拉镜像可能慢,Docker Hub 偶尔超时,后面我会给验证方法。

现在看我操作,创建后端文件:

mkdir app
cat > app/main.py <<'EOF'
from fastapi import FastAPI
import redis, psycopg2, os

app = FastAPI()

@app.get("/health")
def health():
    r = redis.Redis(host="redis", port=6379)
    r.set("ping", "pong")
    conn = psycopg2.connect(
        host="db",
        database=os.getenv("POSTGRES_DB"),
        user=os.getenv("POSTGRES_USER"),
        password=os.getenv("POSTGRES_PASSWORD")
    )
    conn.close()
    return {"status": "ok", "redis": r.get("ping").decode()}
EOF

cat > app/requirements.txt <<'EOF'
fastapi
uvicorn[standard]
redis
psycopg2-binary
EOF

第2章:Now watch this,Compose 一把梭编排三件套

品牌定位清晰视觉体系统一内容矩阵搭建社媒运营规划效果追踪复盘

接下来是重点,把 Dockerfile 和 compose.yaml 写出来。注意:数据库密码不要硬编码进代码,放 env;服务之间不要写 127.0.0.1,用服务名 db、redis。

cat > Dockerfile <<'EOF'
FROM python:3.11-slim
WORKDIR /app
COPY app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
EOF

cat > compose.yaml <<'EOF'
services:
  api:
    build: .
    ports:
      - "8000:8000"
    environment:
      POSTGRES_DB: demo
      POSTGRES_USER: demo
      POSTGRES_PASSWORD: demo123
    depends_on:
      - db
      - redis
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: demo
      POSTGRES_USER: demo
      POSTGRES_PASSWORD: demo123
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  pgdata:
EOF

开跑!屏幕右边我开一个计时器:

docker compose up -d --build
docker compose ps
docker compose logs -f api

我实测第一次构建 58 秒,镜像缓存后重建 7 秒。访问接口:

curl -w "\n耗时: %{time_total}s\n" http://127.0.0.1:8000/health

返回 {"status":"ok","redis":"pong"},本机平均 0.018s。哇这个前后对比很明显:以前手动装 Python、Postgres、Redis 大概 20 分钟,还容易端口冲突;现在一个 compose 文件,2 分钟内复现。

第3章:常见翻车点与验证清单

第1周环境搭建第2周核心开发第3周测试优化第4周正式发布

如果你这里炸了,别慌,按这个顺序排:

  1. 端口占用:ss -lntp | grep 8000,被占用就把 "8000:8000" 改成 "18000:8000"
  2. 数据库连不上:不要在容器里连 localhost,Compose 网络内用服务名 db
  3. 数据丢失:Postgres 必须挂 volume,验证用 docker volume ls
  4. 镜像拉不动:优先尝试官方源、公司内网镜像仓库、或自建 registry;免费方案够用但高峰期可能超时。

接下来做最终验证,这就是上线前检查:

docker compose ps
docker exec -it app-demo-db-1 pg_isready -U demo
docker exec -it app-demo-redis-1 redis-cli ping
curl http://127.0.0.1:8000/health
docker stats --no-stream

我的结果:api 内存 78MiB,Postgres 42MiB,Redis 6MiB;连续 curl 100 次无 5xx,说明编排、网络、持久化都 OK。要停止但保留数据:docker compose down;要连数据一起清空:docker compose down -v

如果你只是为了拉镜像或查资料,免费VPN、官方镜像源、公司代理都可以先试;如果确实需要备用网络工具,也可以把 Roxi 这类选项作为补充参考:https://wizzegroup.com。好了,能跑就扣个 1,翻车把日志贴出来,我们下一期继续拆!

延伸阅读