Step by Step 在Docker中运行inStock股票系统
背景介绍:
InStock股票系统,抓取每日股票、ETF关键数据,计算股票技术指标、筹码分布,识别K线各种形态,综合选股,内置多种选股策略,支持选股验证回测,支持自动交易,支持批量时间,运行高效,支持PC、平板、手机移动设备显示,是量化投资的好帮手。
项目地址:https://github.com/myhhub/stock
Docker镜像:https://hub.docker.com/r/mayanghua/instock
以上两个地址,尤其是Docker地址不是每个人都能访问,本项目需要使用instock和mariadb/mysql两个容器,找来找去,找到cherry这个人的网盘:
解决网络问题无法下载容器镜像的问题。通过网盘进行下载EXE文件后,双击解压成容器镜像。原文在此:https://www.zhihu.com/tardis/zm/art/12452736874?source_id=1005
阿里云盘:https://www.alipan.com/s/WFKpViJaf7g
夸克网盘:https://pan.quark.cn/s/6583aa99b455
环境准备
方法一:windows11下安装ORACLE的Virtual Box,在其中安装Ubuntu系统
Virtual BOX: https://www.virtualbox.org/wiki/Linux_Downloads
Ubuntu桌面版:https://cn.ubuntu.com/download/desktop
方法二:windows10以上,可以直接安装WSL2,再安装Ubuntu,也很流行
官方方法:https://learn.microsoft.com/zh-cn/windows/wsl/install
Ubuntu之后的安装流程
Python 安装
Docker 及 portainer-ce安装
Mysql 安装
MariaDB 安装
原文指示:(参考原项目地址,以下用截图表示)
本人实际操作如下:
为了数据保存,先创建一个目录作为容器的映射目录(此处目录和原文不同)
mkdir /var/lib/mariadb
然后配置文件,把该目录映射到宿主机(因为我的3306端口留给mysql用了,所以改用3307)
docker run --name InStockDbService \
-p 3307:3307 \
-e MYSQL_ROOT_PASSWORD=root \
-v /var/lib/mariadb:/var/lib/mariadb \
-d mariadb:latest
-name 启动容器设置容器名称为 mariadb
-p 设置容器的3306端口映射到主机3306端口
-e MYSQL_ROOT_PASSWORD 设置环境变量数据库 root 用户密码为输入数据库 root 用户的密码
-v 设置容器目录/var/lib/mariadb 映射到本地目录 /var/lib/mariadb
-d 后台运行容器 mariadb 并返回容器id
此命令一般格式如下:
sudo docker run --name my_mariadb \
-e MYSQL_ROOT_PASSWORD=root_password \
-e MYSQL_DATABASE=database_name \
-e MYSQL_USER=user_name \
-e MYSQL_PASSWORD=user_password \
-v mariadb_data:/var/lib/mysql \
-d my_mariadb
运行结果如下:
然后在portainer中可以看到InStockDbService容器已经在运行中:
接下来,我们查看一下容器中的数据库
方法一:docker exec进入容器,查看
在容器中使用ip addr命令
方法二:在portainer中,查看该容器的ip
获得了IP还不死心,还要PING一下看看,再用命令连接
mysql -h 172.17.0.3 -u root -p
终于让我给连上了
(以 ID 为 f5605d02f9f5 的 MariaDB 容器为例)
docker exec -it f5605d02f9f5 bash
> root@f5605d02f9f5:/#
# 已经进入容器 f5605d02f9f5 中
root@f5605d02f9f5:/# mysql -u root -p
Enter password: my-secret-pw
> Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.8-MariaDB-10.2.8+maria~jessie mariadb.org binary distribution
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
# 以 root 身份进入 mysql client
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
# 可以看到数据库内数据库信息
python依赖库安装
于是我来到instock的目录,找到requirements.txt
准备用下面的命令直接升级
python pip install -r requirements.txt --upgrade
但是不幸却遇到错误提示
这次机智的我耐心的询问了DeepSeek,它教我配置 python 指向 python3
如果你希望使用 python 命令而不是 python3,可以通过以下方法配置:
安装 python-is-python3 包,运行以下命令安装 python-is-python3 包:
bash
Copy
sudo apt update
sudo apt install python-is-python3
安装完成后,python 命令将指向 python3。但是。。。
完成这一步后,再安装instock镜像
原命令更新为:
docker run -dit --name InStock --link=InStockDbService \
-p 9988:9988 \
-e db_host=InStockDbService \
instock:latest
遇到错误,这个COPY来的镜像文件可能有问题:
增加DNS试试
docker run -dit --name InStock --link=InStockDbService \
--dns=8.8.8.8 \
--dns=8.8.4.4 \
-p 9988:9988 \
-e db_host=InStockDbService \
instock:latest
此路不通,暂且放下不表,刚好看到作者写的另外一条路:
docker run -dit --name InStock \
-p 9988:9988 \
-e db_host=localhost \
-e db_user=root \
-e db_password=root \
-e db_database=instockdb \
-e db_port=3307 \
instock:latest
看来一定是哪里出了问题
本人是小白,但也不会轻易被困难吓倒,既然下载不了镜像文件,下了别人的镜像文件又挂载不上,那我只能自己上了
直接去github主页上下载zip文件,然后自己打包吧!
自己找一个目录,把zip文件放进去解压,我找的目录是这个:/home/Documents/MyData/Stocks
解压了stock-master.zip这个文件之后,得到目录stock,它下面有docker目录,里面有我们必须的build.sh和Dockerfile
接下来,是豆包教我的。
问:在stock目录下的docker目录里发现了Dockerfile和build.sh,应如何处理才能生成镜像?
豆包答:
若要依据stock目录下docker目录里的Dockerfile和build.sh来生成 Docker 镜像,可按如下步骤操作:
- 确认当前所在目录
首先要保证你当前所在的目录是stock/docker,因为build.sh脚本中的相对路径是基于此目录的。你可以使用以下命令进入该目录:
bash #这一条我没运行,也不知道是干啥的
cd stock/docker
- 赋予build.sh脚本执行权限
在 Linux 或者 macOS 系统中,脚本文件需要有执行权限才能运行。你可以使用chmod命令来赋予脚本执行权限:
bash
`chmod +x build.sh`
- 运行build.sh脚本
运行该脚本就可以开始构建和推送 Docker 镜像,使用以下命令:
bash
./build.sh
看到如图过程就说明它在干了。。。耐心等等
-
查看脚本执行过程和结果(自动完成的部分)
运行脚本之后,你会看到构建和推送镜像的过程信息。脚本中的命令会依次执行以下操作:
清除旧的stock目录。
同步stock目录下的文件到当前目录,同时排除一些不需要的文件和目录。
复制cron目录到当前目录。
使用docker build命令构建 Docker 镜像,会生成两个标签,一个是当前年月(例如202503),另一个是latest。
使用docker push命令将构建好的镜像推送到 Docker 镜像仓库。 -
检查镜像是否生成成功
你可以使用以下命令查看本地的 Docker 镜像列表,确认镜像是否已经构建成功:
bash
docker images
如果看到mayanghua/instock镜像,并且有对应的标签(如202503和latest),则说明镜像已经构建成功。
然后,确保刚才建的Mariadb的容器在运行的前提下,如图
再输入命令:
docker run -dit --name InStock --link=InStockDbService \
-p 9988:9988 \
-e db_host=InStockDbService \
mayanghua/instock:latest
出现如下图示,则表示成功。
安装 TA-Lib 共享静态库和头文件
安装 TA-Lib C/C++ 共享静态库和头文件
按作者的指引做就安装好了:
https://ta-lib.org/install/ 下载最新 ta-lib 共享静态库和头文件,按照说明进行安装。
安装方式按官方建议,会更简单:
Windows Executable Installer
macOS Homebrew
Linux Debian packages
系统运行
启动InStock容器后,会自动运行,首先会初始化数据、启动web服务。然后每小时执行“基础数据抓取”,每天17:30执行所有的数据抓取、处理、分析、识别。
打开浏览器,输入:http://localhost:9988/ ,即可使用本系统的可视化功能。
哈哈哈,历经千辛万苦,我终于取到真经!^^
每天运行/历史数据
本程序是根据上一日的历史数据,来抓取、处理、分析、识别、回测,
所以每天打开它之后,到Ubuntu的根目录下,运行下面命令:
docker exec -it InStock bash
cat InStock/instock/bin/run_job.sh
第二天我打开它,再运行
后续我想把下面这些py文件一一细细研究学习一下
/usr/local/bin/python3 /data/InStock/instock/job/execute_daily_job.py
echo ------整体作业 支持批量作业------
echo 当前时间作业 python execute_daily_job.py
echo 1个时间作业 python execute_daily_job.py 2023-03-01
echo N个时间作业 python execute_daily_job.py 2023-03-01,2023-03-02
echo 区间作业 python execute_daily_job.py 2023-03-01 2023-03-21
echo ------单功能作业 除了创建数据库 其他都支持批量作业------
echo 创建数据库作业 python init_job.py
echo 综合选股作业 python selection_data_daily_job.py
echo 基础数据实时作业 python basic_data_daily_job.py
echo 基础数据收盘2小时后作业 python backtest_data_daily_job.py
echo 基础数据非实时作业 python basic_data_other_daily_job.py
echo 指标数据作业 python indicators_data_daily_job.py
echo K线形态作业 klinepattern_data_daily_job.py
echo 策略数据作业 python strategy_data_daily_job.py
echo 回测数据 python backtest_data_daily_job.py
数据库管理
自从运行容器的时候进入过数据库,到后面一直没进去看过,上次的命令:
docker run --name InStockDbService \
-p 3307:3307 \
-e MYSQL_ROOT_PASSWORD=root \
-v /var/lib/mariadb:/v
这是portainer中容器运行的状态
可为了研究数据,我得再进去看看
可是为啥就连不上了呢?于是机智的我问了问豆包,它是这么回答的:
从你给出的错误信息来看,问题并非出在连接 MariaDB 容器这一步,而是本地 MySQL 客户端在读取配置文件 /etc/mysql/my.cnf 时碰到了问题。下面为你详细分析并提供解决办法:
错误原因分析
错误信息 mysql: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 22. 表明,在配置文件 /etc/mysql/my.cnf 的第 22 行存在一个没有前置组(例如 [mysql]、[mysqld] 等)的选项。在 MySQL 配置文件里,所有选项都必须归属于某个组,不然客户端就无法正确解析该配置文件。
于是我用了命令:
sudo nano /etc/mysql/my.cnf
把配置文件改成这样(添加了倒数2行的信息):
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
[mysqld]
bind-address = 0.0.0.0
然后
真是把人搞的快没脾气了。。。把下面这两个命令运行一下,以便使我的root用户可用
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
然后我就想转到图形界面继续深入研究一下这里的instockdb了
本来是想从windows上访问的,但试了好几次,都不行,可能是因为virtualbox套了Ubuntu, 再装docker再装了mariadb的缘故
我不如直接从ubuntu上查看数据库得了,于是安装了它
我是这么设置的(3307连不上,3306倒是连上了):
功夫不负有心人,终于见到庐山真面目了:
功能解析
execute_daily_job.py
用vs code打开这个文件,再让豆包出来解释一下代码
问题汇总
数据库连接
MySQL数据库连接
发生异常: ModuleNotFoundError
No module named 'mysql'
File "/home/chengjon/Documents/monitor_instock_mariadb", line 1, in
import mysql.connector
ModuleNotFoundError: No module named 'mysql'
去官网下载mysql.connector:https://dev.mysql.com/downloads/repo/apt/
保存到Ubuntu本地,在空白处右键“open in terminal”
运行命令:
sudo dpkg -i mysql-apt-config_0.8.33-1_all.deb
一顿操作猛如虎,弄完之后,ModuleNotFoundError: No module named 'mysql',问题还在,我也是懵了
哦,想起来了,这步弄完,还要执行命令:apt update
弄完也没搞定。。。唉
只好用虚拟环境来解决了(Deepseek告诉我的)
于是照猫画虎:
如果忘了建的虚拟环境咋办?由于在 Linux 系统中,虚拟环境本质上是一个包含 Python 解释器和相关依赖的目录。如果你创建了多个虚拟环境,可以通过以下命令查看和管理它们:
find ~ -name "activate" -type f
或者
sudo find / -type d -name "myenv"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)