解决方案
执行docker run
命令时不要使用参数–requirepass
docker部署redis流程(问题复现)
1. 启动redis容器
在服务器docker运行时,执行下列命令。(会自动在远程仓库下载镜像)
redis:
docker run \
--restart=always \
--privileged=true \
--log-opt max-size=100m \
--log-opt max-file=3 \
-p 6379:6379 \
--name redis_1 \
-v redis_conf:/etc/redis \
-v redis_data:/data \
-v /etc/localtime:/etc/localtime:ro \
-d redis:7.0.5 \
redis-server /etc/redis/redis.conf \
--appendonly yes \
--requirepass 123456
–privileged=true 这个参数,容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
–restart=always 总是开机启动(可以改为其他形式或者直接取消 https://blog.csdn.net/chj_1224365967/article/details/109029856
–log是日志方面的(https://www.cnblogs.com/cxbhakim/p/8677928.html
-p 6379:6379 将6379端口挂载出去
–name 给这个容器取一个名字
-v 数据卷挂载
redis_conf:/etc/redis/redis.conf 这里是将 liunx 路径下的 redis_conf(docker会自动生成一个路径统一管理) 和redis下的redis.conf 挂载在一起。
redis_data:/data 这个同上
当宿主机为 Linux 系统时,我们可以直接将宿主机上的/etc/timezone和/etc/localtime挂载到容器中,这样可以保持容器和宿主机时区和时间一致。
-d 表示后台启动redis
redis 镜像名称
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的redis_conf
–appendonly yes 开启redis 持久化 (aof append only file)
注意这里的密码最好别设置,否则这里设置的密码的优先级会高于配置文件,以至于修改配置文件中的requirepass后,redis密码并没有被修改
–requirepass 123456 设置密码 (如果你是通过docker 容器内部连接的话,就随意,可设可不设。但是如果想向外开放的话,一定要设置)
再执行docker ps
,容器启动成功后如下图所示。
2. 找到挂载在服务器上的文件路径
执行docker volume ls
,找到刚配置的volume名称。
然后执行docker volume inspect redis_conf
,会找到该redis_conf
在服务器上的路径。
在该目录下,放入文件redis.conf
。
3. 修改配置文件
自己新建一个文件,将下面的配置复制粘贴进去即可。(当然个人推荐去下载官方配置,不清楚的配置可以自行百度)
然后修改一下requirepass
再重启容器即可成功修改密码(注意: 如果执行docker run
命令时使用了参数–requirepass
,则修改了配置之后无法修改redis密码)。
# 默认情况bind=127.0.0.1只能接受本机的访问请求
# 不写的情况下,无限制接受任何ip地址的访问
# 生产环境肯定要写你应用服务器的地址;服务器是需要远程访问的,所以需要将其注释掉
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
# bind 127.0.0.1
# 如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,
# Redis只允许接受本机的响应
# 将本机访问保护模式设置no,redis在服务器上的时候就需要设置为no
protected-mode no
# 端口号,默认 6379
port 6379
# 设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。
# 在高并发环境下需要一个高backlog值来避免慢客户端连接问题。
# 注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值(128),
# 所以需要确认增大/proc/sys/net/core/somaxconn和/proc/sys/net/ipv4/tcp_max_syn_backlog(128)两个值来达到想要的效果
tcp-backlog 511
# 设置客户端连接后进行任何其他指定前需要使用的密码。
# 警告:因为 redis 速度相当快,所以在一台比较好的服务器下,
# 一个外部的用户可以在一秒钟进行 150K 次的密码尝试,
# 这意味着你需要指定非常非常强大的密码来防止暴力破解。
requirepass 123456
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
timeout 0
# 指定 TCP 连接是否为长连接,"侦探"信号有 server 端维护。默认为 0.表示禁用。
tcp-keepalive 300
# 默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes。
daemonize no
supervised no
# 当 Redis 在后台运行的时候,Redis 默认会把 pid 文件放在/var/run/redis.pid,
# 你可以配置到其他地址。当运行多个 redis 服务时,需要指定不同的 pid 文件和端口。
pidfile /var/run/redis_6379.pid
# log 等级分为 4 级,debug,verbose, notice, 和 warning。生产环境下一般开启 notice。
loglevel notice
# 配置 log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上,修改为日志文件目录。
logfile ""
# 设置数据库的个数,可以使用 SELECT 命令来切换数据库。默认使用的数据库是 0 号库。默认 16 个库。
databases 16
always-show-logo yes
# 保存数据快照的频率,即将数据持久化到 dump.rdb 文件中的频度。
# 用来描述"在多少秒期间至少多少个变更操作"触发 snapshot 数据保存动作。
# 默认设置,意思是:
# if(在 60 秒之内有 10000 个 keys 发生变化时){
# 进行镜像备份
# }else if(在 300 秒之内有 10 个 keys 发生了变化){
# 进行镜像备份
# }else if(在 900 秒之内有 1 个 keys 发生了变化){
# 进行镜像备份
# }
save 900 1
save 300 10
save 60 10000
# 当持久化出现错误时,是否依然继续进行工作,是否终止所有的客户端 write 请求。
# 默认设置"yes"表示终止,一旦 snapshot 数据保存故障,那么此 server 为只读服务。
# 如果为"no",那么此次 snapshot 将失败,但下一次 snapshot 不会受到影响,
# 不过如果出现故障,数据只能恢复到"最近一个成功点"。
stop-writes-on-bgsave-error yes
# 在进行数据镜像备份时,是否启用 rdb 文件压缩手段,默认为 yes。
# 压缩可能需要额外的cpu 开支,不过这能够有效的减小 rdb 文件的大,有利于存储/备份/传输/数据恢复。
rdbcompression yes
# 读取和写入时候,会损失 10%性能是否进行校验和,是否对 rdb 文件使用 CRC64 校验和,默认为"yes",
# 那么每个 rdb 文件内容的末尾都会追加 CRC 校验和,利于第三方校验工具检测文件完整性。
rdbchecksum yes
# 镜像备份文件的文件名,默认为 dump.rdb。
dbfilename dump.rdb
# 数据库镜像备份的文件 rdb/AOF 文件放置的路径。
# 这里的路径跟文件名要分开配置是因为Redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,
# 等备份完成时,再把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
# slave 与 master 的连接,是否禁用 TCP nodelay 选项。
# "yes"表示禁用,那么 socket 通讯中数据将会以 packet 方式发送(packet 大小受到 socket buffer 限制)。
# 可以提高 socket通讯的效率(tcp交互次数),但是小数据将会被buffer,不会被立即发送,对于接受者可能存在延迟。
# "no"表示开启 tcp nodelay 选项,任何数据都会被立即发送,及时性较好,但是效率较低,建议设为 no。
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
# 默认情况下,redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁。
# 所以 redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。
# 开启 append only 模式之后,redis 会把所接收到的每一次写操作请求都追加appendonly.aof 文件中,
# 当 redis 重新启动时,会从该文件恢复出之前的状态。但是这样会造成 appendonly.aof 文件过大,
# 所以 redis 还支持了 BGREWRITEAOF 指令,对appendonly.aof 进行重新整理。
# 如果不经常进行数据迁移操作,推荐生产环境下的做法为关闭镜像,开启 appendonly.aof,
# 同时可以选择在访问较少的时间每天对 appendonly.aof进行重写一次。
# 另外,对 master 机器,主要负责写,建议使用 AOF,对于 slave,主要负责读,挑选出 1-2 台开启 AOF,其余的建议关闭。
appendonly yes
# aof 文件名字,默认为 appendonly.aof。
appendfilename "appendonly.aof"
# 在 AOF rewrite 期间,是否对 aof 新记录的 append 暂缓使用文件同步策略,主要考虑磁盘 IO开支和请求阻塞时间。
# 默认为 no,表示"不暂缓",新的 aof 记录仍然会被立即同步。
no-appendfsync-on-rewrite no
# 当 Aof log 增长超过指定比例时,重写 log file, 设置为 0 表示不自动重写 Aof 日志,
# 重写是为了使 aof 体积保持最小,而确保保存最完整的数据。
auto-aof-rewrite-percentage 100
# 触发 aof rewrite 的最小文件尺寸。
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
# lua 脚本运行的最大时间。
lua-time-limit 5000
# "慢操作日志"保留的最大条数,"记录"将会被队列化,如果超过了此长度,旧记录将会被移除。
# 可以通过"SLOWLOG args"查看慢记录的信息(SLOWLOG get10,SLOWLOG reset)。
slowlog-max-len 128
notify-keyspace-events ""
# -------------------------------------------这部分配置包含压缩列表、跳表等底层数据结构配置----------------
# hash 类型的数据结构在编码上可以使用 ziplist 和 hashtable。
# ziplist 的特点就是文件存储(以及内存存储)所需的空间较小,在内容较小时,
# 性能和 hashtable 几乎一样.因此 redis 对hash 类型默认采取 ziplist。
# 如果 hash 中条目的条目个数或者 value 长度达到阀值,将会被重构为 hashtable。
# 这个参数指的是 ziplist 中允许存储的最大条目个数,,默认为 512,建议为 128。
hash-max-ziplist-entries 512
# ziplist 中允许条目 value 值最大字节数,默认为 64,建议为 1024。
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
# intset 中允许保存的最大条目个数,如果达到阀值,intset 将会被重构为 hashtable。
set-max-intset-entries 512
# zset 为有序集合,有 2 中编码类型:ziplist,skiplist。因为"排序"将会消耗额外的性能,当 zset中数据较多时,将会被重构为 skiplist。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
# 是否开启顶层数据结构的 rehash 功能,如果内存允许,请开启。rehash 能够很大程度上提高K-V 存取的效率。
activerehashing yes
# Redis server 执行后台任务的频率,默认为 10,此值越大表示 redis 对"间歇性 task"的执行次数越频繁(次数/秒)。
# "间歇性 task"包括"过期集合"检测、关闭"空闲超时"的连接等,此值必须大于 0 且小于 500。
# 此值过小就意味着更多的 cpu 周期消耗,后台 task 被轮询的次数更频繁。此值过大意味着"内存敏感"性较差。
# 建议采用默认值。
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes