基于 Docker 部署 DolphinDB

Docker 只是轻量化的资源隔离,DolphinDB 部署在 Docker 环境和非 Docker 环境下的运行性能差异不明显,可根据业务需求选择合适的运行环境。本文介绍如何使用 Docker 部署一个社区版/企业版 DolphinDB 单机服务。

环境准备

  • 安装 Docker

    Docker 可以方便地在 Linux /MAC/Windows 平台安装,安装方法请参考 Docker 官方文档

  • 拉取 DolphinDB 的 Docker 镜像

    最新 Docker 镜像可以通过 Docker 官方镜像仓库 获取, 以 tag 为 v2.00.5 为例:

    docker pull dolphindb/dolphindb:v2.00.5
  • 主机信息

    主机名IP部署服务数据盘挂载
    host1xxx.xxx.xx.xxdolphindb/ddbdocker

快速体验

Docker(X86 架构版)

  • 登录机器执行以下脚本,创建一个 Docker 容器:

    docker run -itd --name dolphindb \
      --hostname host1 \
      -p 8848:8848 \
      -v /etc:/dolphindb/etc \
      dolphindb/dolphindb:v2.00.5 \
      sh
  • 参数解释:

    • --hostname: 容器的主机名称(用于采集指纹制作企业版 Licence)

      可通过 hostname shell 命令查看主机名称。

    • -p:其中前一个 8848 端口为宿主机端口,后一个 8848 端口为映射到 DolphinDB 容器中的端口(DolphinDB 单机版默认端口)。启动后可通过本机 8848 端口访问 DolphinDB。

    • -v:表示使用映射宿主机的 /etc目录到容器中的 /dolphindb/etc 路径,用于采集指纹制作企业版 License。

    • --name:为容器名。指定容器名以便对该容器进行相关操作,例如,通过容器名查看容器相关信息等。若不指定,Docker 会随机分配一个容器名。

    • dolphindb/dolphindb:v2.00.5:必填参数,用于指定构建容器的镜像。镜像名称必须完整(包含dolphindb仓库及版本信息),例如:dolphindb/dolphindb:v2.00.5

  • 检测容器是否成功构建

    执行如下命令

    docker ps|grep dolphindb

    期望输出

    347bfa54df86   dolphindb/dolphindb:v2.00.5   "sh -c 'cd /data/ddb…"   20 seconds ago   Up 19 seconds   0.0.0.0:8848->8848/tcp, :::8848->8848/tcp   dolphindb
  • 客户端连接 DolphinDB 进行测试。

    详细教程参考使用客户端

Docker(ARM架构)

登录机器执行以下脚本,创建一个 Docker 容器:

docker run -itd --name dolphindb \
  --hostname cnserver10 \
  -p 8848:8848 \
  -v /etc:/dolphindb/etc \
  dolphindb/dolphindb-arm64:v2.00.7 \
  sh

参数解释:

  • --hostname:容器的主机名称(用于采集指纹制作企业版 License)
  • -p:其中前一个 8848 端口为宿主机端口,后一个8848端口为映射到 DolphinDB容器中的端口(DolphinDB 单机版默认端口)。启动后可通过本机 8848 端口访问 DolphinDB。
  • -v:表示使用映射宿主机的 /etc目录到容器中的 /dolphindb/etc 路径,用于采集指纹制作企业版 License。
  • --name:为容器名。指定容器名以便对该容器进行相关操作,例如,通过容器名查看容器相关信息等。若不指定,Docker 会随机分配一个容器名。
  • dolphindb/dolphindb-arm64:v2.00.7:必填参数,用于指定构建容器的镜像。镜像名称必须完整(包含dolphindb仓库及版本信息),例如:dolphindb/dolphindb-arm64:v2.00.7

检测容器是否成功构建

执行如下命令

docker ps|grep dolphindb

期望输出

347bfa54df86   dolphindb/dolphindb-arm64:v2.00.7   "sh -c 'cd /data/ddb…"   20 seconds ago   Up 19 seconds   0.0.0.0:8848->8848/tcp, :::8848->8848/tcp   dolphindb

客户端连接 DolphinDB 进行测试。

详细教程参考使用客户端

生产环境部署建议

以下内容以 X86 架构版为例。

在线部署

  • 登录机器执行 shell 脚本,下载安装包并配置容器映射文件,以 v2.00.5 为例

    git clone --depth=1 https://github.com/dolphindb/dolphindb-k8s && \
    cd dolphindb_k8s/docker-single && \
    sh map_dir.sh

注意:由于新建的目录是 /ddbdocker,可能遇到用户新建权限问题,需自行修改可以用户可以创建权限的文件夹 -->

执行下面命令:

tree /ddbdocker

期望输出:

├── ddbdocker
│   ├── data
│   ├── ddb_related
│   │   ├── dolphindb.cfg
│   │   └── dolphindb.lic
│   └── plugins
│       ├── hdf5
│       │   ├── libPluginHdf5.so
│       │   └── PluginHdf5.txt
│       ├── mysql
│       │   ├── libPluginMySQL.so
│       │   └── PluginMySQL.txt
│       ├── odbc
│       │   ├── libPluginODBC.so
│       │   └── PluginODBC.txt
│       └── parquet
│           ├── libPluginParquet.so
│           └── PluginParquet.tx

文件夹说明如下:

文件(夹)名文件(夹)用途宿主机映射路径容器映射路径
dolphindb.cfg单节点模式下的 DolphinDB 配置文件/ddbdocker/ddb_related/dolphindb.cfg/data/ddb/server/dolphindb.cfg
dolphindb.licDolphinDB 的证书文件(企业版的需要联系工程师)/ddbdocker/ ddb_related/dolphindb.lic/data/ddb/server/dolphindb.lic
plugins存储 DolphinDB 插件/ddbdocker/plugins/data/ddb/server/plugins
data用来存储 DolphinDB 数据节点相关文件(例如元数据,流数据,数据表等)/ddbdocker/data/data/ddb/server/data

执行下面命令启动容器:

docker run -itd --name dolphindb \
-p 8848:8848 \
--ulimit nofile=1000000:1000000 \
  -v /etc:/dolphindb/etc \
  -v /ddbdocker/ddb_related/dolphindb.cfg:/data/ddb/server/dolphindb.cfg \
  -v /ddbdocker/ddb_related/dolphindb.lic:/data/ddb/server/dolphindb.lic \
  -v /ddbdocker/plugins:/data/ddb/server/plugins \
  -v /ddbdocker/data:/data/ddb/server/data \
  dolphindb/dolphindb:v2.00.5 \
  sh \
  -stdoutLog 1

预期输出容器 id3cdfbab788d0054a80c450e67d5273fb155e30b26a6ec6ef8821b832522474f5

  • 使用 DolphinDB 客户端连接 DolphinDB 进行测试

    详细教程参考使用客户端

离线部署

  • 在DolphinDB官网下载并安装对应版本的 DolphinDB server 安装镜像包。

  • 在下载的 zip 压缩包的同目录添加 shell 脚本 map_dir.sh,内容如下:

    #!/bin/bash
    set -e
    clear
    #创建用于存储相应文件(夹)的空白目录
    dir1=/ddbdocker
    dir2=/ddbdocker/ddb_related
    
    if [ ! -e "$dir1" ]; 
    then
        mkdir $dir1
    fi
    
    if [ ! -e "$dir2" ]; 
    then
        mkdir $dir2
    fi
    
    
    #获取安装包
    ddb_zip=$(ls ./DolphinDB_Linux64_V*.zip)
    ddb_name=$(basename $ddb_zip .zip)
    
    if [ -e $ddb_zip ];
    then
        echo -e "上传软件安装包成功" "\033[32m UpLoadSuccess\033[0m"
    else
        echo -e "无法找到安装包,请上传至该目录" "\033[31m UpLoadFailure\033[0m"
        echo ""
        sleep 1
        exit
    fi
    #解压安装包
    unzip "${ddb_zip}" -d "${ddb_name}" 
    if [ -d ./$ddb_name ];then
        echo -e "解压软件安装包成功" "\033[32m UnzipSuccess\033[0m"
    else
        echo -e "解压安装包失败,请检查安装包是否下载完整" "\033[31m UnzipFailure\033[0m"
        echo ""
        sleep 1
        exit
    fi
    
    #获取相应路径下的源和目标文件(夹)
    source_f1=./${ddb_name}/server/dolphindb.cfg
    source_f2=./${ddb_name}/server/dolphindb.lic
    source_dir4=./${ddb_name}/server/plugins
    
    f1=/ddbdocker/ddb_related/dolphindb.cfg
    f2=/ddbdocker/ddb_related/dolphindb.lic
    dir3=/ddbdocker/data
    dir4=/ddbdocker/plugins
    
    
    #编写函数对各目标路径进行遍历并通过设置条件语句来判断是否要对已有的文件进行覆盖
    function isCovered() {  
    
    for i in $*;
    do
        if [ -e $i ];
        then
            #echo $i
            read -p "The $i has already existed, would you want to recover or clean it and other similar ones?(y/n)" answer
            if [ $answer=="y" ];
            then
                break
            else
                echo ""
                sleep 1
                exit
            fi
        fi
    done
    }
    
    isCovered $f1 $f2 $dir3 $dir4
    
    #进行相应文件(夹)的拷贝
    cp -rpf $source_f1 $f1
    cp -rpf $source_f2 $f2
    
    if [ -e "$dir3" ]; 
    then
        rm -rf $dir3
    fi
    
    mkdir $dir3
    cp -rpf $source_dir4 $dir4
    
    #删除解压的安装包
    rm -rf ./${ddb_name}
    
  • 执行 shell 脚本,构建数据映射目录

    sh map_dir.sh && tree /ddbdocker

期望输出:

├── ddbdocker
│   ├── data
│   ├── ddb_related
│   │   ├── dolphindb.cfg
│   │   └── dolphindb.lic
│   └── plugins
│       ├── hdf5
│       │   ├── libPluginHdf5.so
│       │   └── PluginHdf5.txt
│       ├── mysql
│       │   ├── libPluginMySQL.so
│       │   └── PluginMySQL.txt
│       ├── odbc
│       │   ├── libPluginODBC.so
│       │   └── PluginODBC.txt
│       └── parquet
│           ├── libPluginParquet.so
│           └── PluginParquet.tx

文件夹说明如下:

文件(夹)名文件(夹)用途宿主机映射路径容器映射路径
dolphindb.cfg单节点模式下的 DolphinDB 配置文件/ddbdocker/ddb_related/dolphindb.cfg/data/ddb/server/dolphindb.cfg
dolphindb.licDolphinDB 的证书文件(企业版的需要联系工程师)/ddbdocker/ ddb_related/dolphindb.lic/data/ddb/server/dolphindb.lic
plugins存储 DolphinDB 插件/ddbdocker/plugins/data/ddb/server/plugins
data用来存储 DolphinDB 数据节点相关文件(例如元数据,流数据,数据表等)/ddbdocker/data/data/ddb/server/data

执行下面命令启动容器:

docker run -itd --name dolphindb \
  -p 8848:8848 \
  --ulimit nofile=1000000:1000000 \
  -v /etc:/dolphindb/etc \
  -v /ddbdocker/ddb_related/dolphindb.cfg:/data/ddb/server/dolphindb.cfg \
  -v /ddbdocker/ddb_related/dolphindb.lic:/data/ddb/server/dolphindb.lic \
  -v /ddbdocker/plugins:/data/ddb/server/plugins \
  -v /ddbdocker/data:/data/ddb/server/data \
  dolphindb/dolphindb:v2.00.5 \
  sh \
  -stdoutLog 1

预期输出容器 id3cdfbab788d0054a80c450e67d5273fb155e30b26a6ec6ef8821b832522474f5

  • 使用 DolphinDB 客户端连接 DolphinDB 进行测试

    详细教程参考使用客户端

常见问题

如何自定义配置文件

在宿主机上找到映射的 DolphinDB 配置文件 dolphindb.cfg,此处的路径为/ddbdocker/ddb_related/dolphindb.cfg,其文件内容如下:

localSite=localhost:8848:local8848
mode=single
maxMemSize=32
maxConnections=512
workerNum=4
localExecutors=3
dataSync=1
chunkCacheEngineMemSize=2
newValuePartitionPolicy=add
maxPubConnections=64
subExecutors=4
subPort=8849
lanCluster=0
  • 重要参数解释:

    • localSite: 节点的局域网信息,格式为 host:port:alias。单实例中默认值为 localhost:8848:local8848。其中8848为 DolphinDB 运行的端口号,必须填写。
    • workerNum: 常规作业的工作线程的数量,决定了节点最大并发前台作业数。默认值是 CPU 的内核数。
    • localExecutors: 本地执行线程的数量,决定了节点最大并发子任务数。默认值是 CPU 的内核数-1。
    • maxMemSize:分配给 DolphinDB 的最大内存空间(以 GB 为单位)。如果该参数设为0,表明 DolphinDB 的内存使用没有限制。建议设置为比机器内存容量低的一个值。

如何升级版本

执行如下命令拉取新版本的 DolphinDB 镜像,下例拉取的镜像为 2.00.6 版本:

  docker pull dolphindb/dolphindb:v2.00.6

执行下列命令,进行升级:

  docker run -itd --name dolphindb \
    -p 8848:8848 \
    --ulimit nofile=1000000:1000000 \
    -v /etc:/dolphindb/etc \
    -v /ddbdocker/ddb_related/dolphindb.cfg:/data/ddb/server/dolphindb.cfg \
    -v /ddbdocker/ddb_related/dolphindb.lic:/data/ddb/server/dolphindb.lic \
    -v /ddbdocker/plugins:/data/ddb/server/plugins \
    -v /ddbdocker/data:/data/ddb/server/data \
    dolphindb/dolphindb:v2.00.6 \
    sh \
    -stdoutLog 1

DolphinDB 升级只是替换二进制安装包,需要保留之前版本的 dolphindb.cfg(DolphinDB 的配置), dolphindb.lic(DolphinDB 的证书文件), plugins(DolphinDB 内置的插件), data(DolphinDB 内置的数据文件等)目录,以保证配置不更改和数据不丢失。

注意

  1. 由于 Docker 容器名要求唯一,如果之前的容器依旧保留,则新容器名必须要和之前的容器名不同;
  2. 需要注意端口号不被占用。

通过 GUI 连接该节点,执行以下命令查看版本信息,检查升级是否成功。

  version()

期望输出:

  2.00.6

报错及解决方案

  • 报错信息如下

    Can't find time zone database. Please use parameter tzdb to set the root directory of time zone database.

    解决方案: 若 Docker 镜像中不包含 tzdata 包,比如 ubuntu:latest,会导致 DolphinDB 启动报如上错误,执行下述命令安装 tzdata 包:

    apt-get install tzdata
  • 报错信息如下

    <ERROR> : Failed to retrieve machine fingerprint

    解决方案: 由于正式 License 需要校验服务器硬件信息,而 Docker 没有权限获取此信息,启动时日志中会报告上述异常。需在 docker run 添加如下启动参数:

    -v /etc:/dolphindb/etc 
  • 报错信息如下

    docker: Error response from daemon: driver failed programming external connectivity on endpoint dolphindb (178a842284d64fbe128ff3f1188ead76ef4072c9149226f8bf62dc7795a58603): Error starting userland proxy: listen tcp4 0.0.0.0:8848: bind: address already in use.

    解决方案:更换宿主机的端口号,或用如下命令查看端口号占用情况:

    lsof -i:8848
    COMMAND     PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
    dolphindb 17238 root    6u  IPv4 231927135      0t0  TCP *:8848 (LISTEN)