Apache Kvrocks 2.17.0 Docker Compose 部署指南
使用官方 apache/kvrocks 镜像以 Docker Compose 部署 Apache Kvrocks 2.17.0,覆盖镜像选型、数据持久化、配置挂载、等价 docker run 与常见故障排查。
Apache Kvrocks 2.17.0 Docker Compose 部署指南
目标:使用官方 apache/kvrocks 镜像通过 Docker Compose 从零部署 Apache Kvrocks 2.17.0 单实例,完成数据持久化、配置文件挂载、等价 docker run 与日常运维验证,已在 Docker 29.8.1 + Docker Compose v5.5.1 环境实测通过,服务端口 6666。
一、环境信息
- Apache Kvrocks 镜像:apache/kvrocks:2.17.0(官方镜像,镜像内
kvrocks version 2.17.0 (commit 185d4221)) - Docker Engine:29.8.1
- Docker Compose:v5.5.1(
docker compose插件形态) - 宿主系统:Ubuntu 22.04 LTS(x86_64)
- 服务端口:6666(容器内默认监听,镜像已 EXPOSE 6666)
- 数据卷:/var/lib/kvrocks(镜像内数据与配置目录)
- 部署目录:/srv/kvrocks(docker-compose.yml 所在目录)
- 示例认证口令:
q1w2e3r4
二、镜像选型说明
2.1 官方镜像
Kvrocks 官方(Apache)在 Docker Hub 维护 apache/kvrocks 镜像,与 GitHub Releases 版本同步发布,选型即选它,无需自行构建。实测可拉取的版本标签:
| 镜像标签 | 实测结果 | 说明 |
|---|---|---|
| apache/kvrocks:2.17.0 | 实测拉取成功(162MB) | 当前最新稳定版,本文实测版本 |
| apache/kvrocks:2.16.0 | 实测拉取成功 | 上一稳定版 |
| apache/kvrocks:latest | 实测拉取成功,当前指向 2.17.0 | 滚动最新,生产不建议使用(版本漂移) |
拉取命令:
docker pull apache/kvrocks:2.17.0
实测回显:
docker.io/apache/kvrocks:2.17.0
2.2 镜像关键信息(实测)
| 项目 | 值 | 说明 |
|---|---|---|
| 启动入口 ENTRYPOINT | kvrocks -c /var/lib/kvrocks/kvrocks.conf --dir /var/lib/kvrocks --pidfile /var/run/kvrocks/kvrocks.pid --bind 0.0.0.0 | 完整启动命令,覆盖时需覆盖整个 entrypoint |
| 运行用户 | 999(kvrocks) | 挂载宿主目录需保证 UID 999 可写 |
| 内置配置文件 | /var/lib/kvrocks/kvrocks.conf | 与数据同目录 |
| 数据目录 | /var/lib/kvrocks | 持久化挂载点 |
| 暴露端口 | 6666/tcp | Redis 协议 |
| 内置健康检查 | redis-cli -p 6666 PING | grep -E '(PONG|NOAUTH)',间隔 30s,超时 3s,启动等待 30s,重试 3 次 | Ps 列显示 (healthy) |
| 环境变量 | 仅 PATH 与 MALLOC_CONF(jemalloc 参数) | 镜像不支持环境变量注入业务配置 |
三、前置条件
3.1 安装 Docker 与 Compose 插件
curl -fsSL https://get.docker.com | bash
docker compose version
实测回显:
Docker Compose version v5.5.1
3.2 创建部署目录
mkdir -p /srv/kvrocks/data
cd /srv/kvrocks
⚠️ 注意:bind 挂载的 data 目录必须让容器内 UID 999 可写,否则 kvrocks 无法创建 RocksDB 文件:
chown 999:999 /srv/kvrocks/data。
四、部署步骤
4.1 导出镜像自带配置文件
镜像把默认 kvrocks.conf 放在 /var/lib/kvrocks/ 内。若直接把空宿主目录挂到 /var/lib/kvrocks,会遮蔽该文件导致启动失败(详见 FAQ)。因此先将镜像内默认配置导出到宿主 data 目录:
docker run --rm -v /srv/kvrocks/data:/out --entrypoint sh apache/kvrocks:2.17.0 -c "cp /var/lib/kvrocks/kvrocks.conf /out/ && ls -la /out"
实测回显:
total 60
drwxr-xr-x 2 kvrocks kvrocks 4096 Oct 11 14:13 .
drwxr-xr-x 19 root root 4096 Oct 11 14:13 ..
-rw-r--r-- 1 kvrocks kvrocks 51347 Oct 11 14:13 kvrocks.conf
4.2 编写 docker-compose.yml
services:
kvrocks:
image: apache/kvrocks:2.17.0
container_name: kvrocks
ports:
- "6666:6666"
volumes:
- ./data:/var/lib/kvrocks
restart: unless-stopped
4.3 启动与状态确认
cd /srv/kvrocks
docker compose up -d
实测回显:
Container kvrocks Started
docker compose ps
实测回显:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
kvrocks apache/kvrocks:2.17.0 "kvrocks -c /var/lib…" kvrocks 27 seconds ago Up 26 seconds (healthy) 0.0.0.0:6666->6666/tcp, [::]:6666->6666/tcp
4.4 连通性与读写验证
redis-cli -h 127.0.0.1 -p 6666 SET greeting "hello-kvrocks"
redis-cli -h 127.0.0.1 -p 6666 GET greeting
redis-cli -h 127.0.0.1 -p 6666 INFO server | grep -E "kvrocks_version|tcp_port"
实测回显:
OK
hello-kvrocks
kvrocks_version:2.17.0
tcp_port:6666
五、数据持久化说明
5.1 数据目录结构
Kvrocks 的数据落在挂载的 /var/lib/kvrocks(宿主 ./data)下:
/srv/kvrocks/data/
├── db/ # RocksDB 数据文件(SST/WAL/CURRENT 等)
├── kvrocks.conf # 服务配置文件
└── kvrocks_2026-10-11.log # 服务日志
5.2 down/up 持久化实测
cd /srv/kvrocks
docker compose down
docker compose up -d
实测回显:
Network kvrocks_default Removing
Network kvrocks_default Removed
Container kvrocks Started
redis-cli -h 127.0.0.1 -p 6666 GET greeting
实测回显(容器重建后数据完好):
hello-kvrocks
5.3 两种持久化方案
| 方案 | compose 片段 | 特点 |
|---|---|---|
| bind 挂载宿主目录 | - ./data:/var/lib/kvrocks | 数据位置直观可控;空目录会遮蔽镜像自带 conf,需按 4.1 预先导出 |
| named volume | - kvrocks-data:/var/lib/kvrocks | 首次启动自动把镜像内 conf 播种进卷,开箱即用;数据由 Docker 管理 |
named volume 完整写法(实测开箱即用,启动即 healthy):
services:
kvrocks:
image: apache/kvrocks:2.17.0
container_name: kvrocks
ports:
- "6666:6666"
volumes:
- kvrocks-data:/var/lib/kvrocks
restart: unless-stopped
volumes:
kvrocks-data:
六、常用环境变量表
官方镜像不提供业务配置类环境变量,配置只能通过配置文件挂载或启动参数覆盖实现。镜像内置的环境变量仅以下一项,通常无需改动:
| 环境变量 | 实测默认值 | 说明 |
|---|---|---|
| MALLOC_CONF | prof:true,prof_active:false,background_thread:true | jemalloc 内存分配器参数,排查内存问题时开启采样用 |
💡 说明:若习惯 Redis 官方镜像那种
REDIS_PASSWORD式环境变量,Kvrocks 官方镜像目前不支持;密码等配置改用第八章的启动参数覆盖方式。
七、常用配置参数说明(entrypoint/command 覆盖)
镜像 ENTRYPOINT 是一条完整的 kvrocks 启动命令,--<config-key> <config-value> 形式的参数可直接覆盖任意配置项。常用覆盖示例:
| 启动参数 | 等价配置项 | 作用 |
|---|---|---|
--bind 0.0.0.0 | bind | 监听地址(镜像默认已带) |
--dir /var/lib/kvrocks | dir | 数据目录(镜像默认已带) |
--port 6667 | port | 监听端口 |
--requirepass q1w2e3r4 | requirepass | 访问口令 |
--workers 4 | workers | 工作线程数 |
实测带密码部署(覆盖 entrypoint 追加 --requirepass):
services:
kvrocks:
image: apache/kvrocks:2.17.0
container_name: kvrocks
entrypoint: ["kvrocks", "-c", "/var/lib/kvrocks/kvrocks.conf", "--bind", "0.0.0.0", "--requirepass", "q1w2e3r4", "--dir", "/var/lib/kvrocks"]
ports:
- "6666:6666"
volumes:
- kvrocks-data:/var/lib/kvrocks
restart: unless-stopped
volumes:
kvrocks-data:
验证:
docker compose up -d
redis-cli -h 127.0.0.1 -p 6666 PING
redis-cli -h 127.0.0.1 -p 6666 -a q1w2e3r4 --no-auth-warning PING
redis-cli -h 127.0.0.1 -p 6666 -a q1w2e3r4 --no-auth-warning SET auth-test done
redis-cli -h 127.0.0.1 -p 6666 -a q1w2e3r4 --no-auth-warning GET auth-test
实测回显:
NOAUTH Authentication required.
PONG
OK
done
⚠️ 注意:override 时应覆盖整个
entrypoint:,而不是写command:。镜像 CMD 为空,command:里的内容会全部变成 ENTRYPOINT(kvrocks 进程)的尾部参数,末尾多出的位置参数会让 kvrocks 打印 Usage 后退出,容器进入 Restarting(实测复现,见 FAQ Q2)。
八、配置文件持久化(conf 挂载)
将宿主编写好的 kvrocks.conf 单独挂载进容器(conf 与数据分目录管理,改动即时生效于下次重启):
8.1 准备配置文件
mkdir -p /srv/kvrocks/conf
cp /srv/kvrocks/data/kvrocks.conf /srv/kvrocks/conf/
按需修改关键字段(实测样例:监听 0.0.0.0、workers 调整为 4、数据目录指向容器内持久目录):
bind 0.0.0.0
port 6666
workers 4
dir /var/lib/kvrocks/db
8.2 compose 挂载并覆盖 entrypoint
services:
kvrocks:
image: apache/kvrocks:2.17.0
container_name: kvrocks
entrypoint: ["kvrocks", "-c", "/etc/kvrocks/kvrocks.conf", "--dir", "/var/lib/kvrocks/db", "--bind", "0.0.0.0"]
ports:
- "6666:6666"
volumes:
- ./data:/var/lib/kvrocks
- ./conf/kvrocks.conf:/etc/kvrocks/kvrocks.conf:ro
restart: unless-stopped
8.3 验证自定义配置生效
cd /srv/kvrocks
docker compose up -d
docker compose ps --format "table {{.Name}}\t{{.Status}}"
redis-cli -h 127.0.0.1 -p 6666 CONFIG GET workers
实测回显:
NAME STATUS
kvrocks Up 8 seconds (healthy)
workers
4
💡 说明:镜像内置用户为 999,:ro 只读挂载的 conf 文件保证容器内不可改写宿主配置;如需在容器内用 CONFIG SET 且让其持久化,请去掉 :ro 并确保文件属主为 999。
九、等价 docker run 运行方式
与第四章 compose 等价(named volume 版)的单命令运行:
docker run -d --name kvrocks-run -p 16379:6666 -v kvrocks-run-data:/var/lib/kvrocks apache/kvrocks:2.17.0
实测回显:
162d9f0e230b9afb617e1b38893fb92afbcd39832b1d9bbd286f64909653d0e8
docker ps --filter name=kvrocks-run --format "{{.Names}} {{.Status}}"
redis-cli -h 127.0.0.1 -p 16379 SET run-test ok
redis-cli -h 127.0.0.1 -p 16379 GET run-test
实测回显:
kvrocks-run Up 8 seconds (healthy)
OK
ok
清理测试实例:
docker rm -f kvrocks-run
docker volume rm kvrocks-run-data
十、常用运维命令
以下命令均在 /srv/kvrocks(docker-compose.yml 所在目录)内执行。
查看实时状态:
docker compose ps
查看与跟踪日志:
docker compose logs --tail 20 kvrocks
docker compose logs -f kvrocks
实测日志片段:
kvrocks | [2026-10-11T14:18:11.979815+00:00][I][worker.cc:646] [worker] Thread #129981407831744 started
kvrocks | [2026-10-11T14:18:11.979878+00:00][I][worker.cc:646] [worker] Thread #129980614833856 started
kvrocks | [2026-10-11T14:18:11.980090+00:00][I][server.cc:246] [server] Ready to accept connections
查看容器内进程:
docker compose top
实测回显:
SERVICE # UID PID PPID C STIME TTY TIME CMD
kvrocks 1 999 6472 6449 0 14:18 ? 00:00:00 kvrocks -c /var/lib/kvrocks/kvrocks.conf --dir /var/lib/kvrocks --pidfile /var/run/kvrocks/kvrocks.pid --bind 0.0.0.0
重启 / 停止 / 启动:
docker compose restart
docker compose stop
docker compose start
实测回显(restart):
Container kvrocks Restarting
Container kvrocks Started
进入容器排查:
docker compose exec kvrocks sh
在容器内查看数据目录:
docker compose exec kvrocks ls /var/lib/kvrocks
实测回显:
db
kvrocks.conf
kvrocks_2026-10-11.log
升级镜像版本:
docker compose pull
docker compose up -d
停止并移除(保留数据卷):
docker compose down
实测回显:
Network kvrocks_default Removing
Network kvrocks_default Removed
十一、常见问题(FAQ)
Q1:容器不断 Restarting,日志报 Failed to load config. Error: failed to open file '/var/lib/kvrocks/kvrocks.conf': No such file or directory?
用空宿主目录 bind 挂载 /var/lib/kvrocks,遮蔽了镜像自带的 kvrocks.conf。解决:按 4.1 节先把镜像内配置导出到宿主目录(或改用 named volume,首启自动播种配置)。
Q2:写了 command: 覆盖参数后容器重启循环,日志只有一段 Usage: 帮助信息?
镜像 ENTRYPOINT 本身就是完整启动命令、CMD 为空,command: 的内容被当作 ENTRYPOINT 的尾部位置参数,kvrocks 收到未知位置参数即打印 Usage 退出。解决:改用 entrypoint: 整体覆盖(见第七、八章)。
Q3:容器反复重启且数据目录没有生成 db 文件?
宿主 data 目录属主不是 UID 999,kvrocks 无写权限。解决:宿主执行 chown 999:999 /srv/kvrocks/data 后 docker compose up -d。
Q4:Ps 状态一直是 (health: starting)?
镜像健康检查含 30s 启动等待期(start_period),首次启动 rocksdb 初始化需数秒至数十秒,属正常;持续 starting 超过 2 分钟再用 docker compose logs 排查启动错误。
Q5:未带密码时 PING 返回 NOAUTH Authentication required.?
服务端配置了 requirepass(配置文件或启动参数)。客户端使用 redis-cli -a <口令> 连接,或去掉 requirepass 配置(生产不建议)。
Q6:如何修改监听端口?
两处同步改:compose 的 ports 映射(如 "6667:6666" 宿主侧换端口)与配置/启动参数中的 port(容器内端口)。仅改宿主映射端口即可满足绝大多数场景,容器内端口无需动。
十二、参考链接
- Kvrocks 官方镜像(Docker Hub):https://hub.docker.com/r/apache/kvrocks
- Kvrocks 官网:https://kvrocks.apache.org
- GitHub 仓库(含 Dockerfile):https://github.com/apache/kvrocks
- 配置说明(官方):https://kvrocks.apache.org/docs/config
- Docker Compose 官方文档:https://docs.docker.com/compose/