Ubuntu 系统--基于 docker 和 docker compose 方式部署 openGauss 数据库

2025博客之星年度评选已开启 10w+人浏览 1.5k人参与

前言:

之前经常用国产Linux系统,但是没用过国产数据库,最近有客户因为信创要求,提出了国产化的需求,所以我就部署了一个 openGauss 数据库了解一下,这个部署目前没啥问题,但在测试 ThingsBoard 开源项目的 原生 PostgreSQL 数据库替换成 openGauss 时,遇到了很多问题,比如 JDBC 驱动、SQL 语法兼容性等等,还在调试中(个人感觉不太兼容,非小小运维一人能完成,除非你的开发同事愿意陪你一起二开)


一、openGauss 介绍

openGauss 是一款关系型数据库系统,是基于 PostgreSQL 9.2 版本开发的,基本包括了 PostgreSQL 9.4 的功能,尽管两者在核心功能上有相似之处,但 openGauss 针对性能、可靠性和企业需求进行了大量改进和调整。openGauss 最大的变化就是把 PostgreSQL 的进程模式改成了线程模式,当然这两个模式其实各有优缺点。线程模式对短连接有优势,比进程模式的数据库可以承担更大的并发短请求,但线程模式也有明显的缺点,所有的线程共享内存,如果一个线程的的野指针把别人的内存改了,不会报错,一时半会可能还发现不了,极端情况下会导致数据损坏而不被发现。所以说这个改变不能说有什么明显的好处,某些情况下可能还是一个退步。为了改成线程模式,openGauss 的把 C 语言的源代码改成了 C++。C++的好处是容易封装,坏处是移植性降低了。当然 openGauss 增加了线程池的功能,目前还不清楚这个功能是否稳定可靠。如果稳定可靠可以不使用第三方的连接池工具了。

二、运行环境说明

我浏览了官方社区文档,关于运行环境这块,官方支持的操作系统主要为国产操作系统(除了Centos),比如 热度非常高的openEuler、kylin V10(国产系统中我最喜欢用这个)、UOS,没有看到 Ubuntu 系统,由于项目要求,我这里就使用 Ubuntu 24.04.3 LTS 操作系统进行演示部署,kernel版本为 Linux 6.14.0-36-generic ,系统架构为x86-64

其他详细要求可以参考官方文档:

官方链接:https://docs.opengauss.org/zh/docs/latest/about_opengauss/operating_environment.html

三、docker 方式单机部署

部署前我也查了不少资料和AI,事实证明,AI这个东西只能辅助,不能完全的依赖它,需要有一定的专业知识和辨别真伪的能力。

关于 docker 以及 docker compose 环境安装,等有空我会专门写个文档介绍,这里就不再赘述了。

我这里拉取的镜像是 enmotech/opengauss:latest 和 enmotech/opengauss:3.0.0 (我测了两个镜像,暂时没感觉有啥区别),没有使用 openGauss 官方提供的镜像,感兴趣的小伙伴可以自己

测试,欢迎各位在评论区与我分享,一起交流学习。

1.检查系统的 docker 和 docker compose 环境和版本

# 该命令提供更详细的版本信息,包括客户端和服务器(Daemon)的版本、API 版本、Go 版本、构建时间、操作系统架构等,需要 Docker 服务器正在运行,否则会提示服务器信息缺失
root@aiinside:/ar_linux# docker version
Client:
 Version:           28.2.2
 API version:       1.50
 Go version:        go1.23.1
 Git commit:        28.2.2-0ubuntu1~24.04.1
 Built:             Wed Sep 10 14:16:39 2025
 OS/Arch:           linux/amd64
 Context:           default

Server:
 Engine:
  Version:          28.2.2
  API version:      1.50 (minimum version 1.24)
  Go version:       go1.23.1
  Git commit:       28.2.2-0ubuntu1~24.04.1
  Built:            Wed Sep 10 14:16:39 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.28
  GitCommit:        
 runc:
  Version:          1.3.3-0ubuntu1~24.04.3
  GitCommit:        
 docker-init:
  Version:          0.19.0
  GitCommit:        

# 该命令仅显示 Docker 客户端(CLI)的版本号,输出格式简洁,不需要与 Docker 服务器(Daemon)通信,因此即使服务器未运行也能执行,适合快速检查客户端版本
root@aiinside:/ar_linux# docker --version
Docker version 28.2.2, build 28.2.2-0ubuntu1~24.04.1


root@aiinside:/ar_linux/openGauss# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

root@aiinside:/ar_linux/openGauss# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

2.拉取 openGauss 镜像

我创建了一个 openGauss 目录,用来存放数据和配置文件

root@aiinside:/ar_linux# mkdir openGauss
root@aiinside:/ar_linux# ll
total 12
drwxr-xr-x  3 root root 4096 Dec 19 15:29 ./
drwxr-xr-x 28 root root 4096 Dec 19 15:28 ../
drwxr-xr-x  2 root root 4096 Dec 19 15:29 openGauss/

# 拉取镜像(需要使用魔法,或者换国内源)
root@aiinside:/ar_linux/openGauss# docker pull enmotech/opengauss:latest
root@aiinside:/ar_linux/openGauss# docker pull enmotech/opengauss:3.0.0

3.切换到 openGauss 目录下,执行启动命令

#直接粘贴复制这段命令即可
root@aiinside:/ar_linux/openGauss# docker run --name opengauss \
-p 5432:5432 \
-v /ar_linux/openGauss/data:/var/lib/opengauss/data \
-e GS_NODENAME=gaussdb \
-e GS_USERNAME=gaussdb \
-e GS_PASSWORD=Opengauss@123 \
--privileged=true \
--restart=always \
-d enmotech/opengauss:latest
2fada6e05725dd48c6d3cd150c0e2731a436ee05e53cfeabc48d05289ea91fec

#查看容器状态
root@aiinside:/ar_linux/openGauss# docker ps | grep opengauss
2fada6e05725   enmotech/opengauss:latest                       "entrypoint.sh gauss…"   10 seconds ago   Up 10 seconds                   0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp   opengauss

4.启动命令参数解释

openGauss 的密码有复杂度要求

密码长度8个字符以上,必须同时包含大写字母、小写字母、数字、以及特殊符号(特殊符号仅包含“#?!@$%^&*-”,并且“!$&”需要用转义符“\”进行转义)。

参数解释:

docker run     # 创建并运行一个容器
--name opengauss     # 指定容器名为"opnegauss"
-p 5432:5432     # 容器的5432端口映射到宿主机的5432端口
-v /ar_linux/openGauss/data:/var/lib/opengauss/data  # 数据持久化,容器数据目录挂载到宿主机目录
-e GS_NODENAME=gaussdb     # 指定数据库节点名称,默认为 "gaussdb"
-e GS_USERNAME=gaussdb     # 指定数据库连接用户名,默认为 "gaussdb"
-e GS_PASSWORD=Opengauss@123     # 指定数据库密码
--privileged=true     # 特权模式
--restart=always     # 容器退出时总是重启
-d     # 后台运行(detached 模式)
enmotech/opengauss:latest     # 镜像仓库/镜像名:标签

5.连接数据库

# 进入数据库容器内部交互
root@aiinside:/ar_linux/openGauss# docker exec -it opengauss bash

# 查看当前用户
root@2fada6e05725:/# whoami
root

#此时在root用户下,可以看到无法执行
root@2fada6e05725:/# gsql -d postgres -p 5432
bash: gsql: command not found

# 切换到omm用户(openGauss的管理员用户)
root@2fada6e05725:/# su - omm
omm@2fada6e05725:~$ whoami
omm

#登录数据库
omm@2fada6e05725:~$ gsql -d postgres -p 5432
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 19:14:27 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# \l
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 omm       | omm   | UTF8     | C       | C     | 
 postgres  | omm   | UTF8     | C       | C     | 
 template0 | omm   | UTF8     | C       | C     | =c/omm           +
           |       |          |         |       | omm=CTc/omm
 template1 | omm   | UTF8     | C       | C     | =c/omm           +
           |       |          |         |       | omm=CTc/omm
(4 rows)

#或者使用此命令登录
omm@2fada6e05725:~$ gsql -d postgres -U omm -W'Opengauss@123'
gsql ((openGauss 6.0.0 build aee4abd5) compiled at 2024-09-29 19:14:27 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

openGauss=# \l
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 omm       | omm   | UTF8     | C       | C     | 
 postgres  | omm   | UTF8     | C       | C     | 
 template0 | omm   | UTF8     | C       | C     | =c/omm           +
           |       |          |         |       | omm=CTc/omm
 template1 | omm   | UTF8     | C       | C     | =c/omm           +
           |       |          |         |       | omm=CTc/omm
(4 rows)

四.docker compose 方式单机部署

写博客写累了,参数我就不再单独解释了,跟上边 docker 命令的参数没啥区别,换了一种形式而已,初学者网络那块要是没看懂,就把我的配置扔AI里分析一下吧

# 编写yml文件
root@aiinside:/ar_linux/openGauss# vim docker-compose.yml 
version: '3.8'
services:
  opengauss:
    image: enmotech/opengauss:latest
    container_name: opengauss
    restart: always
    privileged: true
    ports:
      - "5432:5432"
    environment:
      - GS_NODENAME=gaussdb
      - GS_USERNAME=gaussdb
      - GS_PASSWORD=Opengauss@123
    volumes:
      - ./data:/var/lib/opengauss/data
    networks:
      - opengauss-network

networks:
  opengauss-network:
    driver: bridge

root@aiinside:/ar_linux/openGauss# ll
total 12
drwxr-xr-x 2 root root 4096 Dec 19 18:48 ./
drwxr-xr-x 3 root root 4096 Dec 19 15:29 ../
-rw-r--r-- 1 root root  427 Dec 19 17:58 docker-compose.yml

# 启动服务,如果文件名不是docker-compose.yml,需要通过 -f 参数来指定yml文件
root@aiinside:/ar_linux/openGauss# docker-compose up -d
Creating network "opengauss_opengauss-network" with driver "bridge"
Creating opengauss ... done

# 示例
root@aiinside:/ar_linux/openGauss# docker-compose -f docker-compose-test.yml up -d
Creating network "opengauss_opengauss-network" with driver "bridge"
Creating opengauss ... done


# 查看容器状态

#方式一:
root@aiinside:/ar_linux/openGauss# docker-compose ps
  Name             Command          State                    Ports                  
------------------------------------------------------------------------------------
opengauss   entrypoint.sh gaussdb   Up      0.0.0.0:5432->5432/tcp,:::5432->5432/tcp

#方式二:
root@aiinside:/ar_linux/openGauss# docker ps |grep opengauss
e63bbea34e65   enmotech/opengauss:latest                       "entrypoint.sh gauss…"   20 seconds ago   Up 20 seconds                   0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp   opengauss

五.容器重启策略配置参数解释

在容器的 docker 启动命令或者 docker-compose.yml 文件中,我增加了容器的重启策略为 always ,除了基本原因,还有一个最关键的原因:

在docker 一条命令启动时,如果不增加 --restart=always 参数,就会出现以下情况,服务无法启动,需要二次执行:

这个应该是负责写数据库初始化脚本并且封装成镜像那位仁兄的锅(反正不是我写的)

# 先把之前的容器给停止了
root@aiinside:/ar_linux/openGauss# docker rm -f opengauss
opengauss

# 删除数据目录
root@aiinside:/ar_linux/openGauss# rm -rf data/
root@aiinside:/ar_linux/openGauss# ll
total 12
drwxr-xr-x 2 root root 4096 Dec 19 18:19 ./
drwxr-xr-x 3 root root 4096 Dec 19 15:29 ../

# 重新部署,注意这次去掉了重启策略参数
root@aiinside:/ar_linux/openGauss# docker run --name opengauss \
-p 5432:5432 \
-v /ar_linux/openGauss/data:/var/lib/opengauss/data \
-e GS_NODENAME=gaussdb \
-e GS_USERNAME=gaussdb \
-e GS_PASSWORD=Opengauss@123 \
--privileged=true \
-d enmotech/opengauss:latest
f7b08acb1f6a425b52d4588d32d5a368e0990d6a11265e7a9ffe67a6e8c679ff

# 查看容器启动日志,最后一行报错之后服务就停止了
root@aiinside:/ar_linux/openGauss# docker logs -f opengauss
[2025-12-19 10:20:31.855][179][][gs_ctl]:  done
[2025-12-19 10:20:31.855][179][][gs_ctl]: server started (/var/lib/opengauss/data)
GS_DB = omm
Execute SQL: gsql -v ON_ERROR_STOP=1 --username omm --password Opengauss@123 --dbname postgres --set db=omm --set passwd=Opengauss@123
CREATE DATABASE
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
ALTER ROLE

Execute SQL: gsql -v ON_ERROR_STOP=1 --username omm --password Opengauss@123 --dbname postgres --set db=omm --set passwd=Opengauss@123 --set user=gaussdb
ERROR:  role "gaussdb" already exists

# 容器启动失败,都过滤不到了
root@aiinside:/ar_linux/openGauss# docker ps |grep opengauss
root@aiinside:/ar_linux/openGauss#

# 重新启动一遍容器,注意我没有删除数据目录
root@aiinside:/ar_linux/openGauss# docker run --name opengauss -p 5432:5432 -v /ar_linux/openGauss/data:/var/lib/opengauss/data -e GS_NODENAME=gaussdb -e GS_USERNAME=gaussdb -e GS_PASSWORD=Opengauss@123 --privileged=true -d enmotech/opengauss:latest
1cee00f275ed009436724f93d7b2f34f011cb61a04a84090ba7e97a7d7d456ab

root@aiinside:/ar_linux/openGauss# ll
total 16
drwxr-xr-x  3 root root 4096 Dec 19 18:20 ./
drwxr-xr-x  3 root root 4096 Dec 19 15:29 ../
drwx------ 22   70 root 4096 Dec 19 18:26 data/

# 可以看到容器启动成功了,查看日志也没有刚才的报错导致服务停止了
root@aiinside:/ar_linux/openGauss# docker ps |grep opengauss
1cee00f275ed   enmotech/opengauss:latest                       "entrypoint.sh gauss…"   45 seconds ago   Up 44 seconds                   0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp   opengauss

六.数据库日志告警信息说明

我发现不管是使用 enmotech/opengauss 的标签 3.0.0 或者 latest 镜像,启动服务后查看数据库容器日志,存在一些告警信息,虽然部分告警无伤大雅,但是对于我这个强迫症看着很难受,当

然了在我的文章中没有修复这块,因为我改了很多参数和配置进行调试,但是最终告警信息依然存在,所以我只能暂时放弃(看来本人不是真的强迫症)

我列出了一些告警信息,主要涉及 core 文件核心转储(core dump)、version 版本(这个应该是负责构建镜像那位仁兄的锅)、日志存储、cgroup 等等。。。

root@aiinside:/ar_linux/openGauss# docker logs -f opengauss
...
[INIT UNDO] Init undo subsystem meta successfully.
creating template1 database in /var/lib/opengauss/data/base/1 ... The core dump path is an invalid directory
2025-12-19 08:30:29.685 [unknown] [unknown] localhost 128664337430976 0[0:0#0]  [BACKEND] WARNING:  macAddr is 40600/2453984662, sysidentifier is 2660799044/3583404820, randomNum is 1279159060
...
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run gs_initdb.

Success. You can now start the database server of single node using:

    gaussdb -D /var/lib/opengauss/data --single_node
or
    gs_ctl start -D /var/lib/opengauss/data -Z single_node -l logfile
...
0 LOG:  [Alarm Module]Get ENV GS_CLUSTER_NAME failed!

0 LOG:  [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 57

0 WARNING:  failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.
0 WARNING:  failed to parse feature control file: gaussdb.version.
0 WARNING:  Failed to load the product control file, so gaussdb cannot distinguish product version.
The core dump path is an invalid directory
2025-12-19 08:30:47.013 [unknown] [unknown] localhost 132034001959360 0[0:0#0]  0 [BACKEND] LOG:  [Alarm Module]Host IP: 2fada6e05725. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>
2025-12-19 08:30:47.016 [unknown] [unknown] localhost 132034001959360 0[0:0#0]  0 [BACKEND] WARNING:  could not create any HA TCP/IP sockets
2025-12-19 08:30:47.322 [unknown] [unknown] localhost 132034001959360 0[0:0#0]  0 [BACKEND] LOG:  max_safe_fds = 978, usable_fds = 1000, already_open = 12
The core dump path is an invalid directory
...
2025-12-19 10:20:31.328 [unknown] [unknown] localhost 139980849822144 0[0:0#0]  0 [BACKEND] LOG:  the configure file /usr/local/opengauss/etc/gscgroup_omm.cfg doesn't exist or the size of configure file has changed. Please create it by root user!
2025-12-19 10:20:31.328 [unknown] [unknown] localhost 139980849822144 0[0:0#0]  0 [BACKEND] LOG:  Failed to parse cgroup config file.

七.关于 openGauss 数据库用户方面的疑问

关于高斯数据库的用户这块我一直不是很理解,我使用 gaussdb 用户无法登录,但是我用 navicat 连接的时候,使用的是gaussdb用户,使用omm用户无法登录,感觉像MySQL?

root@aiinside:/ar_linux/openGauss# docker exec -it opengauss bash

root@2fada6e05725:/# su - omm

omm@2fada6e05725:~$ gsql -d postgres -U gaussdb -W'Opengauss@123'
gsql: FATAL:  Invalid username/password,login denied.

omm@2fada6e05725:~$ gsql -d postgres -U gaussdb                  
Password for user gaussdb: 
gsql: FATAL:  Invalid username/password,login denied.

我看了 pg_hba.conf 这个配置文件

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     omm                                trust
#host    replication     omm        127.0.0.1/32            trust
#host    replication     omm        ::1/128                 trust

host all all 0.0.0.0/0 md5
host replication gaussdb 0.0.0.0/0 md5

网上没找到太多关于用户这块的文章解释,也有问过AI,但是给的解释总是不尽人意,如果有了解高斯数据库的大佬,欢迎私信或者留下联系方式交流。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值