本文介绍如何将自建的 DM8 Docker 镜像离线导出、传输、校验、导入,并完成 DM8 单机容器的创建、数据持久化和连接验证。

适合没有稳定外网、需要在两台服务器之间传递镜像,或需要保留离线部署介质的场景。

本文以 Ubuntu 上的 Docker Engine 和 amd64/x86_64 DM8 单机镜像为例。DM8 镜像需要与 CPU 架构、数据库版本和目标环境匹配;ARM 服务器请从达梦下载中心获取对应的 ARM 镜像,不能直接使用 x86_64 镜像。


一、部署前说明

1. Docker 镜像的导出与导入命令

Docker 中有两组容易混淆的命令:

目标 推荐命令 说明
备份、传输 Docker 镜像 docker save / docker load 保留镜像层、标签和镜像配置,DM8 镜像离线传输应使用这一组。
导出容器文件系统 docker export / docker import 只导出容器当前文件系统,不保留原镜像的启动命令、环境变量和历史配置。

部署 DM8 时,不要用 docker export 导出一个已经运行的 DM8 容器,再用 docker import 恢复。这样很可能丢失镜像入口命令和初始化配置,导致新容器无法按预期启动。

2. 本文环境与目录规划

项目 示例值
宿主机系统 Ubuntu 26.04 LTS
Docker 已安装并可执行 docker ps
CPU 架构 amd64 / x86_64
DM8 容器名 dm8
DM8 容器端口 5236
宿主机映射端口 5236
Docker 数据卷 dm8-data
传输目录 /opt/dm8-image

先确认 Docker 与 CPU 架构:

docker version
docker ps
dpkg --print-architecture
uname -m

amd64 通常对应 x86_64。如果输出为 arm64aarch64,必须使用匹配架构的安装包和基础镜像重新构建。

3. 先构建 DM8 私有镜像

达梦下载中心当前可能只提供 .zip.iso 安装介质。.iso 不是 Docker 镜像,不能执行 docker load

请先完成独立文章:DM8 安装包打包成 Docker 镜像。该文章会使用下载中心的 开发版(X86)/ X86 / Ubuntu22 安装包,从 ISO 中提取 DMInstall.bin 并构建出:

dm8:offline-amd64

本文从已经得到 dm8:offline-amd64 镜像开始,继续完成离线镜像传输和数据库部署。


二、在源服务器导出自建 DM8 镜像

这一节适用于源服务器已经按《DM8 安装包打包成 Docker 镜像》构建了 dm8:offline-amd64,准备将它传给另一台没有外网或不方便构建镜像的服务器。

1. 查看源服务器已有镜像

docker image ls dm8
docker image inspect dm8:offline-amd64 --format '{{.Id}}'

为避免混淆不同 CPU 架构的镜像,构建镜像统一命名为 dm8:local-<arch>,传输镜像统一命名为 dm8:offline-<arch>,归档文件命名为 dm8-offline-<arch>.tar。本文使用 X86 安装包,x86_64 / x64 在 Docker 中统一标识为 amd64,因此使用 amd64

docker image inspect dm8:offline-amd64 --format '{{.Architecture}}'
docker tag dm8:offline-amd64 dm8:offline-amd64
docker image ls dm8

第一条命令应输出 amd64。ARM 镜像必须由 ARM 安装包和匹配的基础镜像单独构建,再使用 arm64 标签;不能将当前 amd64 镜像改名为 arm64 后传输。

2. 导出镜像并生成校验文件

创建保存目录后导出镜像:

mkdir -p ~/dm8-image-transfer
cd ~/dm8-image-transfer
docker save -o dm8-offline-amd64.tar dm8:offline-amd64
sha256sum dm8-offline-amd64.tar > dm8-offline-amd64.tar.sha256
ls -lh dm8-offline-amd64.tar dm8-offline-amd64.tar.sha256

dm8-offline-amd64.tar 是可以离线传输的 Docker 镜像文件,.sha256 文件用于在目标服务器上校验传输是否完整。

docker save 导出的只是镜像,不包含已经运行中的数据库数据。数据库数据应通过 DM8 自身的备份恢复机制处理,不能把运行中的数据目录简单打包当作一致性备份。


三、传输并导入镜像到目标服务器

1. 传输镜像文件

可以使用 U 盘、SFTP、SCP 或内网文件服务器传输下列两个文件:

dm8-offline-amd64.tar
dm8-offline-amd64.tar.sha256

先在目标服务器准备接收目录:

sudo install -d -m 0755 /opt/dm8-image
sudo chown "$USER":"$USER" /opt/dm8-image

进入该目录:

cd /opt/dm8-image

将文件复制进去。

2. 校验并导入镜像

先确认文件校验通过,再导入:

sudo sha256sum -c dm8-offline-amd64.tar.sha256
sudo docker load -i dm8-offline-amd64.tar
docker image ls dm8

校验结果应显示 OKdocker load 成功后,镜像名称应为:

dm8:offline-amd64

四、创建 DM8 数据卷并启动容器

1. 检查端口是否被占用

DM8 默认监听容器内的 5236 端口。启动前先确认宿主机的 5236 没有被其他程序占用:

ss -lnt | grep ':5236' || true

如果已经有其他服务使用该端口,可以把宿主机端口改为 15236,即使用 -p 15236:5236。容器内的 DM8 仍然使用 5236

2. 创建持久化数据卷

本文默认使用 Docker 命名卷保存数据,而不是直接绑定宿主机目录。这样首次部署更少遇到容器内用户与宿主机目录权限不一致的问题。

docker volume create dm8-data
docker volume inspect dm8-data

数据卷会独立于容器存在。删除并重新创建同名容器不会自动删除 dm8-data,因此数据可以保留。

初始化参数仅在空数据卷首次创建数据库时生效。已有数据的卷不能拿来重新初始化,也不要在不确认数据用途时删除数据卷。

3. 启动 DM8 单机容器

先设置两个示例密码。请替换成自己的强密码,且不要把真实密码提交到文章、脚本仓库或聊天记录中:

export DM_SYSDBA_PWD='Dm8Pass2026A'
export DM_SYSAUDITOR_PWD='Dm8Audit2026A'

使用导入后的 dm8:offline-amd64 镜像启动容器:

docker run -d \
  --name dm8 \
  --restart unless-stopped \
  -p 5236:5236 \
  -v dm8-data:/opt/dmdbms/data \
  -e PAGE_SIZE=16 \
  -e EXTENT_SIZE=32 \
  -e LOG_SIZE=1024 \
  -e CHARSET=1 \
  -e CASE_SENSITIVE=0 \
  -e DB_NAME=DM8 \
  -e INSTANCE_NAME=DM8 \
  -e PORT_NUM=5236 \
  -e TIME_ZONE=+08:00 \
  -e SYSDBA_PWD="$DM_SYSDBA_PWD" \
  -e SYSAUDITOR_PWD="$DM_SYSAUDITOR_PWD" \
  dm8:offline-amd64

参数说明:

参数 作用
--name dm8 指定容器名称。
--restart unless-stopped Docker 服务或宿主机重启后自动恢复容器;手动停止的容器不会自动拉起。
-p 5236:5236 将宿主机的 5236 端口映射到容器内 DM8 端口。
-v dm8-data:/opt/dmdbms/data 将 DM8 数据目录保存到 Docker 命名卷。
PAGE_SIZEEXTENT_SIZECHARSETCASE_SENSITIVE 数据库初始化参数,建库后不能随意修改。
SYSDBA_PWDSYSAUDITOR_PWD 初始化系统账号密码。

本文使用 https://blog.csdn.net/m0_69583914/article/details/163337734?spm=1001.2014.3001.5502 生成的 dm8:offline-amd64 镜像。该镜像的数据目录固定为 /opt/dmdbms/data,并在首次启动时由入口脚本执行初始化。不要在已经有数据的卷上反复修改初始化参数试错。


五、验证 DM8 是否部署成功

1. 查看容器状态和启动日志

docker ps --filter name=dm8
docker logs --tail 100 dm8

容器状态应为 Up。首次启动会执行数据库初始化,日志中应能看到初始化和数据库服务启动过程。

持续查看日志:

docker logs -f dm8

Ctrl + C 退出日志查看,不会停止容器。

2. 进入容器并使用 disql 连接

docker exec -it dm8 /home/dmdba/dmdbms/bin/disql SYSDBA/Dm8Pass2026A

登录后执行以下 SQL:

select name from v$database;
select instance_name, status$ from v$instance;
exit;

当实例状态为 OPEN,说明数据库已经可以正常提供服务。

3. 从其他电脑连接

使用达梦管理工具或业务程序连接时,填写:

配置项 示例
主机地址 Docker 宿主机 IP
端口 5236
用户名 SYSDBA
密码 初始化时设置的 SYSDBA_PWD

如果只允许本机访问,可以把端口映射改成 -p 127.0.0.1:5236:5236。如果需要局域网访问,应只在防火墙中放行可信网段的 5236/TCP,不要直接暴露到公网。


六、常用运维命令

操作 命令
查看容器 docker ps -a
查看实时日志 docker logs -f dm8
停止数据库容器 docker stop dm8
启动数据库容器 docker start dm8
重启数据库容器 docker restart dm8
进入容器 docker exec -it dm8 bash
查看数据卷 docker volume inspect dm8-data
查看镜像 docker image ls

数据库数据已经放入 dm8-data 命名卷,但这不等于完成备份。生产环境仍应使用 DM8 官方备份恢复机制,并定期验证恢复结果。


七、常见问题

1. exec format error

通常是镜像 CPU 架构与宿主机不匹配。例如在 ARM 主机上导入并启动 x86_64 镜像会报错。执行 uname -m 确认架构后,从达梦下载中心重新获取匹配镜像。

2. 容器已启动,但客户端无法连接

依次检查:

docker ps --filter name=dm8
docker logs --tail 100 dm8
ss -lnt | grep ':5236' || true

重点确认容器状态是否为 Up、日志中是否出现数据库启动失败、宿主机端口是否被占用,以及云服务器安全组或系统防火墙是否允许可信来源访问。

3. 初始化参数没有生效

DM8 初始化参数只会在空数据目录或空数据卷首次启动时使用。若 dm8-data 中已有实例文件,后续修改 PAGE_SIZE、字符集或数据库名不会重新建库。请先确认旧数据是否需要保留,再决定迁移、恢复或重新创建测试环境。

4. 绑定目录时报权限错误

优先使用本文默认的 Docker 命名卷。若必须使用 -v /宿主机目录:/opt/dmdbms/data,需要根据镜像内数据库用户的 UID/GID 设置宿主机目录权限,而不是粗暴开放所有权限。

5. SYSDBA 密码无法登录

先查看启动日志确认密码是否因复杂度要求未被接受:

docker logs --tail 100 dm8

使用包含大写字母、小写字母和数字的强密码。重新初始化密码前,先确认数据卷是否已经生成实例数据,避免误删已有数据库。

更多推荐