换一台机器重装一遍环境?不存在的。本文用 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 让你的量化系统从「只能在我机器上跑」变成「在任何机器上都能跑」。下一步:定时任务自动化,让数据每天自己更新。