前言:
最近有项目需求,需要在原先gorm适配6类国产数据库的基础上再追加一个 华为高斯数据库opengauss,所以需要成功部署相关的数据库服务,使用docker是很方便的方式
下面是一份完整、实用的 Docker Compose 部署华为 openGauss 数据库(适用于远程工具连接,如 Navicat) 的配置文档,含:
• 可用镜像说明
• docker-compose.yml 文件
• 数据挂载目录结构
• 初始化配置参数
• 远程连接设置(Navicat)
• 错误问题的排查与处理思路
✅ 一、准备镜像
华为官方发布的 openGauss 镜像在 Docker Hub 上可直接拉取:
docker pull enmotech/opengauss:3.1.0
此镜像维护较好,适合开发与测试环境。
🧱 二、目录结构准备
在宿主机上准备挂载目录,用于数据持久化与配置覆盖,我的目录结构大概是这样的:
/opt/docker-volumes/opengauss/
├── config/
│ ├── postgresql.conf #可写可不写,写了会覆盖容器内的文件(用于监听端口、ip地址等配置)
│ └── pg_hba.conf #可写可不写,写了会覆盖容器内的文件(用于远程连接工具访问权限的配置)
├── data/ ← 自动生成或你手动清空后初始化
└── docker-compose.yml
📄 三、Docker Compose 文件
创建文件 /opt/docker-volumes/opengauss/docker-compose.yml,内容如下:
磁盘空间一定要留够,最少1G,不然数据库启动不起来。。。
version: "3.8"
services:
opengauss:
image: enmotech/opengauss:3.1.0
container_name: opengauss
restart: always
ports:
- "5432:5432" # openGauss 默认端口
environment:
GS_PASSWORD: "Gauss@123" # 设置数据库初始化密码(必须满足复杂度要求)
volumes:
- /opt/docker-volumes/opengauss/data:/var/lib/opengauss/data # 数据目录挂载
- /opt/docker-volumes/opengauss/config:/etc/opengauss # 可选配置目录(如需覆盖配置)
shm_size: 1g
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
🚀 四、启动命令
进入 docker-compose.yml 所在目录:
cd /opt/docker-volumes/opengauss
docker-compose up -d
查看容器状态:
docker ps
确认 opengauss 正常运行。
🔐 五、连接信息(用于 Navicat-omm用户无法连接,需要创建普通用户,授予相关权限连接–具体可往后面找 普通用户创建相关流程–往下划拉即可)
✅ Navicat 连接 PostgreSQL 时,只需填以上信息即可连接 openGauss。
openGauss 兼容 PostgreSQL 协议,所以使用 Navicat 选择 PostgreSQL 模式连接即可。
⚙️ 六、可选配置说明
虽然大多数参数可通过环境变量设置,但你也可以手动覆盖配置文件:
• 在 /opt/docker-volumes/opengauss/config/ 中放置如下配置(如 postgresql.conf、pg_hba.conf)
• 然后容器会在启动时读取该目录中的配置
• 如果需要配置,可填写:
cat <<EOF > /opt/docker-volumes/opengauss/config/postgresql.conf
# PostgreSQL-compatible parameters
listen_addresses = '*'
port = 5432
max_connections = 500
shared_buffers = 512MB
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_statement = 'none'
EOF
cat <<EOF > /opt/docker-volumes/opengauss/config/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
local all all trust
EOF
或者简单点:
echo "listen_addresses = '*'" >> /opt/docker-volumes/opengauss/config/postgresql.conf
echo "host all all 0.0.0.0/0 md5" >> /opt/docker-volumes/opengauss/config/pg_hba.conf
⚠️ 默认该镜像已设置允许远程访问,通常无需再手动配置 listen_addresses。
🧪 七、测试连接(命令行)
也可以用 psql 命令测试连接:
docker exec -it opengauss bash
# 进入容器后
gsql -d postgres -U omm -W
✅ 八、总结
• 镜像使用:enmotech/opengauss:3.1.0
• 数据端口:5432
• 默认用户:omm,密码:Gauss@123
• 目录挂载:数据 /opt/opengauss/data
• 启动后可用 Navicat(PostgreSQL)远程连接
📌 九、补充:
关于 config 配置目录的必要性与内容
在 docker-compose.yml 中,我们挂载了如下目录:
/opt/docker-volumes/opengauss/config:/etc/opengauss
这个目录在 Enmotech 提供的 openGauss 镜像 中,其实是 可选的覆盖配置机制,用于:
• 覆盖默认的 postgresql.conf(数据库主配置文件)
• 覆盖默认的 pg_hba.conf(认证规则)
• 提供自定义的配置初始化逻辑(例如参数调优)
🧠 但实际运行中,如果你不需要自定义这些参数,该目录可以为空或不挂载,数据库也能正常工作。
✅ 如果你需要支持远程访问(Navicat 连接),建议你主动配置以下两个文件:
- postgresql.conf
- pg_hba.conf
具体内容可参考上文中的信息
⚠️ 注意:如果你在 config 目录中放入了这两个文件,容器重启后它们会自动覆盖默认配置。
📌 关于默认连接用户 omm(经过实际使用–omm居然不允许远程连接访问,所以我们还需要自己建立可以远程访问的数据库用户名,并且授予相关的权限,具体可往后面找 普通用户创建相关流程–往下划拉即可)
omm 是 openGauss 默认创建的超级用户(superuser)。
这个用户:
• 等同于 PostgreSQL 中的 postgres 用户
• 拥有所有权限,可建库、建用户、管理权限
• 由镜像内初始化脚本自动创建,密码是你通过环境变量 GS_PASSWORD 设置的那个
如:
environment:
GS_PASSWORD: "Gauss@123"
此时你登录:
psql -h 127.0.0.1 -U omm -p 5432 -W
即可使用数据库。
想创建其他用户?
你可以通过 gsql 或 Navicat 登录后运行 SQL:
CREATE USER myuser WITH PASSWORD 'MyPassword123';
GRANT ALL PRIVILEGES TO myuser;
✅ 创建普通用户,并运行远程连接访问
✅ 第一步:进入容器并切换到 omm 用户
docker exec -it opengauss bash
su - omm
✅ 第二步:连接数据库(不要使用 -W,它需要密码参数)
正确的命令是:
gsql -d postgres -r
说明:
• -d postgres:连接默认数据库
• -r:进入交互式 SQL 命令行
• 不要用 -U omm -W,因为你当前已经是 omm 用户,直接连接即可。
如果看到提示符变成:
gaussdb=#
说明连接成功!
✅ 第三步:一次性创建远程可连接的普通用户和数据库
-- 创建用户
CREATE USER navicat_user WITH PASSWORD 'Test@123';
-- 创建用户(一步到位,建立超管用户,省的为权限的事情烦恼)
CREATE USER gaussadmin WITH PASSWORD 'YourPassword123@' SYSADMIN;
-- 创建数据库并指定拥有者(超管用户就不用运行这个了)
CREATE DATABASE navicatdb OWNER navicat_user;
-- 授权(超管用户就不用运行这个了)
GRANT ALL PRIVILEGES ON DATABASE navicatdb TO navicat_user;
你也可以加一句明确允许登录:
#(超管用户就不用运行这个了)
ALTER ROLE navicat_user WITH LOGIN;
✅ 第四步:确保 pg_hba.conf 允许远程连接
在宿主机上,编辑文件(你之前挂载的是)
/opt/docker-volumes/opengauss/config/pg_hba.conf
确认包含这一行:
host all all 0.0.0.0/0 md5
✅ 第五步:重启容器,让配置生效
docker restart opengauss
✅ 第六步:Navicat 连接信息
✅ 最佳实践总结
✅ 容器启动遇到错误问题怎么处理:
✅ 快速排查,按以下步骤执行:
🔍 第一步:查看容器日志,根据日志再进行具体问题具体分析
立即执行以下命令查看详细报错信息:
docker logs opengauss
🔧 第二步:常见问题排查清单(先别急着改,建议搭配日志一起确认)
✅ 问题1:配置文件格式或权限错误
检查你刚才创建的 postgresql.conf 和 pg_hba.conf 是否:
• 文件编码为 UTF-8
• 没有奇怪的 Windows 换行符(用 dos2unix 转换)
• 文件内容是否完整、合法(粘贴内容是否有残缺)
🔧 修复命令(可全部执行):
dos2unix /opt/docker-volumes/opengauss/config/postgresql.conf
dos2unix /opt/docker-volumes/opengauss/config/pg_hba.conf
chmod -R 755 /opt/docker-volumes/opengauss/config
✅ 问题2:数据目录已被初始化 + 强行覆盖配置导致崩溃
Enmotech 的镜像在启动时会检查 /var/lib/opengauss/data,如果目录非空而你又配置了新的 postgresql.conf,可能导致冲突。
🔧 修复方法(⚠️会清空数据库数据!):
# 仅用于开发测试环境,生产环境请先备份!
rm -rf /opt/docker-volumes/opengauss/data/*
然后重新启动:
docker-compose down
docker-compose up -d
✅ 问题3:宿主机某些 Linux 安全机制(如 SELinux)阻止挂载或访问配置文件
如果你用的是 RHEL/CentOS,可以尝试加 😒 后缀允许容器访问:
volumes:
- /opt/docker-volumes/opengauss/data:/var/lib/opengauss/data:z
- /opt/docker-volumes/opengauss/config:/etc/opengauss:z
或临时关闭 SELinux:
setenforce 0
✅ 问题4:GS_PASSWORD 不符合 openGauss 安全策略
设置的密码是 Gauss@123,按道理是合规的(大小写 + 数字 + 特殊字符,长度 ≥8)
但建议你测试使用更复杂一点的,比如:
GS_PASSWORD: "Abcd1234@Gauss"
当然了,最重要的是
查看容器日志(docker logs opengauss),获取关键错误提示
根据日志对照上面 4 项原因排查