
拉取镜像arm镜像:registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_dragonfly
拉取镜像x86镜像:registry.cn-hangzhou.aliyuncs.com/qiluo-images/dragonfly
运行cli命令:
bash
docker run -d \
--name dragonfly \
-p 6379:6379 \
registry.cn-hangzhou.aliyuncs.com/qiluo-images/dragonfly \
--requirepass="87vhqEneQ5u8"
脚本运行:vi deploy_dragonfly.sh
bash
#!/bin/bash
# 定义变量(可修改部分)
CONTAINER_NAME="dragonfly"
HOST_PORT=6379
CONTAINER_PORT=6379
PASSWORD="87vhqEneQ5u8" # 建议从环境变量读取,此处仅为示例
IMAGE="registry.cn-hangzhou.aliyuncs.com/qiluo-images/dragonfly"
# 目录配置
DATA_DIR="/data/dragonfly"
CONF_DIR="$DATA_DIR/conf"
LOG_DIR="$DATA_DIR/log"
DATA_VOLUME="$DATA_DIR/data"
SNAPSHOTS_DIR="$DATA_DIR/snapshots"
# 检查目录结构
check_dirs() {
local dirs=("$DATA_DIR" "$LOG_DIR" "$DATA_VOLUME" "$CONF_DIR" "$SNAPSHOTS_DIR")
for dir in "${dirs[@]}"; do
if [ ! -d "$dir" ]; then
echo "创建目录: $dir"
mkdir -p "$dir" || { echo "目录创建失败!"; exit 1; }
chmod -R 755 "$dir"
fi
done
# 设置数据目录权限(Dragonfly 使用 dfly:dfly 用户)
chown -R 999:999 "$DATA_VOLUME" "$SNAPSHOTS_DIR" 2>/dev/null || true
}
# 检查容器状态
check_container() {
if docker ps -a --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then
echo "发现已有容器 [$CONTAINER_NAME],正在清理..."
docker rm -f "$CONTAINER_NAME" || { echo "删除旧容器失败!"; exit 1; }
fi
}
# 创建 Dragonfly 配置文件(flagfile 格式)
create_config() {
local config_file="$CONF_DIR/dragonfly.conf"
if [ ! -f "$config_file" ]; then
echo "创建 Dragonfly 配置文件(flagfile 格式)..."
cat > "$config_file" << EOF
# Dragonfly 配置文件(flagfile 格式)
# 每行一个命令行参数
# 认证密码
--requirepass=$PASSWORD
# 数据目录
--dir=/data
# 日志级别
--loglevel=notice
# 快照文件名
--dbfilename=dump.rdb
# 快照保存策略
--save=900,1
--save=300,10
--save=60,10000
# 内存配置(根据需求调整)
# --maxmemory=16gb
# --maxmemory_policy=allkeys-lru
# 网络配置
# --bind=0.0.0.0
# --port=6379
# Dragonfly 特定配置
# 线程数(根据CPU核心数调整)
# --proactor_threads=4
# 内存分配器
# --memory_allocator=jemalloc
EOF
chmod 644 "$config_file"
echo "配置文件已创建: $config_file"
fi
}
# 启动 Dragonfly 容器
start_dragonfly() {
echo "正在启动 Dragonfly 容器..."
# 使用配置文件启动
echo "使用配置文件启动..."
docker run -d \
--name "$CONTAINER_NAME" \
--restart=unless-stopped \
--user 999:999 \
-p "$HOST_PORT:$CONTAINER_PORT" \
-v "$DATA_VOLUME:/data" \
-v "$SNAPSHOTS_DIR:/data/snapshots" \
-v "$LOG_DIR:/var/log/dragonfly" \
-v "$CONF_DIR/dragonfly.conf:/etc/dragonfly/dragonfly.conf" \
"$IMAGE" \
--flagfile /etc/dragonfly/dragonfly.conf
if [ $? -ne 0 ]; then
echo "Dragonfly 启动失败!"
exit 1
fi
}
# 验证服务状态
verify_connection() {
echo "等待服务启动(10秒)..."
sleep 10
if command -v redis-cli >/dev/null 2>&1; then
echo "测试连接..."
if redis-cli -p "$HOST_PORT" -a "$PASSWORD" ping 2>/dev/null | grep -q "PONG"; then
echo_connection_info
else
echo "连接测试失败,尝试无密码连接..."
if redis-cli -p "$HOST_PORT" ping 2>/dev/null | grep -q "PONG"; then
echo "警告: 密码认证未生效,但服务正在运行"
echo_connection_info
else
check_container_logs
fi
fi
else
echo "警告: 未找到 redis-cli,跳过连接测试"
echo_connection_info
fi
}
echo_connection_info() {
echo "--------------------------------------------------"
echo "Dragonfly 启动完成!"
echo "容器名称: $CONTAINER_NAME"
echo "连接地址: 127.0.0.1:$HOST_PORT"
echo "认证密码: $PASSWORD"
echo "数据目录: $DATA_VOLUME"
echo "快照目录: $SNAPSHOTS_DIR"
echo "日志目录: $LOG_DIR"
echo "配置目录: $CONF_DIR"
echo ""
echo "管理命令:"
echo " 查看日志: docker logs $CONTAINER_NAME"
echo " 进入容器: docker exec -it $CONTAINER_NAME /bin/bash"
echo " 停止服务: docker stop $CONTAINER_NAME"
echo ""
echo "连接示例:"
echo " redis-cli -p $HOST_PORT -a $PASSWORD"
echo " redis-cli -p $HOST_PORT -a $PASSWORD ping"
}
check_container_logs() {
echo "连接测试失败,检查容器状态..."
if docker ps | grep -q "$CONTAINER_NAME"; then
echo "容器正在运行,但连接失败。查看日志:"
docker logs "$CONTAINER_NAME" --tail 20
else
echo "容器未运行!详细日志:"
docker logs "$CONTAINER_NAME"
fi
exit 1
}
# 显示 Dragonfly 版本信息
show_version() {
echo "获取 Dragonfly 版本信息..."
docker exec "$CONTAINER_NAME" /usr/local/bin/dragonfly --version 2>/dev/null || \
echo "无法获取版本信息,但服务可能正常运行"
}
# 主流程
main() {
echo "开始部署 Dragonfly 服务..."
check_dirs
create_config
check_container
start_dragonfly
verify_connection
show_version
}
main
赋予执行权限:
bash
chmod +x deploy_dragonfly.sh
bash
配置文件已创建: /data/dragonfly/conf/dragonfly.conf
正在启动 Dragonfly 容器...
使用配置文件启动...
a3ef426247c261ae8fffbff8d8b10a4d8fa1838e3b339e63a4c6998200c24249
等待服务启动(10秒)...
警告: 未找到 redis-cli,跳过连接测试
--------------------------------------------------
Dragonfly 启动完成!
容器名称: dragonfly
连接地址: 127.0.0.1:6379
认证密码: 87vhqEneQ5u8
数据目录: /data/dragonfly/data
快照目录: /data/dragonfly/snapshots
日志目录: /data/dragonfly/log
配置目录: /data/dragonfly/conf
管理命令:
查看日志: docker logs dragonfly
进入容器: docker exec -it dragonfly /bin/bash
停止服务: docker stop dragonfly
连接示例:
redis-cli -p 6379 -a 87vhqEneQ5u8
redis-cli -p 6379 -a 87vhqEneQ5u8 ping
获取 Dragonfly 版本信息...
dragonfly v1.32.0-960ddf41c41ce27d5c038856957b4d740629f94b
build time: 2025-08-03 19:28:00
[root@k8s-normal-node01 data]# docker logs dragonfly
I20251011 02:24:25.323156 1 init.cc:127] dragonfly running in opt mode.
I20251011 02:24:25.323275 1 dfly_main.cc:757] Starting dragonfly df-v1.32.0-960ddf41c41ce27d5c038856957b4d740629f94b
.--::--.
:+*=: =@@@@@@@@= :+*+:
%@@@@@@%*=. =@@@@@@@@- .=*%@@@@@@#
@@@@@@@@@@@@#+-. .%@@@@#. .-+#@@@@@@@@@@@%
-@@@@@@@@@@@@@@@@*:#@@#:*@@@@@@@@@@@@@@@@-
:+*********####-%@%%@%-####********++.
.%@@@@@@@@@@@@@%:@@@@@@:@@@@@@@@@@@@@@%
.@@@@@@@@%*+-: =@@@@= .:-+*%@@@@@@@%.
=*+-: ###* .:-+*=
%@@%
*@@*
+@@=
:##:
:@@:
@@
..
* Logs will be written to the first available of the following paths:
/tmp/dragonfly.*
./dragonfly.*
* For the available flags type dragonfly [--help | --helpfull]
* Documentation can be found at: https://www.dragonflydb.io/docs
I20251011 02:24:25.323401 1 dfly_main.cc:799] maxmemory has not been specified. Deciding myself....
I20251011 02:24:25.323410 1 dfly_main.cc:808] Found 53.76GiB available memory. Setting maxmemory to 43.01GiB
W20251011 02:24:25.323443 1 dfly_main.cc:380] Weird error 1 switching to epoll
I20251011 02:24:25.329108 1 proactor_pool.cc:149] Running 16 io threads
I20251011 02:24:25.335434 1 server_family.cc:1073] Host OS: Linux 5.10.0-136.12.0.88.ctl3.x86_64 x86_64 with 16 threads
I20251011 02:24:25.340073 1 snapshot_storage.cc:186] Load snapshot: Searching for snapshot in directory: "/data"
W20251011 02:24:25.340616 1 server_family.cc:1173] Load snapshot: No snapshot found
I20251011 02:24:25.362972 10 listener_interface.cc:102] sock[35] AcceptServer - listening on 0.0.0.0:6379
I20251011 02:24:26.898734 13 version_monitor.cc:174] Your current version '1.32.0' is not the latest version. A newer version '1.34.1' is now available. Please consider an update.
