使用docker运行Redis master和哨兵的问题

时间:2020-08-09 07:59:17

标签: docker redis redis-sentinel

我希望具有以下配置:

  • 主机A上有1个主机和2个哨兵。
  • 主机B上有1个奴隶和1个哨兵。

所以对于Master,我创建了如下的dockerfile:

FROM redis
COPY redis.conf /etc/redis/redis.conf
COPY sentinel.conf /etc/redis/sentinel.conf
CMD [ "redis-server", "/etc/redis/redis.conf" ]
CMD [ "redis-sentinel", "/etc/redis/sentinel.conf" ]
CMD [ "redis-sentinel", "/etc/redis/sentinel.conf" ]

一切看起来都不错,当我尝试运行docker容器时,它不会引发任何错误并且看起来不错。 但是,当我尝试使用redis-cli连接到容器时,出现错误提示。

错误: 在127.0.0.1:6379无法连接到Redis:连接被拒绝

我不明白为什么它无法连接?另外,如果有人可以告诉我我是否以正确的方式创建了dockerfile?

注意:尝试使用以下命令进行连接

docker exec -it rdbcontainer redis-cli

2 个答案:

答案 0 :(得分:1)

Dockerfile只能有一个CMD指令,如果指定了多个,则将执行最后一个。因此,这就是您可以访问哨兵但不能访问Redis服务器的原因。

如果要执行多个命令,则应改用RUN并将CMD用于主进程。

但是我不建议对sentinel或redis服务器使用RUN,因为Docker容器非常轻便,每个容器都应专注于自己的进程(CMD)。对于哨兵和redis服务器,您可以在同一主机上创建多个容器(docker-compose应该是潜在的解决方案)。

答案 1 :(得分:0)

您正在进入多进程容器的领域,对于这种特定情况,推荐的方法是@Gawain已经说过的方法,每个Redis进程使用一个容器,并用docker-compose将其包装起来。

但是在极端情况下,当您需要在同一容器上启动多个进程时,this article令人大开眼界。这里的主要主题是初始化过程和信号转发,就像我使用s6-overlay拥有最佳经验的作者一样。

我喜欢这种方法的事实是,您可以通过以下方式设置s6:如果任何受监视的进程出现故障,则整个容器将崩溃,从而触发这种方式在Kubernetes环境中进行重建。您不希望容器从外部看起来很健康,并且其子进程之一发生故障(这是Docker倡导的“每容器1个进程”的口头禅的优点之一。)

这是同一作者的example repo,使用提到的安全机制启动了多个过程,以防万一发生任何故障。