使用docker 安装dragonfly带配置文件(x86和arm)版本

拉取镜像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.
相关推荐
乐迪信息4 小时前
乐迪信息:智慧煤矿输送带安全如何保障?AI摄像机全天候识别
大数据·运维·人工智能·安全·自动化·视觉检测
7hhhhhhh4 小时前
驱动开发-Linux启动
运维·服务器
_BugMan6 小时前
【k8s】基础概念+下载安装教程
容器·rpc·kubernetes
Mr. Cao code6 小时前
Dockerfile 指令详解与实战指南
linux·运维·ubuntu·docker·容器
风清再凯6 小时前
05-企业级私有仓库Harbor
docker
失因6 小时前
Docker 镜像结构与 Dockerfile 案例
运维·docker·云原生·容器·tomcat
九皇叔叔7 小时前
Docker 镜像维护指南:从配置优化到 MySQL 实战运行
mysql·adb·docker
郝学胜-神的一滴7 小时前
Linux 文件描述符详解
linux·运维·服务器
JAVA学习通7 小时前
JetLinks设备接入的认识与理解
运维·docker·容器·rocketmq