Docker 中安装单体架构 Redis 的 Shell 脚本

2024-04-30 06:28

本文主要是介绍Docker 中安装单体架构 Redis 的 Shell 脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该脚本用于实现 root 用户在 Linux 操作系统下的 Docker 中安装单体架构 Redis

Shell 脚本 Git 仓库地址

Gitee:https://gitee.com/tongchaowei/common-shell/tree/main/root

执行脚本

bash ./docker-redis-install-single.sh

image.png

需要注意的

  • 该脚本会先检查是否安装了社区版 Docker,如果没有安装,则会退出脚本的执行,所以请先完成社区版 Docker 的安装
  • 该脚本会进行如下目录的映射:
    • /log: /var/log/redis:Redis 日志文件存放目录
    • /data:/var/lib/mysql,Redis 数据文件存放的目录
    • /conf/redis.conf:/etc/redis/redis.conf,Redis 配置文件
  • 该脚本启动容器时,会设置的参数如下:
    • --restart=always:跟随系统启动而自启
    • --privileged=true:容器具有 root 权限
    • redis-server /etc/redis/redis.conf:启动容器之后,运行 redis-server 命令,并指定 redis-server 命令读取的 Redis 配置文件的路径
  • 该脚本在启动 Redis 容器之前,会创建 Redis 日志文件 $home/log/redis-server.log,同时会修改日志文件权限为 777,防止容器中 Redis 无法访问和修改日志文件
  • 该脚本在启动 Redis 容器之前,会要求输入访问 Redis 服务时使用的密码,因为在后面的编写 Redis 配置文件时,会开启 Redis 服务的访问权限认证(设置客户端访问 Redis 服务时的密码)

Redis 配置文件

该脚本在启动 Redis 容器之前,编写的配置文件内容如下:

配置文件存放位置:$home/conf/redis.conf
$home:Docker 安装 Redis 相关映射目录和文件的家目录;
其中,有进行注释说明的配置项是我目前有使用到的配置,没有进行注释说明的配置项是在 Redis 默认配置文件中有进行配置的,我复制过来的;
Redis 配置文件配置项详细说明可以参考:https://www.yuque.com/u27599042/ckgabz/hpf8hyeui2fghcxx

################################## NETWORK #####################################
# 指定可以访问当前 Redis 服务的客户端 IP,为了使所有其它客户端都可访问,一般要将其注释掉
# bind 127.0.0.1 -::1
# 关闭保护模式,以确保其它客户端可以连接 Redis,否则只允许本机的客户端访问
protected-mode no
# Redis 服务监听端口号,默认 6379
port 6379
# TCP 连接的队列的长度,其主要用于解决高并发场景下客户端慢连接问题,生产环境下(特别是高并发场景下),backlog 的值最好要大一些
tcp-backlog 511
# 当客户端与 Redis 间的空闲时间超过该时长后,客户端和 Redis 服务器的连接会自动断开。单位秒。默认值为 0,表示永远不超时。
timeout 0
# 设置 Redis 检测与其连接的所有客户端的存活性时间间隔,单位秒,一般是在空闲超时 timeout 设置为 0 时进行配置。
tcp-keepalive 300
################################# GENERAL #####################################
# 配置 Redis 启动不采用守护进程方式,避免与 Docker 启动容器 -d(以守护进程执行) 选项发生冲突
daemonize no
# 指定 Redis 运行时 pid(Redis 进程 id)写入的文件
pidfile /var/run/redis_6379.pid
# 配置日志级别。notice:可以获取到在生产中想获取到的适当多的信息,默认级别。
loglevel notice
# 指定 Redis 运行日志记录的位置
logfile "/var/log/redis/redis-server.log"
# 设置数据库的数量
databases 16
# 只有在交互式会话中才会显示 Redis Logo,否则始终在启动日志中显示 Redis Logo。
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
################################ SNAPSHOTTING  ################################
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
################################# REPLICATION #################################
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
################################## SECURITY ###################################
acllog-max-len 128
# 设置客户端访问 Redis 服务时的密码
requirepass $redis_pwd
############################# LAZY FREEING ####################################
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
############################ KERNEL OOM CONTROL ##############################
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
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
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
########################### ACTIVE DEFRAGMENTATION #######################
jemalloc-bg-thread yes

Shell 脚本源码

#!/bin/bash
# 该脚本用于实现 root 用户在 Linux 操作系统下的 Docker 中安装单体架构 Redis# 临时保存并修改语言环境
LANG_temp=$LANG
LANG=zh_CN.UTF-8# 还原语言环境
function re_lang () {# 将语言环境修改回原来的值LANG=$LANG_temp
}# 还原语言环境,并无异常退出
function re_lang_exit () {re_langexit 0
}function success_text () {echo -e -n "\033[32m【SUCCESS】\033[0m"echo $1
}function warn_text () {echo -e -n "\033[33m【WARN】\033[0m"echo $1
}function error_text () {echo -e -n "\033[31m【ERROR】\033[0m"echo $1
}function error_re_lang_exit () {echo -e -n "\033[31m【ERROR】\033[0m"echo $1re_lang_exit
}# 如果传入的目录不存在,进行目录的创建
function mkdir_404 () {if [ ! -d $1 ]; thenwarn_text "目录 $1 不存在,进行目录的创建..."mkdir -p $1 || error_re_lang_exit "目录 $1 创建失败"success_text "目录 $1 创建成功"elsesuccess_text "目录 $1 已存在,无需进行创建."fi
}# 检查是否安装了社区版 Docker
is_docker_ce_install=`rpm -q docker-ce | grep '未安装软件包.*'`
if [ ${#is_docker_ce_install} -gt 0 ]; thenerror_text '还未安装社区版 Docker,请先进行安装.'re_lang_exit
fi# 启动 Docker 并开启 Docker 开机自启,确保 Docker 处于运行状态
echo "Docker 启动中..."
systemctl start docker || re_lang_exit
echo "开启 Docker 开机自启中..."
systemctl enable docker || re_lang_exit# 要安装的软件
software=redis# 要进行安装的版本
version_default=latest
read -p "请输入要安装的 $software 版本(默认 $version_default):" version
if [ -z "$version" ]; thenversion=$version_default
fi# Docker 镜像名称及其版本
image_name=$software:$version# Docker 安装软件相关映射目录和文件的家目录
home_default=/home/docker/$software/$version
read -p "请输入 Docker 安装 $software 相关映射目录和文件的家目录(默认 $home_default):" home
if [ -z "$home" ]; thenhome=$home_default
fi# 需要进行映射的目录
map_dir=( /data /conf /log )# 目录如果不存在,进行目录的创建
mkdir_404 $home
read -p "是否删除原先存在的映射目录(y-确认删除):" -n 1 is_rm
echo
for (( i=0; i<${#map_dir[*]}; i++ )); doif [ "$is_rm" = "y" ]; then # 删除原先存在的映射目录rm -rf $home${map_dir[i]}warn_text "已删除 $home${map_dir[i]} 目录及其子目录和其中的文件"fimkdir_404 $home${map_dir[i]}
done# 访问密码
while true; doread -p "请输入 $software 服务的访问密码:" redis_pwdif [[ -n "${redis_pwd}" ]]; thenbreakfi
done# 编写配置文件
# 没有进行注释说明的配置项是我目前没有使用到的配置,从 Redis 默认配置文件中复制而来,
# 在 Redis 默认配置文件中有进行配置
echo "开始编写 $software 配置文件..."
tee $home/conf/$software.conf <<- EOF
################################## NETWORK #####################################
# 指定可以访问当前 Redis 服务的客户端 IP,为了使所有其它客户端都可访问,一般要将其注释掉
# bind 127.0.0.1 -::1
# 关闭保护模式,以确保其它客户端可以连接 Redis,否则只允许本机的客户端访问
protected-mode no
# Redis 服务监听端口号,默认 6379
port 6379
# TCP 连接的队列的长度,其主要用于解决高并发场景下客户端慢连接问题,生产环境下(特别是高并发场景下),backlog 的值最好要大一些
tcp-backlog 511
# 当客户端与 Redis 间的空闲时间超过该时长后,客户端和 Redis 服务器的连接会自动断开。单位秒。默认值为 0,表示永远不超时。
timeout 0
# 设置 Redis 检测与其连接的所有客户端的存活性时间间隔,单位秒,一般是在空闲超时 timeout 设置为 0 时进行配置。
tcp-keepalive 300
################################# GENERAL #####################################
# 配置 Redis 启动不采用守护进程方式,避免与 Docker 启动容器 -d(以守护进程执行) 选项发生冲突
daemonize no
# 指定 Redis 运行时 pid(Redis 进程 id)写入的文件
pidfile /var/run/redis_6379.pid
# 配置日志级别。notice:可以获取到在生产中想获取到的适当多的信息,默认级别。
loglevel notice
# 指定 Redis 运行日志记录的位置
logfile "/var/log/redis/redis-server.log"
# 设置数据库的数量
databases 16
# 只有在交互式会话中才会显示 Redis Logo,否则始终在启动日志中显示 Redis Logo。
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
################################ SNAPSHOTTING  ################################
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
################################# REPLICATION #################################
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
################################## SECURITY ###################################
acllog-max-len 128
# 设置客户端访问 Redis 服务时的密码
requirepass $redis_pwd
############################# LAZY FREEING ####################################
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
############################ KERNEL OOM CONTROL ##############################
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
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
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
########################### ACTIVE DEFRAGMENTATION #######################
jemalloc-bg-thread yes
EOF# 如果配置文件编写失败
if [ $? -ne 0 ]; thenerror_re_lang_exit "编写 $software 配置文件失败"
elsesuccess_text "编写 $software 配置文件成功"
fi# 创建日志文件
echo "创建 $software 日志文件..."
touch $home/log/redis-server.log || error_re_lang_exit "创建 $software 日志文件失败"
success_text "创建 $software 日志文件成功"
# 修改日志文件权限,防止容器无法访问和修改日志文件
echo "修改 $software 日志文件权限为 777..."
chmod 777 $home/log/redis-server.log || error_re_lang_exit "修改 $software 日志文件权限为 777 失败"
success_text "修改 $software 日志文件权限为 777 成功."# 查询 Docker 中是否存在指定镜像,如果不存在,则进行镜像的拉取
image=`docker images -a | grep "$software" | grep "$version"`
if [ -z "$image" ]; thenwarn_text "Docker 中不存在 $image_name 镜像"echo "开始拉取镜像 $image_name..."docker pull $image_name || re_lang_exitsuccess_text "拉取 $image_name 镜像成功"
elsesuccess_text "镜像 $image_name 已存在,无需进行拉取"
fi# 容器名称
container_name=$software$version# 判断容器是否存在,如果存在,手动输入指定容器名称
while true; doif [ ! -z "`docker ps -a | grep \"$container_name\"`" ]; thenerror_text "名称为 $container_name 的 Docker 容器已经存在"read -p "请输入新 Docker 容器名称:" container_nameelseif [ -z "$container_name" ]; thenerror_text "Docker 容器名称不能为空."read -p "请输入新 Docker 容器名称:" container_namecontinuefibreakfi
done# 容器运行时的端口,即容器的端口映射
port_default=6379
while true; doread -p "请输入容器运行映射的端口号(默认 $port_default):" portif [ -z "$port" ]; thenport=$port_defaultfi# 判断端口是否被占用if [ ! -z "`lsof -i:$port`" ]; thenerror_text "端口 $port 已经被占用,请选择未被占用的端口号."elsebreakfi
done# 运行容器
docker run \
--privileged=true \
--restart=always \
-p $port:6379 \
--name $container_name \
-v $home/conf/redis.conf:/etc/redis/redis.conf \
-v $home/data:/data \
-v $home/log:/var/log/redis \
-d $image_name \
redis-server /etc/redis/redis.conf \
|| error_re_lang_exit "$software 容器启动运行失败"success_text "$software 容器启动运行成功."
echo "$software 容器运行情况如下:"
docker ps -f name=$container_name# 还原语言环境
re_lang

这篇关于Docker 中安装单体架构 Redis 的 Shell 脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948110

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

UE3脚本UnrealScript UC语法点滴

持续更新 目录 类定义修饰符  1.dependson(CLASSNAME) 2.config(ININAME) 3.native 4.notplaceable 5.inherits(CLASSNAME1[,CLASSNAME2,...]) 类对象实例创建 类默认属性设置 变量 1.声明 var local 2.修饰符 config  3.array 类型变量 以及

VMware9.0详细安装

双击VMware-workstation-full-9.0.0-812388.exe文件: 直接点Next; 这里,我选择了Typical(标准安装)。 因为服务器上只要C盘,所以我选择安装在C盘下的vmware文件夹下面,然后点击Next; 这里我把√取消了,每次启动不检查更新。然后Next; 点击Next; 创建快捷方式等,点击Next; 继续Cont

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

【服务器运维】CentOS6 minimal 离线安装MySQL5.7

1.准备安装包(版本因人而异,所以下面的命令中版本省略,实际操作中用Tab自动补全就好了) cloog-ppl-0.15.7-1.2.el6.x86_64.rpmcpp-4.4.7-23.el6.x86_64.rpmgcc-4.4.7-23.el6.x86_64.rpmgcc-c++-4.4.7-23.el6.x86_64.rpmglibc-2.12-1.212.el6.x86_64.r

【服务器运维】CentOS7 minimal 离线安装 gcc perl vmware-tools

0. 本机在有网的情况下,下载CentOS镜像 https://www.centos.org/download/ 1. 取出rpm 有的情况可能不需要net-tools,但是如果出现跟ifconfig相关的错误,就把它安装上。另外如果不想升级内核版本的话,就找对应内核版本的rpm版本安装 perl-Time-Local-1.2300-2.el7.noarch.rpmperl-Tim

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents