注册
Docker 制作达梦数据库单机容器化部署
培训园地/ 文章详情 /

Docker 制作达梦数据库单机容器化部署

harrison辉 2025/09/22 80 1 0

一、环境准备
基础镜像:Kylin V10 SP3(国产化环境常用发行版)
Docker 版本:≥ 20.10
达梦安装包:DMInstall.bin
达梦官方发布的安装介质 dm8_20250729_x86_kylin10_sp1_64.iso需提前将 ISO 镜像解压,提取其中的 DMInstall.bin 作为安装程序
宿主机目录:
/app/dm/dbdata → 存放数据文件目录
/app/dm/dbarch → 存放归档日志目录
注意事项:为避免文件权限冲突,宿主机与容器内运行数据库的用户 UID/GID 必须保持一致。部署前,请在宿主机上创建用户及目录,并赋予正确的权限:

# 创建数据与归档目录
mkdir -p /app/dm/db{data,arch}

# 创建安装用户组(gid=1001)
groupadd -g 1001 -r dinstall

# 创建安装用户 dmdba(uid=1001),并指定默认目录
useradd -u 1001 -r -g dinstall -m -d /home/dmdba -s /bin/bash dmdba

# 授权目录访问权限
chown -R dmdba:dinstall /app/dm/db{data,arch}

二、创建Dockerfile文件
Dockerfile 用于定义和构建达梦数据库的基础镜像,其作用是描述镜像的依赖环境、安装步骤以及运行配置,以下为示例

#1. 选择基础镜像
#FROM docker.io/library/centos:centos7
FROM cr.kylinos.cn/kylin/kylin-server-v10sp3-x86_64:20230324

#2. 创建达梦安装用户和组
RUN groupadd -g 1001 -r dinstall && \
    useradd -u 1001 -r -g dinstall -m -d /home/dmdba -s /bin/bash dmdba

#3. 定义安装文件和环境变量
ARG INSTALL_FILE="DMInstall.bin"

ENV DM_HOME=/home/dmdba/dmdbms/bin \
    SOFT_DIR=/soft \
    PATH=$PATH:$DM_HOME \
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME \
    INSTALL_DIR=/home/dmdba/dmdbms \
    DATA_DIR=/dbdata \
    CONFIG_INI="db_install.ini" \
    CREATE_DB_FILE="db_instance.sh"

#4. 准备目录并复制配置文件
RUN mkdir /soft && mkdir /home/dmdba/dmdbms
COPY $CONFIG_INI $CREATE_DB_FILE $START_FILE $SOFT_DIR/

#5. 执行数据库软件静默安装
# 获取安装包(从内部制品库下载,也可以通过COPY方式)
curl -o base.cloud.com.cn/base-develope/DMInstall.bin $SOFT_DIR/
# 安装数据库软件,不初始化实例
RUN /soft/$INSTALL_FILE -q /soft/$CONFIG_INI

#6. 创建数据库目录并授权
RUN mkdir /dbdata && chown dmdba:dinstall /dbdata -R
RUN mkdir /dbarch && chown dmdba:dinstall /dbarch -R
WORKDIR /home/dmdba/dmdbms/bin

#7. 调用db_instance.sh脚本初始化数据库实例,启动数据库
RUN chown dmdba:dinstall /soft -R && chmod 755 /soft -R
CMD ["/soft/db_instance.sh"]

三、安装配置文件
(1)静默安装文件 db_install.ini
该配置文件用于在 Docker 镜像构建过程中执行 无交互安装(静默安装),避免人工干预。

<?xml version="1.0"?>
<DATABASE>
  <LANGUAGE>EN</LANGUAGE>
  <TIME_ZONE>+08:00</TIME_ZONE>
  <KEY></KEY>
  <INSTALL_TYPE>0</INSTALL_TYPE>
  <INSTALL_PATH>/home/dmdba/dmdbms</INSTALL_PATH>
  <INIT_DB>N</INIT_DB>
</DATABASE>

参数说明:
LANGUAGE:安装语言,支持 EN(英文)和 ZH(中文)。
TIME_ZONE:安装时区,默认 +08:00。
KEY:序列号文件路径,可留空。
INSTALL_TYPE:安装类型,0=典型安装,1=仅服务器端,2=仅客户端。
INSTALL_PATH:数据库软件安装目录。
INIT_DB:是否初始化数据库实例,N 表示不初始化,交由后续脚本 db_instance.sh 自动创建。
(2)实例初始化及启动脚本 db_instance.sh

#!/bin/bash
# create dmdb or start db when running container

DM_HOME=/home/dmdba/dmdbms/bin
DATA_DIR=/dbdata
dbcmd=$DM_HOME/dmserver

function create_db {
    echo "Initializing DM database..."
    $DM_HOME/dminit path=$DATA_DIR charset=${CHARSET:-1} page_size=${PAGE_SIZE:-32} \
    case_sensitive=${CASE_SENSITIVE:-0} ARCH_FLAG=${ARCH_FLAG:-1} PORT_NUM=${PORT_NUM:-5236} \
    SYSDBA_PWD=${SYSDBA_PWD:-Dameng@123} SYSAUDITOR_PWD=${SYSAUDITOR_PWD:-Dameng@123}

    if [ "$ARCH_FLAG" = "1" ]; then
        cat > $DATA_DIR/DAMENG/dmarch.ini << EOF
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbarch
ARCH_FILE_SIZE = 256
ARCH_SPACE_LIMIT = 319600
ARCH_FLUSH_BUF_SIZE = 0
EOF
    fi
}

function start_db {
    echo "Starting DM database..."
    nohup $dbcmd $DATA_DIR/DAMENG/dm.ini -noconsole > /home/dmdba/dmdbms/log/DmServiceDM.log 2>&1 &
    if [ $? -eq 0 ]; then
        echo "Database started successfully."
    else
        echo "Database start failed."
    fi
}

# 判断是否已存在数据库
if [ -d $DATA_DIR/DAMENG ]; then
    start_db
else
    create_db
    start_db
fi

# 保持容器运行
tail -f /dev/null

此脚本具备以下功能:
1、实例自动判断与初始化
脚本会检测数据目录下是否已存在数据库实例。
若不存在,则自动调用 dminit 进行初始化,创建新的数据库实例。
若已存在,则跳过初始化,直接启动数据库。
2、脚本支持通过 环境变量传入初始化参数,例如:
PAGE_SIZE → 页大小
CHARSET → 字符集
CASE_SENSITIVE → 是否区分大小写
SYSDBA_PWD、SYSAUDITOR_PWD → 系统用户初始密码
如果未显式设置环境变量,则使用脚本中定义的 默认值 进行初始化。

四、构建与运行
(1)在 Git仓库中上传Dockerfile 和配置脚本,推送到 Harbor等私有镜像仓库,构建完成后,执行登录与推送:

docker build -t harbor.example.com/base-develope/dm8:1.0 .
构建完成后,执行登录与推送:
docker login harbor.example.com
docker push harbor.example.com/base-develope/dm8:1.0

可以通过 docker images 查看镜像是否构建

(2)运行容器

docker run -d \
    --name dm8 \
    --restart unless-stopped \
    -u dmdba \
    -e "PAGE_SIZE=32" \
    -e "ARCH_FLAG=1" \
    -e "CASE_SENSITIVE=0" \
    -e "CHARSET=1" \
    -e "SYSDBA_PWD=Dameng" \
    -e "SYSAUDITOR_PWD=Dameng" \
    -p 25236:5236 \
    -v /app/dm/dbdata:/dbdata \
    -v /app/dm/dbarch:/dbarch \
    base.cloud.com.cn/base-develope/dm8

注意:
1强烈建议用户在首次安装数据库初始化实例时,立即修改数据库系统用户的初始密码,并设置一定的密码强度,以保障数据安全性。
2、-e 设置的时候 初始化参数必须使用大写,不可使用小写。

容器运行相关参数说明:
参数名	参数描述
-d	-detach的简写,在后台运行容器,并且打印容器id
-p	指定容器端口映射,比如-p 25236:5236是将容器里数据库的5236端口映射到宿主机25236端口,外部就可以通过宿主机ip和25236端口访问容器里的数据库服务
--restart	指定容器的重启策略,默认为always,表示在容器退出时总是重启容器
--name	指定容器的名称
-v	指定在容器创建的时候将宿主机目录挂载到容器内目录,默认为/app/dm/dbdata、/app/dm/dbarch
使用 -e 命令指定数据库初始化参数时,需要注意的几个DM 参数。
参数名	参数描述	备注
PAGE_SIZE	页大小,可选值 4/8/16/32,不设置默认为32 
EXTENT_SIZE	簇大小,可选值 16/32/64,不设置默认值:16
CASE_SENSITIVE 1:大小写敏感;0:大小写不敏感,不设置默认值:0
CHARSET  字符集选项;0:GB18030;1:UTF-8;2:EUC-KR,不设置默认值:1
INSTANCE_NAME	初始化数据库实例名字,默认值:DAMENG
SYSDBA_PWD	初始化实例时设置 SYSDBA 的密码

通过docker inspect dm8_test命令可以查看 Docker 镜像中数据库初始化的参数。
image.png
(3)容器启动完成后,使用docker ps命令查看容器的运行状态,如容器未正常启动,可通过日志排查原因,命令如下:

docker logs -f  dm8

image.png
五、设置dmap自启动服务
脚本内容(monitor_dmap.sh)

#!/bin/bash
export LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin
dmserver_pidcount=$(ps cax -o pid,command | grep -w dmserver | grep -c dmserver)
dmap_pidcount=$(ps cax -o pid,command | grep -w dmap | grep -c dmap)

if [ $dmserver_pidcount -eq 0 ]; then
    if [ $dmap_pidcount -eq 1 ]; then
        cd /home/dmdba/dmdbms/bin
        ./DmAPService start
    fi
fi

建议将此脚本加入 crontab 或 supervisord,DMAP 服务在容器启动后自动拉起

*/1 * * * * /home/dmdba/dmdbms/bin/monitor_dmap.sh

六、常用运维操作

(1)启停容器
停止数据库命令:
docker stop dm8

启动数据库命令:
docker start dm8

重启命令:
docker restart dm8

(2)连接数据库
进入容器后连接数据库
docker exec -it dm8 bash
./disql SYSDBA/******

宿主机直接连接容器内数据库
docker exec -it dm8 /home/dmdba/dmdbms/bin/disql SYSDBA/'"********"'

(3)查看容器资源使用情况
docker stats dm8

(4)进入容器调试
docker exec -it dm8 bash

(5)查看容器网络和端口映射
docker inspect dm8 | grep IPAddress
docker port dm8

七、部署问题汇总

1. 安装文件未找到或路径错误
现象:构建镜像时提示 No such file or directory: DMInstall.bin
原因:Dockerfile 未正确拷贝安装文件或路径不一致。
解决:确认 DMInstall.bin 与 db_install.ini、db_instance.sh 是否在同一目录。使用绝对路径 COPY 或者 ARG 变量正确传递。

2. 权限问题
现象:构建时 Permission denied
原因:文件属主与容器内用户不一致。
解决:在 Dockerfile 内使用 chown 统一用户权限。确保宿主机 UID/GID 与容器内 dmdba 用户一致。

3.初始化失败(dminit 报错)
现象:日志显示 database open failed
原因:数据目录 /dbdata 权限不足。容器环境变量未正确传递。
解决:检查 chown -R dmdba:dinstall /app/dm/db{data,arch},查看 docker logs dm8 获取详细错误。

4.容器日志过大
现象:docker logs dm8 占用大量磁盘。
解决:配置 Docker 日志轮转。或者在启动命令中设置:
--log-opt max-size=100m --log-opt max-file=3

八、总结
通过 Dockerfile 可以实现数据库镜像的标准化构建,避免重复安装和手动配置。数据库的部署只需一条 docker run 命令即可完成,大幅缩短了安装时间。同时,通过数据目录持久化挂载,可以在容器删除或重建后保留数据库数据,从而提升部署灵活性。
不过,需要注意的是,容器虽比虚拟机轻量,但相较于物理机部署仍存在一定性能损耗。 在高并发、大事务场景下,容器化数据库的稳定性和性能通常不及裸机环境。此外,容器本身是无状态的,数据库必须依赖宿主机目录挂载实现持久化,一旦挂载配置或权限管理不当,可能导致数据丢失或读写异常。
在部署模式上,单机容器化部署较为简单,但在涉及主备守护、DSC 共享集群 等复杂架构时,容器化方案的运维复杂度会明显提升。同时,容器的重启策略与健康检查需要额外配置,否则一旦进程异常退出,数据库服务可能不可用。

  • 适用场景:
    开发、测试、验证环境,可快速拉起数据库实例。
    单机应用或轻量级业务场景,便于环境迁移与快速交付。
  • 不推荐场景:
    核心生产系统、高并发交易系统,对性能与稳定性要求极高的环境。
    复杂的主备、DSC 共享集群架构,建议优先采用物理机或虚拟机部署。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服