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


相关推荐
修己xj14 小时前
项目代号:吞金兽1.0 —— 从立项到半岁,一个家庭的项目管理实战纪实
产品
极客三刀流18 小时前
idea执行maven里的生命周期,报错信息'powershell' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 Cannot start maven from wrapper
产品
用户5591357826319 小时前
量化交易 PostgreSQL 建表指南:K 线数据 + 信号记录 + 性能优化
产品
极客三刀流2 天前
windows版jdk版本管理工具
产品
用户559135782635 天前
四大免费数据源代码实测
产品
用户559135782636 天前
Python + PostgreSQL + Docker 技术选型实战
产品
AskHarries7 天前
我如何从1000个产品里筛出方向
人工智能·产品·全栈
华洛8 天前
讲讲如何在传统产品中挖掘AI需求
javascript·产品经理·产品
小北的AI科技分享8 天前
产品管理:从概念到落地的全流程解析
产品··经理