注册
Docker 制作达梦数据库单机容器化部署
专栏/技术分享/ 文章详情 /

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

harrison辉 2025/09/19 524 4 0
摘要

一、环境准备
基础镜像:Kylin V10 SP3(国产化环境常用)
Docker 版本:≥ 20.10
达梦安装包:DMInstall.bin
宿主机目录:/app/dm/dbdata、/app/dm/dbarch

⚠️ 注意事项:宿主机和容器内的达梦运行用户需保持 UID/GID 一致,避免文件权限冲突。宿主机创建用户和目录示例:

mkdir -p /app/dm/db{data,arch}
groupadd -g 1001 -r dinstall
useradd -u 1001 -r -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
chown -R dmdba:dinstall /app/dm/db{data,arch}

二、Dockerfile 编写

###拉取系统
#FROM docker.io/library/centos:centos7
FROM cr.kylinos.cn/kylin/kylin-server-v10sp3-x86_64:20230324

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

# After the installation is complete, you can delete the image to reduce its size
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" 
   
# Add the installation file and configuration file to build the image
RUN mkdir /soft && mkdir /home/dmdba/dmdbms

COPY  $CONFIG_INI  $CREATE_DB_FILE $START_FILE  $SOFT_DIR/

# get INSTANLL_FILE from wangpan
curl -o base.cloud.com.cn/base-develope/DMInstall.bin $SOFT_DIR/

# install db soft  without init db instacne

RUN /soft/$INSTALL_FILE -q /soft/$CONFIG_INI

RUN mkdir  /dbdata && chown dmdba:dinstall /dbdata -R
RUN mkdir  /dbarch && chown dmdba:dinstall /dbarch -R
WORKDIR /home/dmdba/dmdbms/bin

#defalut startup dmdb
RUN chown dmdba:dinstall /soft -R
RUN chmod 755 /soft -R
CMD  ["/soft/db_instance.sh"]

三、安装配置文件
(1)静默安装文件 db_install.ini

<?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>

说明:仅安装数据库软件,不初始化实例,实例交由脚本自动创建。
(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)构建镜像

docker build -t base.cloud.com.cn/base-develope/dm8 .

通过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 的密码

(3)、容器启动完成后,使用docker ps命令查看镜像的启动情况,如未运行通过日志检查启动情况,命令如下:

docker logs -f  dm8

五、设置dmap自启动服务

#!/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 管理。
六、启动/停止数据库

停止数据库命令如下:
docker stop dm8

启动数据库命令如下:
docker start dm8

重启命令如下:
docker restart dm8

七、连接容器内DM8数据库
(1)进入容器连接:

docker exec -it dm8 bash

连接数据库:
./disql SYSDBA/******

注意
如果使用 docker 容器里面的 disql,进入容器后,先执行 source /etc/profile 防止中文乱码。

(2)宿主机连接

docker exec -it dm8 /home/dmdba/dmdbms/bin/disql SYSDBA/'"********"'
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服