Docker 部署 DM8
本文介绍如何将自建的 DM8 Docker 镜像离线导出、传输、校验、导入,并完成 DM8 单机容器的创建、数据持久化和连接验证。
适合没有稳定外网、需要在两台服务器之间传递镜像,或需要保留离线部署介质的场景。
本文以 Ubuntu 上的 Docker Engine 和
amd64/x86_64DM8 单机镜像为例。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。如果输出为 arm64 或 aarch64,必须使用匹配架构的安装包和基础镜像重新构建。
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
校验结果应显示 OK。docker 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_SIZE、EXTENT_SIZE、CHARSET、CASE_SENSITIVE |
数据库初始化参数,建库后不能随意修改。 |
SYSDBA_PWD、SYSAUDITOR_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
使用包含大写字母、小写字母和数字的强密码。重新初始化密码前,先确认数据卷是否已经生成实例数据,避免误删已有数据库。
更多推荐
所有评论(0)