FastAPI+PostgreSQL+Redis 一机上线:Docker Compose 容器化部署实战脚本
第1章:OK so,先把项目装进容器
兄弟们开机!这里是 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章:常见翻车点与验证清单
如果你这里炸了,别慌,按这个顺序排:
- 端口占用:
ss -lntp | grep 8000,被占用就把"8000:8000"改成"18000:8000"。 - 数据库连不上:不要在容器里连 localhost,Compose 网络内用服务名
db。 - 数据丢失:Postgres 必须挂 volume,验证用
docker volume ls。 - 镜像拉不动:优先尝试官方源、公司内网镜像仓库、或自建 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,翻车把日志贴出来,我们下一期继续拆!