Docker 部署 redis,附带部分小建议,防止踩坑

一、拉取redis镜像(配图来自菜鸟,其实截图没多大意义,对比看下)

# 默认就拉取lastest版本,如有特殊需求请加版本号
docker pull redis
# docker pull redis:3.2

Docker 部署 redis教程,附带部分小建议,防止踩坑-LMLPHP

二、确认一下是否拉取成功

docker images

Docker 部署 redis教程,附带部分小建议,防止踩坑-LMLPHP

成功了就可以看到这一行,那一串长字符串就是imageId

三、运行redis之前,docker run配置解释

​好了,前两步都是基操,没什么可说的,到了运行redis这步,有很多人就开始犯迷糊,到底怎么样来运行一个可供使用的redis呢?如果只想快速开始一个:没有密码、默认端口6379,本地可连接的redis实例,你可以直接看第五步,但我强烈建议你不要这么干,除非你的redis就是在本地玩玩,不丢在线上服务器上。

​我们先看我自己使用的的完整版启动脚本,再来告诉你,配置里的启动项都是干嘛的

docker run  -d -p 6379:6379 -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf  redis  redis-server /etc/redis/redis.conf
  • docker run

    启动

  • -d

    将docker容器以后台启动的方式启动(除非你想看看容器启动起来马上看到里面的样子),启动后返回容器的ID

  • -p 6379:6379

    将容器内部的端口6379映射到宿主机的6379端口

  • -v /data/docker/redis/conf/redis.conf :/etc/redis/redis.conf

    -v 或者 --volume ,将宿主机卷绑定挂载到容器中,简单点说就是和端口一样,把宿主机的文件映射到容器中,前提是这个文件存在,否则只是一个空卷

  • redis

    启动的redis镜像名称,如果不加tag,就是默认的lastest,如果有多个版本,请指定,比如 redis:3.2

  • redis-server /etc/redis/redis.conf

    容器运行命令的最后,就是执行容器内部的命令了,启动过redis的同学都知道,这个命令的意思就是以 /etc/redis/redis.conf 为配置项启动redis了

四、运行redis

​ 经过上文的参数解释,你应该知道了,redis运行最主要的问题就是要把这个配置文件给挂载出来,那么我们在运行之前,就要提前 在 /data/redis/conf 目录下(这只是我的目录,你可以任意目录,记得替换掉启动参数里的路径)新建一个 redis.conf , 这里同样给出一份配置(配置可以去参考redis的详细配置)

# 这里要设置成no,因为我们容器本身就已经是-d启动了,如果设置成yes,会无法启动起redis
daemonize no
# 这样设置可以让外界连接到redis,如果不想对公网暴露,可以设置成bind 127.0.0.1 ,但也有坑,坑见下文
bind 0.0.0.0
# 写入文件,不开启,一重启数据就没了
appendonly yes
# 运行5个连接存活,防止出现长时间不连,需要重连的情况
tcp-keepalive 5
# 原则上必须填写,你要是对公网开放还没有密码,那就是裸奔
requirepass 你的密码

​运行后,此redis实例可以使用了,测试是否成功,执行以下命令,直接连接名称为redis-test的容器并执行 redis-cli命令

docker exec -it redis-test redis-cli

​成功,则看到连接到redis

127.0.0.1:6379>

​ 输入 auth 你的密码 获取权限, OK则没有问题

127.0.0.1:6379>auth 你的密码
OK

​同样的,可以测试从本地连接了。

五、启动一个最简单的redis实例,无密码

$ docker run -itd --name redis-test -p 6379:6379 redis

六、不踩坑姿势

  1. 如果要对外网关闭,只对内网开放,你以为的:bind 127.0.0.1 就可以?

    • 常见错误:容器内设置bind 127.0.0.1 仅仅是对容器绑定,那会造成宿主机无法访问

    容器是不识别宿主机的local IP的,所以你想绑定bind 192.X.X.X 也同样不可行

    • 解决思路:

      1. 打通宿主机和容器的网络,可在启动的时候使用--net=host,直接让容器使用宿主机的IP和host
      2. 在iptables层(或者阿里云的安全组类似的)进行端口的控制,决定暴露给谁使
      3. 密码强度增加,端口更换成其他的,也可以解决不少安全性,这样开放就开放减低了被扫描的可能性
  2. 数据没有保存出来,想直接抓aof数据

    1. 挂载出来即可,和conf同理
09-01 05:57