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


相关推荐
乱码三千9 小时前
关于让我的 AI 智能体去当三陪帮我打工赚钱这件事,需要从长计议
人工智能·开源·产品
小哈里1 天前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
爱勇宝4 天前
《道德经》第 11 章:真正有用的,常常是你没写出来的那部分
前端·后端·产品
孟陬5 天前
对话流量也能变现?Circeus 收购 Dondy 加速布局,嵌入全渠道场景推送购物车、发货提醒;逐步实现下单、退款自主闭环,全靠聊天指令驱动
产品·投资·资讯
知了一笑7 天前
职场丨岗位减少,职责增加
大数据·人工智能·职场·产品·业务
码农胖大海8 天前
我的第一个产品,只有一段提示词
前端·ai编程·产品
星期一研究室8 天前
豆包工作+飞书,打开“松弛工作”的100种方式
产品·豆包marscode
星期一研究室9 天前
拥有创造力的人,就像一只边牧
人工智能·开源·产品
星期一研究室9 天前
别人家养边牧,我家养了个吞电的Codex
人工智能·产品·资讯
花椒技术11 天前
客服Agent:一个已交付 Agent 的工程实现拆解
agent·ai编程·产品