别被安装手册吓到——KingbaseES Docker部署其实就几条命令
先说好,这篇不是完整的生产部署指南。如果你要上生产环境,老老实实看官方的Linux安装指南(80多页那个),该配的内核参数一个都别少。
这篇是写给以下读者的:
- 开发环境想快速起个KingbaseES做联调
- 学习用途,想跑起来看看长什么样
- CI/CD流水线里需要临时起一个KingbaseES实例
满足以上任一条件,继续往下看。
三步跑起来
第一步:拿到镜像tar包。
官方的Docker镜像是一个tar文件(比如叫kingbase.tar),需要通过人大金仓的销售或售后渠道获取。拿到之后导入:
docker load -i kingbase.tar
导入完看一眼:
docker images | grep kingbase
第二步:启动容器。
一条命令的事:
docker run -dit \
--name kingbase_dev \
--privileged \
-p 4321:54321 \
-e DB_USER=system \
-e DB_PASSWORD=dev123456 \
-e DB_MODE=pg \
-e ENABLE_CI=yes \
kingbase:v1 \
/usr/sbin/init
参数含义:
| 参数 | 含义 | 说明 |
|---|---|---|
--name |
容器名 | 自己起 |
--privileged |
特权模式 | 必须加,数据库需要特殊权限 |
-p 4321:54321 |
端口映射 | 宿主机4321映射到容器54321 |
-e DB_USER |
管理员用户名 | 默认system |
-e DB_PASSWORD |
密码 | 初始密码 |
-e DB_MODE |
兼容模式 | oracle / pg / mysql |
-e ENABLE_CI |
大小写不敏感 | yes=不敏感(MySQL习惯) |
-e NEED_START |
自动启动 | 不指定默认yes |
第三步:等它初始化完然后连上去。
容器启动后数据库自动初始化,这个过程大概几十秒。用docker logs看进展:
docker logs -f kingbase_dev
等看到数据库就绪的信息后,连进去:
# 先进容器
docker exec -it kingbase_dev bash
# 容器里用ksql连接(默认kingbase用户,免密)
ksql -U system -d test -p 54321
或者从宿主机直接连:
# 宿主机上要有KingbaseES客户端,或者用任何PG兼容客户端
./kingbase/bin/ksql -U system -d test -p 4321 -h 127.0.0.1
把数据留在外面
上面的启动方式有个问题:容器一删数据就没了。加个-v做数据持久化:
docker run -dit \
--name kingbase_dev \
--privileged \
-p 4321:54321 \
-v /data/kingbase:/home/kingbase/userdata \
-e DB_USER=system \
-e DB_PASSWORD=dev123456 \
-e DB_MODE=oracle \
kingbase:v1 \
/usr/sbin/init
这里的映射关系:宿主机/data/kingbase ↔ 容器内/home/kingbase/userdata。所有数据文件、配置文件、license都持久化在这个目录下。
挂载成功后检查一下:
docker inspect -f '{{.Mounts}}' kingbase_dev
License的处理
License文件在容器里会从镜像的默认位置复制到持久化目录,路径大概是:
/home/kingbase/userdata/etc/license.dat
如果license快到期或者换了授权,直接替换宿主机上对应持久化目录里的license.dat,然后进容器改一下权限:
docker exec -it kingbase_dev bash
chown kingbase:kingbase /home/kingbase/userdata/etc/license.dat
chmod 755 /home/kingbase/userdata/etc/license.dat
不需要重建容器。
配置文件持久化后怎么让它生效
挂载持久化之后,kingbase.conf、sys_hba.conf等配置文件都在宿主机/data/kingbase/etc/(或你挂载的对应目录)下面。改完之后进容器reload一下:
docker exec -it kingbase_dev bash
/home/kingbase/install/kingbase/bin/sys_ctl reload -D /home/kingbase/userdata/data/
启停数据库
容器本身可以docker stop/start,但如果你只想停数据库不关容器:
docker exec kingbase_dev sys_ctl stop -m fast -D /home/kingbase/userdata/data/
# 再启动
docker exec kingbase_dev sys_ctl start -D /home/kingbase/userdata/data/
一个小脚本搞定
把这个存成start-kes-docker.sh:
#!/bin/bash
# 快速启动一个KingbaseES开发实例
NAME="${1:-kingbase_dev}"
PORT="${2:-4321}"
MODE="${3:-pg}"
DATA_DIR="${4:-/data/kingbase}"
docker run -dit \
--name "$NAME" \
--privileged \
--restart unless-stopped \
-p "$PORT":54321 \
-v "$DATA_DIR":/home/kingbase/userdata \
-e DB_USER=system \
-e DB_PASSWORD="ChangeMe123!" \
-e DB_MODE="$MODE" \
-e ENABLE_CI=yes \
kingbase:v1 \
/usr/sbin/init
echo "等待数据库初始化..."
sleep 5
docker logs -f "$NAME"
用法:
# PG模式, 端口54321
./start-kes-docker.sh my-kes 54321 pg
# Oracle模式, 端口15432
./start-kes-docker.sh my-oracle-mode 15432 oracle
常见问题
Q: 特权模式一定要吗?
A: 目前看到的KingbaseES镜像是需要--privileged的,因为数据库内部需要操作共享内存、信号量等系统资源。这在开发环境可以接受,生产环境可能需要更精细的权限控制(--cap-add等方式)。
Q: 能用docker-compose吗?
当然可以:
version: '3'
services:
kingbase:
image: kingbase:v1
container_name: kingbase_dev
privileged: true
ports:
- "4321:54321"
volumes:
- /data/kingbase:/home/kingbase/userdata
environment:
DB_USER: system
DB_PASSWORD: dev123456
DB_MODE: oracle
ENABLE_CI: "yes"
command: /usr/sbin/init
Q: 跟PG的Docker镜像比怎么样?
官方PG镜像不需要--privileged,环境变量体系更标准(POSTGRES_PASSWORD等),这是KingbaseES Docker化做得还不够好的地方。但能跑就行,开发测试场景要求不高。
写在最后
KingbaseES的Docker方案整体可用,但还有提升空间——主要体现在环境变量命名不够统一、特权模式的依赖、以及镜像大小优化上。跟MySQL和PostgreSQL官方镜像的成熟度相比有一定差距。
不过话说回来,对于只是想快速验证某个功能、或者给开发团队提供一个随手可用的测试环境,Docker方案已经够用了。
如果要在生产环境用,建议还是老老实实走物理机/虚拟机的图形化或静默安装路线,按官方文档把内核参数、资源限制、防火墙规则全部配到位。毕竟国产数据库的信创项目,稳定性比方便性重要得多。