准备
安装目标:
启动两个redis,并开启密码保护、rdb持久化,数据和配置文件存放在宿主机。
选择一个适合的版本:
# 此处选用6.2.1-alpine
docker pull redis:6.2.1-alpine
安装
准备存放持久化文件、配置文件的宿主机目录
mkdir -p /data/redis/{a,b}/conf
mkdir -p /data/redis/{a,b}/data
编写配置文件redis.conf,并放入对应的宿主机目录内
#bind 127.0.0.1
daemonize no
requirepass 123456
appendonly no
tcp-keepalive 300
# 说明
#bind 127.0.0.1 #注释掉这部分,使redis可以外部访问
daemonize no #不需要使用守护线程的方式启动,交给docker来负责即可
requirepass 123456 #给redis设置密码
appendonly no #aof持久化,按需修改即可
tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
注:
启动redis
docker run \
--name redis-a \
-d \
--restart=always \
-p 6379:6379 \
-v /data/redis/a/conf/redis.conf:/etc/redis/redis.conf \
-v /data/redis/a/data:/data \
--sysctl net.core.somaxconn=511 \
redis:6.2.1-alpine redis-server /etc/redis/redis.conf
查看是否启动成功
docker ps
docker logs redis-a
启动成功后,可以通过一些工具访问此redis,如果启动过程中有Warning和Error,则可根据提示解决。此处列出两个警告及其解决方法。
排错
- 启动日志有警告:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
解决:
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
- 启动日志有警告:
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
解决:
echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf
sysctl -p
并且在docker run命令启动时,添加
--sysctl net.core.somaxconn=511 \
即可
附
redis持久化
Redis提供了不同范围的持久性选项:
RDB(Redis数据库):RDB持久性按指定的时间间隔执行数据集的时间点快照。
AOF(仅附加文件):AOF持久性记录服务器接收的每个写入操作,这些操作将在服务器启动时再次播放,以重建原始数据集。使用与Redis协议本身相同的格式记录命令,并且采用仅追加方式。当日志太大时,Redis可以在后台重写日志。
无持久性:如果希望,只要服务器正在运行,数据就一直存在,则可以完全禁用持久性。
RDB + AOF:可以在同一实例中同时合并AOF和RDB。请注意,在这种情况下,当Redis重新启动时,AOF文件将用于重建原始数据集,因为它可以保证是最完整的。
要理解的最重要的事情是RDB与AOF持久性之间的不同权衡
详见:redis持久化文档
docker run
docker run 命令参数:
- -p 将容器端口映射到宿主机端口,格式为:宿主机端口:容器端口
- -v 将宿主机目录挂在到容器内,格式为:宿主机目录:容器目录