1、部署数据库
- Docker 是一个开源的商业产品,有两个版本:社区版(CE)和企业版(EE)。本次我们是社区版部署。
bash
#要求 CentOS 系统的内核版本高于 3.10
[root@node1 ~]# uname -r
3.10.0-1160.el7.x86_64
1.1、导入镜像
bash
#将本地 kingbase.tar 格式的 Docker 镜像包导入到服务器的 Docker 环境中
[root@node1 ~]# docker load -i /kdb_install/kingbase.tar
.......
Loaded image: kingbase_v009r001c010b0004_single_x86:v1
修改一下镜像的标签
bash
1.先查看一下
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kingbase_v009r001c010b0004_single_x86 v1 10ba6f33e228 8 months ago 754MB
2.改名称
#格式:docker tag 原镜像名:原标签 新镜像名:新标签
[root@node1 ~]# docker tag kingbase_v009r001c010b0004_single_x86:v1 kingbase:v1
3.验证
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kingbase v1 10ba6f33e228 8 months ago 754MB
kingbase_v009r001c010b0004_single_x86 v1 10ba6f33e228 8 months ago 754MB
4.删除无用
[root@node1 ~]# docker rmi kingbase_v009r001c010b0004_single_x86:v1
Untagged: kingbase_v009r001c010b0004_single_x86:v1
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kingbase v1 10ba6f33e228 8 months ago 754MB
2、运行镜像
改目录,不用操作
bash
#找到 Docker 实际的数据目录
[root@node1 ~]# docker info | grep -i "docker root dir"
Docker Root Dir: /apps/docker
# 编辑/创建daemon.json文件
vim /etc/docker/daemon.json
{
"data-root" : "/var/lib/docker",
"insecure-registries" : ["10.3.90.106:8081"]
}
#迁移原有 Docker 数据到新目录
mkdir /var/lib/docker
mv /apps/docker/* /var/lib/docker/
# 设置正确的权限(必须是root:root)
chown -R root:root /var/lib/docker
chmod -R 700 /var/lib/docker
# 重启Docker服务
systemctl daemon-reload
systemctl restart docker
# 启动kingbase容器
docker start kingbase
#验证 Kingbase 容器是否正常
(1)查看容器状态
docker ps | grep kingbase
(2)查看容器日志(确认数据库启动正常)
docker logs kingbase
创建
- 安装目录:默认的安装路径是/var/lib/docker(docker官方默认的)
- 数据目录:默认是在容器的/home/kingbase/userdata/data
- 数据库默认用户名:system
- 数据库默认密码:123456
bash
1.#完整启动命令示例
docker run -tid --privileged \
-p 4321:54321 \
-v /mnt/data:/home/kingbase/userdata/ \
-e NEED_START=yes \
-e DB_USER=kingbase \
-e DB_PASSWORD=123456 \
-e DB_MODE=oracle \
--name kingbase \
kingbase:v1 /usr/sbin/init
#参数解读
-i:保持容器标准输入打开
-d:后台运行容器(守护进程模式)
-t:分配伪终端,保证容器能正常交互
--privileged:赋予容器「特权模式」,让容器内进程拥有接近宿主机 root 的权限
-v:数据卷挂载:将宿主机/mnt/data(chmod -R 755 /mnt/data)目录挂载到容器内 /home/kingbase/userdata/,实现数据持久化(容器删除后数据仍在宿主机)
-e:设置容器内环境变量:NEED_START=yes(告诉 Kingbase 容器启动时自动启动数据库服务)
/usr/sbin/init:容器启动后优先执行的核心命令(覆盖镜像默认启动命令,是容器的「第一个进程」)
- DB_USER: 数据库用户
- DB_PASSWORD: 数据库初始密码
- DB_MODE:数据库模式:支持 oracle/pg(enable_ci 仅支持 no)/mysql (请确认对应镜像内数据库版本支持的数据库模式之后再进行配置)
`检查兼容模式:`
---------------------------------------------------
[root@node1 ~]# docker exec -it kingbase /bin/bash
[kingbase@577fcc19f29f ~]$ cat /home/kingbase/userdata/data/initdb.conf |grep mode
--dbmode=oracle
---------------------------------------------------
- NEED_START:yes(默认启动数据库)/ no(不启动数据库)
- ENABLE_CI:yes(默认大小写不敏感)/no 大小写敏感
- ENCODING: 数据库启动的字符集[支持 utf8(默认)]
2.#最小启动命令示例
docker run -tid --privileged \
--name kingbase \
kingbase:v1 /usr/sbin/init
3.#查看名为 kingbase 的 Docker 容器在运行过程中产生的所有日志信息
[root@node1 ~]# docker logs kingbase
export KINGBASE_USER=kingbase
export KINGBASE_DATABASE=kingbase
[Tue 10 Mar 2026 03:49:54 PM UTC]data directory:/home/kingbase/userdata/data is not empty,don't need to initdb
sys_ctl: another server might be running; trying to start server anyway
waiting for server to start.... done
server started
* * * * * kingbase /home/kingbase/docker-entrypoint.sh check_and_run /home/kingbase/userdata/data >> /home/kingbase/cronlog
`因为是二次部署,而且没有清理数据目录所以logs少,要是想看多的,安装下面的操作一次`
---------------------------------------------------------------
# 1. 停止并删除现有容器
docker stop kingbase && docker rm kingbase
# 2. 备份并清空宿主机数据目录(保留原有数据,可选)
mv /mnt/data /mnt/data_bak
mkdir -p /mnt/data && chmod 775 /mnt/data && chown -R 1000:1000 /mnt/data
# 3. 重新创建容器(触发完整initdb)
docker run -tid --privileged \
-p 4321:54321 \
-v /mnt/data:/home/kingbase/userdata/ \
-e NEED_START=yes \
-e DB_USER=kingbase \
-e DB_PASSWORD=123456 \
-e DB_MODE=oracle \
--name kingbase \
kingbase:v1 /usr/sbin/init
# 4. 查看完整初始化日志
[root@node1 ~]# docker logs -f kingbase
export KINGBASE_USER=kingbase
export KINGBASE_DATABASE=kingbase
[Tue 10 Mar 2026 04:19:19 PM UTC]start initdb...
The database cluster will be initialized with locale "en_US.UTF-8".
The files belonging to this database system will be owned by user "kingbase".
This user must also own the server process.
The default text search configuration will be set to "english".
The comparision of strings is case-sensitive.
Data page checksums are disabled.
fixing permissions on existing directory /home/kingbase/userdata/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... UTC
creating configuration files ... ok
Begin setup encrypt device
initializing the encrypt device ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
create security database ... ok
load security database ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
You can change this by editing sys_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
/home/kingbase/install/kingbase/bin/sys_ctl -D /home/kingbase/userdata/data -l logfile start
[Tue 10 Mar 2026 04:19:21 PM UTC]start initdb...ok
waiting for server to start.... done
server started
* * * * * kingbase /home/kingbase/docker-entrypoint.sh check_and_run /home/kingbase/userdata/data >> /home/kingbase/cronlog
-------------------------------------------------------------------------------
4.#查看运行情况(查出的是所有)
docker ps
还想创建时,下面两个方案
bash
方案一:#删除已存在的 kingbase
# 1. 停止已运行的kingbase容器(如果容器在运行)
docker stop kingbase
# 2. 删除该容器(删除后才能复用名称)
docker rm kingbase
方案二:给新容器改个名称(保留旧容器)
docker run -tid --privileged \
--name kingbase2 \ # 改个新名称
kingbase:v1 /usr/sbin/init
数据库自动运行
容器启动后,数据库就开始运行,客户无须手动启动数据库。
bash
#启动数据库(不用操作)
[root@node1 ~]# docker start kingbase
#以交互式方式进入名为 kingbase 的 Docker 容器内部,打开一个 bash 命令行终端
[root@node1 ~]# docker exec -it kingbase /bin/bash
#查看运行状态
[kingbase@ecccd3c398c2 ~]$ sys_ctl -D /home/kingbase/userdata/data/ status
3、访问
bash
1.#容器内访问
#使用ksql访问 (默认 kingbase 用户)
[kingbase@ecccd3c398c2 ~]$ ksql -Ukingbase -d test -p54321
#仅输入ksql免密访问
[kingbase@ecccd3c398c2 ~]$ ksql
2.#容器外访问数据库(宿主机远程访问需要加-h 及改变映射端口)(注意:需要有客户端才行)
[kingbase@node1 ~]$ /home/kingbase/install/kingbase/bin/ksql -Ukingbase -d test -p 4321 -h 192.168.40.111
4、License.dat 持久化及更换 license
容器启动后对应的 license.dat 文件会复制到 etc 持久化目录,并建立软连接
bash
#进入容器
[root@node1 ~]# docker exec -it kingbase /bin/bash
#查看文件
[kingbase@4d98ac5ae0b4 ~]$ ls -l /home/kingbase/install/kingbase/bin/license.dat
-rwxr-xr-x. 1 kingbase kingbase 4995 Mar 10 15:49 /home/kingbase/install/kingbase/bin/license.dat
[kingbase@4d98ac5ae0b4 ~]$ ls -l /home/kingbase/install/kingbase/etc
lrwxrwxrwx. 1 kingbase kingbase 35 Mar 10 15:49 /home/kingbase/install/kingbase/etc -> /home/kingbase/userdata/data/../etc
#更新容器挂载目录/mnt/data/etc 目录下的 license.dat 文件(容器内挂载目录应为/home/kingbase/userdata/ 而不是/home/kingbase/userdata/data), 进入容器后,并输入命令修改成正确权限。
chown kingbase:kingbase /home/kingbase/userdata/etc/license.dat
chmod 755 /home/kingbase/userdata/etc/license.dat
根据上面的我的没改成功,因此改下面的
bash
#Kingbase 读取许可证的优先级:
容器内 Kingbase 安装目录 > 数据目录 > 软链接目录
# 1.备份旧许可证
cp /home/kingbase/install/kingbase/bin/license.dat /home/kingbase/install/kingbase/bin/license.dat.bak
# 2.替换为新许可证(确保新文件在容器内 /home/kingbase/userdata/etc/ 下)
cp /home/kingbase/userdata/etc/license.dat /home/kingbase/install/kingbase/bin/
# 3.重新设置权限(和旧文件一致)
chown kingbase:kingbase /home/kingbase/install/kingbase/bin/license.dat
chmod 755 /home/kingbase/install/kingbase/bin/license.dat
# 4.重启数据库服务(容器内 kingbase 用户执行)
/home/kingbase/install/kingbase/bin/sys_ctl restart -D /home/kingbase/userdata/data -m fast
5、启动和停止
bash
#进入容器
[root@node1 ~]# docker exec -it kingbase /bin/bash
#启停(让更改后的配置文件生效)
[kingbase@4d98ac5ae0b4 ~]$ /home/kingbase/install/kingbase/bin/sys_ctl -D /home/kingbase/userdata/data/ stop/start/reload/status
6、安装正确性验证
bash
1.#查看安装后容器的状态(查询容器 id)
[root@node1 ~]# docker ps -a
2.#使用命令,检查数据库启动日志
[root@node1 ~]# docker logs kingbase
3.#进容器查看
[root@node1 ~]# docker exec -it kingbase /bin/bash
[kingbase@577fcc19f29f ~]$ sys_ctl -D /home/kingbase/userdata/data/ status
7、卸载数据库
bash
1.#打开新终端;
2.#切换到 root 用户;
3.#执行卸载程序。
(1)停止容器
[root@node1 ~]# docker stop kingbase
(2)删除容器(先查看容器ID,根据容器ID删除)
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
577fcc19f29f kingbase:v1 "/bin/bash /home/kin..." 16 minutes ago Exited (137) 3 minutes ago kingbase
[root@node1 ~]# docker rm 577fcc19f29f
577fcc19f29f
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
(3)删除镜像
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kingbase v1 10ba6f33e228 8 months ago 754MB
#Docker 镜像的「分层存储机制」,所以显示的多
[root@node1 ~]# docker rmi 10ba6f33e228
Untagged: kingbase:v1
Deleted: sha256:10ba6f33e228ddd6be155e80523afe712be333ee25ccf9f912ee3a31899dc82f
Deleted: sha256:9a3456c59d66b55903778663bf8fac3584b7567cfc22f96b0a5a2bc99b756f92
Deleted: sha256:89921eb8392e5c47bf77d0817c290920174e707febf8f567b00a5de471b36fa6
Deleted: sha256:6d49abf31dcffd8707a34fbafe1c77feccd3257f867e019903980abccf5fe246
Deleted: sha256:bfc8682c0ceeff8bb75f24ca797a0f32b21f933c718608d1520989149ad72825
Deleted: sha256:0a27e8e236470c5a1bce79a3227186e331b57ddb246c164056a6d7498443059f
Deleted: sha256:a171d952514d7de4a5ebe0396b9fbac38bd6e7458d706a6ae06368248c3bc0f0
Deleted: sha256:6a9e819521d0d61a72552bc9e9b77d50f184f476b335584c031a4f00a24d3cd6
Deleted: sha256:677ae2259cf18c8ce1c9cf786cbef940df886a72d3dad9d47fb897e9dd1e1aae
Deleted: sha256:ce49b63661ff62eeaf9eaf388debdabf47d92856761f9065d33ef306270cdc0b
Deleted: sha256:96723fcc60ed58273a310102eee707df7a7a41acfd804d336f3847c3bc696540
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE