完整的Redis Docker安装脚本和配置文件
·
文章目录
一、建目录结构脚本 (setup_directories.sh)
#!/bin/bash
# 创建必要的目录
echo "创建Redis目录结构..."
sudo mkdir -p /software/redis/{data,logs,config}
# 设置目录权限
echo "设置目录权限..."
sudo chmod -R 755 /software/redis
sudo chown -R $USER:$USER /software/redis
echo "目录创建完成!"

二、使Redis配置文件 (redis.conf)
创建文件 /software/redis/config/redis.conf:
# Redis配置文件 - 优化配置
# 基础设置
################################## 网络设置 ###################################
# 绑定地址,0.0.0.0表示允许所有IP连接
bind 0.0.0.0
# 保护模式,设置为no允许远程连接
protected-mode no
# 端口号
port 6379
# 超时时间(秒)
timeout 0
# TCP连接保活时间
tcp-keepalive 300
################################# 通用设置 ####################################
# 以守护进程方式运行(在Docker中设为no)
daemonize no
# 进程PID文件
pidfile /var/run/redis_6379.pid
# 日志级别:debug, verbose, notice, warning
loglevel notice
# 日志文件路径
logfile "/data/redis.log"
# 数据库数量
databases 16
# 是否显示Redis logo
always-show-logo no
################################## 安全设置 ###################################
# 设置Redis密码
requirepass redis123456
# 重命名危险命令,增强安全性
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command SHUTDOWN ""
################################## 内存管理 ###################################
# 最大内存限制,0表示不限制(根据服务器内存调整)
maxmemory 1gb
# 内存达到上限时的策略
maxmemory-policy allkeys-lru
# 内存淘汰采样数
maxmemory-samples 5
############################## 持久化设置 - RDB ###############################
# 启用RDB持久化
save 900 1 # 900秒内至少有1个key被修改
save 300 10 # 300秒内至少有10个key被修改
save 60 10000 # 60秒内至少有10000个key被修改
# RDB持久化出错时是否停止写入
stop-writes-on-bgsave-error yes
# 压缩RDB文件
rdbcompression yes
# 检查RDB文件完整性
rdbchecksum yes
# RDB文件名
dbfilename dump.rdb
# RDB文件目录
dir /data
############################# 持久化设置 - AOF ###############################
# 启用AOF持久化
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"
# AOF同步策略
# always: 每次写入都同步,最安全但性能最差
# everysec: 每秒同步一次,推荐设置
# no: 由操作系统决定,性能最好但可能丢失数据
appendfsync everysec
# AOF重写期间是否同步
no-appendfsync-on-rewrite no
# 自动触发AOF重写的条件
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 加载AOF时如果文件损坏是否继续
aof-load-truncated yes
################################## 性能优化 ###################################
# 客户端最大连接数
maxclients 10000
# 延迟监控
latency-monitor-threshold 1
# 慢查询日志(微秒)
slowlog-log-slower-than 10000
slowlog-max-len 128
################################## 高级配置 ###################################
# 哈希数据结构配置
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 列表数据结构配置
list-max-ziplist-size -2
# 集合数据结构配置
set-max-intset-entries 512
# 有序集合数据结构配置
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 主动重新哈希
activerehashing yes
# 客户端输出缓冲区限制
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 每秒执行的任务次数
hz 10
# 动态HZ配置
dynamic-hz yes
三、 安装脚本 (install_redis.sh)
提示:创建my-network,否则删除 --network my-network \
代码如下(示例):
#!/bin/bash
# Redis Docker安装脚本
REDIS_DIR="/software/redis"
CONFIG_FILE="$REDIS_DIR/config/redis.conf"
DATA_DIR="$REDIS_DIR/data"
LOGS_DIR="$REDIS_DIR/logs"
PASSWORD="redis123456"
CONTAINER_NAME="redis"
echo "开始安装Redis Docker容器..."
# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
echo "错误: Docker未安装,请先安装Docker"
exit 1
fi
# 检查目录和配置文件是否存在
if [ ! -d "$REDIS_DIR" ]; then
echo "错误: Redis目录不存在: $REDIS_DIR"
exit 1
fi
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误: Redis配置文件不存在: $CONFIG_FILE"
exit 1
fi
if [ ! -d "$DATA_DIR" ]; then
echo "错误: 数据目录不存在: $DATA_DIR"
exit 1
fi
if [ ! -d "$LOGS_DIR" ]; then
echo "错误: 日志目录不存在: $LOGS_DIR"
exit 1
fi
echo "✅ 所有目录和配置文件检查通过"
# 拉取最新版Redis镜像
echo "拉取最新版Redis镜像..."
docker pull redis:7.2-alpine
# 停止并删除已存在的Redis容器(如果存在)
if docker ps -a | grep -q "$CONTAINER_NAME"; then
echo "停止并删除已存在的Redis容器..."
docker stop $CONTAINER_NAME >/dev/null 2>&1
docker rm $CONTAINER_NAME >/dev/null 2>&1
fi
# 创建Redis容器
echo "创建Redis容器..."
echo "挂载配置:"
echo " - 配置文件: $CONFIG_FILE"
echo " - 数据目录: $DATA_DIR"
echo " - 日志目录: $LOGS_DIR"
docker run -d \
--name $CONTAINER_NAME \
--restart always \
--network my-network \ #网络
-p 6379:6379 \
-v $CONFIG_FILE:/usr/local/etc/redis/redis.conf \
-v $DATA_DIR:/data \
-v $LOGS_DIR:/logs \
redis:7.2-alpine \
redis-server /usr/local/etc/redis/redis.conf
# 检查容器是否启动成功
if [ $? -eq 0 ]; then
echo "Redis容器创建成功!"
# 等待容器完全启动
echo "等待Redis服务启动..."
for i in {1..30}; do
CONTAINER_STATUS=$(docker inspect --format='{{.State.Status}}' $CONTAINER_NAME 2>/dev/null || echo "unknown")
if [ "$CONTAINER_STATUS" == "running" ]; then
# 检查Redis服务是否响应
if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
echo "✅ Redis服务启动成功!"
break
fi
elif [ "$CONTAINER_STATUS" == "restarting" ] || [ "$CONTAINER_STATUS" == "exited" ]; then
if [ $i -ge 5 ]; then
echo "❌ 容器状态异常: $CONTAINER_STATUS"
echo "查看详细日志..."
docker logs $CONTAINER_NAME --tail 20
exit 1
fi
fi
if [ $i -lt 10 ] || [ $((i % 5)) -eq 0 ]; then
echo "等待Redis启动...($i/30) - 状态: $CONTAINER_STATUS"
fi
sleep 2
done
# 最终测试Redis连接
echo "测试Redis连接..."
if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
echo "✅ Redis安装成功!"
echo ""
echo "安装信息:"
echo "🔑 密码: $PASSWORD"
echo "🌐 连接地址: localhost:6379"
echo "🐳 容器名称: $CONTAINER_NAME"
echo "📁 配置文件: $CONFIG_FILE"
echo "📁 数据目录: $DATA_DIR"
echo "📁 日志目录: $LOGS_DIR"
echo "🔄 重启策略: always"
# 显示容器状态
echo ""
echo "容器状态:"
docker ps -f name=$CONTAINER_NAME
# 显示Redis基本信息
echo ""
echo "Redis基本信息:"
docker exec $CONTAINER_NAME redis-cli -a $PASSWORD info server 2>/dev/null | grep -E "(redis_version|uptime_in_seconds|connected_clients)" | head -3
else
echo "❌ Redis连接测试失败"
echo "容器状态:"
docker ps -a -f name=$CONTAINER_NAME
echo ""
echo "详细日志:"
docker logs $CONTAINER_NAME
exit 1
fi
else
echo "❌ Redis容器创建失败"
exit 1
fi
四、 启动脚本 (start_redis.sh)
#!/bin/bash
# Redis Docker启动脚本
CONTAINER_NAME="redis"
PASSWORD="redis123456"
echo "启动Redis容器..."
# 检查容器是否存在
if ! docker ps -a | grep -q "$CONTAINER_NAME"; then
echo "错误: Redis容器不存在,请先运行安装脚本"
exit 1
fi
# 检查容器是否已经在运行
if docker ps | grep -q "$CONTAINER_NAME"; then
echo "Redis容器已经在运行中"
docker ps -f name=$CONTAINER_NAME
exit 0
fi
# 启动容器
echo "启动Redis容器..."
docker start $CONTAINER_NAME
if [ $? -eq 0 ]; then
echo "✅ Redis容器启动成功!"
# 等待容器完全启动
echo "等待Redis服务启动..."
for i in {1..15}; do
if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
echo "✅ Redis服务启动成功!"
break
fi
if [ $i -lt 5 ] || [ $((i % 5)) -eq 0 ]; then
echo "等待Redis启动...($i/15)"
fi
sleep 2
done
# 显示容器状态
echo "容器状态:"
docker ps -f name=$CONTAINER_NAME
else
echo "❌ Redis容器启动失败"
docker logs $CONTAINER_NAME --tail 10
exit 1
fi
五、 重启脚本(restart-redis.sh)
#!/bin/bash
# Redis Docker重启脚本
CONTAINER_NAME="redis"
PASSWORD="redis123456"
echo "重启Redis容器..."
# 检查容器是否存在
if ! docker ps -a | grep -q "$CONTAINER_NAME"; then
echo "❌ 错误: Redis容器不存在"
exit 1
fi
# 检查容器当前状态
if docker ps | grep -q "$CONTAINER_NAME"; then
echo "Redis容器正在运行,开始停止..."
# 停止容器
docker stop $CONTAINER_NAME
if [ $? -eq 0 ]; then
echo "✅ Redis容器停止成功"
# 等待容器完全停止
echo "等待容器停止..."
for i in {1..10}; do
if ! docker ps | grep -q "$CONTAINER_NAME"; then
echo "✅ Redis容器已完全停止"
break
fi
if [ $i -eq 5 ]; then
echo "容器正在停止中...请稍候"
fi
sleep 1
done
else
echo "❌ Redis容器停止失败"
exit 1
fi
else
echo "Redis容器当前未运行"
fi
# 启动容器
echo "启动Redis容器..."
docker start $CONTAINER_NAME
if [ $? -eq 0 ]; then
echo "✅ Redis容器启动成功!"
# 等待容器完全启动
echo "等待Redis服务启动..."
for i in {1..15}; do
if docker exec $CONTAINER_NAME redis-cli -a $PASSWORD ping 2>/dev/null | grep -q "PONG"; then
echo "✅ Redis服务重启成功!"
# 显示容器状态
echo ""
echo "容器状态:"
docker ps -f name=$CONTAINER_NAME
# 显示基本信息
echo ""
echo "Redis基本信息:"
docker exec $CONTAINER_NAME redis-cli -a $PASSWORD info 2>/dev/null | grep -E "(redis_version|uptime_in_seconds|connected_clients|used_memory_human)" | head -5
exit 0
fi
# 每5次显示一次等待信息
if [ $i -lt 5 ] || [ $((i % 5)) -eq 0 ]; then
echo "等待Redis启动...($i/15)"
fi
sleep 2
done
# 如果循环结束仍未启动成功
echo "❌ Redis服务启动超时,请检查日志"
docker logs $CONTAINER_NAME --tail 10
exit 1
else
echo "❌ Redis容器启动失败"
docker logs $CONTAINER_NAME --tail 10
exit 1
fi
五、 使用流程
# 给所有脚本添加执行权限
chmod +x install_redis.sh start_redis.sh restart-redis.sh
# 1. 创建目录结构
./setup_directories.sh
# 2. 创建配置文件(如果还没有的话)
# 将上面的redis.conf内容保存到 /software/redis/config/redis.conf
# 3. 安装Redis
./install_redis.sh
# 4. 启动
./start_redis.sh
总结
- 安全性: 设置密码、禁用危险命令、保护模式配置
- 持久化: 同时启用RDB和AOF,数据安全可靠
- 性能优化: 合理的内存管理和数据结构配置
- 自动启动: 使用 --restart always 确保服务自动重启
- 数据持久化: 所有数据文件挂载到宿主机
- 详细日志: 完整的日志记录和监控配置
更多推荐

所有评论(0)