2. Docker基础
在量化实盘服务部署中,Docker 的价值不只是“把程序跑起来”,而是把策略代码、Python 依赖、系统库、配置文件与运行环境一起封装成可复制、可回滚、可迁移的交付单元。要真正用好它,必须先厘清镜像、容器、仓库、Dockerfile、数据卷和网络这六个核心概念之间的关系。它们不是并列的工具名词,而是一条从“构建”到“运行”再到“持久化与通信”的完整链路。
一、镜像与容器:模板与实例的关系
镜像是只读的、分层的文件系统模板,包含运行量化策略所需的操作系统基础、Python 解释器、第三方库、策略代码和启动脚本。容器则是镜像被启动后的运行实例,它在镜像之上增加一个可写层,因此容器内的临时修改不会影响镜像本身。理解“镜像只读、容器可写”是后续排查问题的关键。
常用命令如下:
docker images # 查看本地镜像
docker pull python:3.11-slim # 从仓库拉取镜像
docker run -d --name quant-svc \
-p 8000:8000 \
-v /data/quant:/app/data \
quant-strategy:v1.0 # 启动容器
docker ps -a # 查看所有容器
docker logs -f quant-svc # 跟踪日志
docker exec -it quant-svc bash # 进入容器
docker stop quant-svc && docker rm quant-svc
二、仓库:镜像的分发与版本管理
仓库(Registry)用于存储和分发镜像。Docker Hub 是公共仓库,生产环境更常用私有仓库(如 Harbor、阿里云 ACR、腾讯云 TCR)。量化团队通常将策略镜像推送到私有仓库,服务器通过 docker pull 拉取指定 tag 部署。tag 应体现版本与构建时间,例如 quant-strategy:v1.0.3-20240521,避免使用 latest 导致部署不可追溯。
docker tag quant-strategy:v1.0 registry.example.com/quant/strategy:v1.0
docker push registry.example.com/quant/strategy:v1.0
docker pull registry.example.com/quant/strategy:v1.0
三、Dockerfile:把部署过程代码化
Dockerfile 是构建镜像的“配方”。对量化服务而言,它需要完成依赖安装、代码复制、时区设置、非 root 用户创建和启动命令定义。下面是一个精简示例:
FROM python:3.11-slim
WORKDIR /app
ENV TZ=Asia/Shanghai
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN useradd -m quant && chown -R quant:quant /app
USER quant
EXPOSE 8000
CMD ["python", "main.py"]
构建与运行:
docker build -t quant-strategy:v1.0 .
docker run -d --name quant-svc -p 8000:8000 quant-strategy:v1.0
四、数据卷与网络:持久化与通信
容器删除后其可写层数据会丢失,因此行情数据、成交记录、日志和配置文件必须放在数据卷或宿主机目录中。数据卷由 Docker 管理,适合数据库和长期数据;绑定挂载(bind mount)适合开发阶段直接映射代码和配置。
docker volume create quant-data
docker run -d --name quant-svc \
-v quant-data:/app/data \
-v /etc/quant/config.yaml:/app/config.yaml:ro \
quant-strategy:v1.0
网络方面,同一自定义网络中的容器可通过容器名互相访问。例如策略容器连接 Redis 容器时,直接使用 redis:6379 即可,无需关心 IP 变化。
docker network create quant-net
docker run -d --name redis --network quant-net redis:7
docker run -d --name quant-svc --network quant-net quant-strategy:v1.0
| 核心对象 | 作用 | 量化场景示例 | 常用命令 |
|---|---|---|---|
| 镜像 | 只读模板 | 封装策略与依赖 | build / pull / images |
| 容器 | 运行实例 | 实盘策略进程 | run / ps / logs / exec |
| 仓库 | 镜像分发 | 私有 Registry 版本管理 | push / pull / tag |
| Dockerfile | 构建配方 | 依赖安装与启动定义 | docker build |
| 数据卷 | 持久化存储 | 行情、成交、日志 | volume create / -v |
| 网络 | 容器通信 | 策略连接 Redis/数据库 | network create / -p |
五、常见误区与复盘
- 误区一:把容器当虚拟机长期修改。在容器内直接改代码、装包,重启后全部丢失。正确做法是修改 Dockerfile 后重新构建镜像。
- 误区二:数据放在容器内。容器删除即数据丢失。量化服务必须将数据目录挂载到卷或宿主机。
- 误区三:使用 latest 标签部署。无法追溯版本,回滚困难。应使用语义化版本加构建日期。
- 误区四:端口随意暴露。实盘服务只需暴露必要端口,数据库和 Redis 应仅在内网网络中通信。
- 误区五:忽略时区与编码。量化交易对时间敏感,镜像中应设置
TZ=Asia/Shanghai并统一 UTF-8 编码。
掌握这六个核心对象后,后续的 Compose 编排、多容器协作、日志采集与监控才有稳定的基础。建议在本地先完成一次“构建镜像 → 启动容器 → 挂载数据卷 → 容器间通信 → 推送仓库”的完整闭环,再进入实盘部署环节。