一、环境准备
基础镜像: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 镜像中数据库初始化的参数。
(3)容器启动完成后,使用docker ps命令查看容器的运行状态,如容器未正常启动,可通过日志排查原因,命令如下:
docker logs -f dm8
五、设置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 共享集群 等复杂架构时,容器化方案的运维复杂度会明显提升。同时,容器的重启策略与健康检查需要额外配置,否则一旦进程异常退出,数据库服务可能不可用。
文章
阅读量
获赞