2. Docker基础

在量化实盘服务部署中,Docker 的价值不只是“把程序跑起来”,而是把策略代码、Python 依赖、系统库、配置文件与运行环境一起封装成可复制、可回滚、可迁移的交付单元。要真正用好它,必须先厘清镜像、容器、仓库、Dockerfile、数据卷和网络这六个核心概念之间的关系。它们不是并列的工具名词,而是一条从“构建”到“运行”再到“持久化与通信”的完整链路。

Docker 核心对象关系与量化服务映射 Dockerfile 构建指令与依赖声明 策略代码 + 环境 镜像 Image 只读模板,分层存储 可版本化、可分发 容器 Container 镜像的运行实例 可启停、可隔离 仓库 Registry push / pull 数据卷 Volume 持久化行情/日志/配置 网络 Network 容器间通信与端口映射 量化实盘服务 策略进程 + 数据 + 通信

一、镜像与容器:模板与实例的关系

镜像是只读的、分层的文件系统模板,包含运行量化策略所需的操作系统基础、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
量化实盘服务建议使用固定版本的基础镜像(如 python:3.11-slim),避免因基础镜像漂移导致回测与实盘环境不一致。

二、仓库:镜像的分发与版本管理

仓库(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
不要把 、数据库密码直接写进 Dockerfile 或镜像层。应通过环境变量、Docker Secret 或挂载配置文件注入,否则镜像一旦被推送,敏感信息将随层永久保留。

四、数据卷与网络:持久化与通信

容器删除后其可写层数据会丢失,因此行情数据、成交记录、日志和配置文件必须放在数据卷或宿主机目录中。数据卷由 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 编排、多容器协作、日志采集与监控才有稳定的基础。建议在本地先完成一次“构建镜像 → 启动容器 → 挂载数据卷 → 容器间通信 → 推送仓库”的完整闭环,再进入实盘部署环节。