量化系统 Docker 部署实战:docker-compose 一键拉起 PostgreSQL + 策略引擎

换一台机器重装一遍环境?不存在的。本文用 Docker Compose 把量化系统打包,一行命令全量启动。

痛点

量化系统的环境链路:

text 复制代码
Python 3.11 → TA-Lib(C 编译) → psycopg2 → PostgreSQL 客户端库
                    ↓
              pip install 失败 × 3
              LD_LIBRARY_PATH 不对
              版本冲突...

Docker 一劳永逸:把环境 + 代码 + 配置打包成一个镜像,换机器直接跑。


架构总览

scss 复制代码
docker-compose.yml
├── db          (PostgreSQL 16 Alpine)
├── backend     (Python 3.11 + 策略引擎)
└── pgdata      (持久化卷)

1. docker-compose.yml

yaml 复制代码
version: '3.8'

services:
  db:
    image: postgres:16-alpine
    container_name: quant-db
    environment:
      POSTGRES_DB: quant
      POSTGRES_USER: quant
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./backend/init_db.sql:/docker-entrypoint-initdb.d/01-init.sql:ro
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U quant -d quant"]
      interval: 10s
      retries: 5

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: quant-backend
    environment:
      DATABASE_URL: postgresql://quant:${DB_PASSWORD}@db:5432/quant
      TZ: Asia/Shanghai
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./backend:/app
    restart: unless-stopped

volumes:
  pgdata:

关键配置说明

配置 作用
healthcheck 等 PostgreSQL 就绪后再启动 backend,避免连接失败
restart: unless-stopped 服务器重启后自动拉起
pgdata 删容器不丢数据,docker compose down -v 才清空
${DB_PASSWORD} .env 文件读取,不入 Git

创建 .env 文件:

bash 复制代码
DB_PASSWORD=your_secure_password_here

2. backend 目录结构

text 复制代码
backend/
├── Dockerfile
├── requirements.txt
├── app.py              # 主入口
├── fetch_data.py       # 拉行情
├── run_strategy.py     # 策略计算
├── send_alert.py       # 微信通知
├── models.py           # ORM 模型
└── init_db.sql         # 建表 SQL

3. Dockerfile

dockerfile 复制代码
FROM python:3.11-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc libc-dev \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# 分层构建:依赖层(变化少,常命中缓存)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 代码层(变化多)
COPY . .

CMD ["python", "app.py"]

为什么先 COPY requirements.txt? Docker 按层缓存。依赖不常变 → 这层永远命中缓存 → 每次只重建代码层,构建从 3 分钟降到 5 秒。

requirements.txt

text 复制代码
akshare>=1.12.0
pandas>=2.0.0
sqlalchemy>=2.0.0
psycopg2-binary>=2.9.0
TA-Lib>=0.4.0
requests>=2.28.0

锁版本:防止依赖升级导致策略结果漂移。


4. 启动与验证

bash 复制代码
# 一键启动
docker compose up -d --build

# 首次会拉取镜像,之后秒级启动

检查状态:

bash 复制代码
$ docker compose ps
NAME              STATUS    PORTS
quant-db          running   0.0.0.0:5432->5432/tcp
quant-backend     running

两个 running,系统上线。


5. 常用命令速查

bash 复制代码
# 查看实时日志
docker compose logs -f backend

# 重启服务
docker compose restart

# 进入容器调试
docker compose exec backend bash

# 数据库备份
docker compose exec db pg_dump -U quant quant > backup_$(date +%Y%m%d).sql

# 数据库恢复
docker compose exec -T db psql -U quant quant < backup.sql

# 停止(保留数据)
docker compose down

# ⚠️ 停止 + 清空数据库
docker compose down -v

# 更新部署
git pull && docker compose up -d --build

6. 生产环境 Checklist

  • 创建 .env 文件,设置强密码
  • .env*.sql 加入 .gitignore
  • PostgreSQL 端口仅本地监听(去掉 ports 或用防火墙限制来源 IP)
  • 日志限大小防磁盘爆炸:
yaml 复制代码
backend:
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"
  • 定时备份加入 cron(下篇文章做)

小结

操作 命令
启动 docker compose up -d --build
看日志 docker compose logs -f
备份 docker compose exec db pg_dump ...
停止 docker compose down

Docker 让你的量化系统从「只能在我机器上跑」变成「在任何机器上都能跑」。下一步:定时任务自动化,让数据每天自己更新。


相关推荐
自在的LEE2 天前
乒乓球底板防护方案对比:护木液 vs 指甲油 vs 其他方案
产品
chenment11 天前
别再为每个模型单独写一套队列了:用 200 行代码封装多模态统一调用层
人工智能·python·产品
静Yu11 天前
上线只是一个产品的开始
产品
kismet78711 天前
fetch 正常,页面却 404?Nuxt 3 + CDN 跨域下的 preload CORS 陷阱
前端·产品
时光不负努力15 天前
适应AI 带来的变化与挑战
产品
用户5591357826320 天前
第一张 K 线图 — matplotlib + mplfinance 实战
产品
爱勇宝20 天前
我做了一个亲子成长小程序:想把“催孩子”变成“看见孩子”
微信小程序·产品·全栈
用户5591357826320 天前
量化系统定时任务实战:Cron + APScheduler + 企业微信通知
产品
修己xj21 天前
项目代号:吞金兽1.0 —— 从立项到半岁,一个家庭的项目管理实战纪实
产品