使用Docker运行Redis主节点和Sentinel时出现问题

3

我希望有以下配置:

  • 在主机A上有1个主节点和2个哨兵。
  • 在主机B上有1个从节点和1个哨兵。

因此,对于主节点,我创建了以下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

我刚刚尝试连接到指定端口的 Sentinel,它可以工作,但我不确定我是否无法看到其他 Sentinel。命令:docker exec -it rdbcontainer redis-cli -p 26379 - Rahul
2个回答

2

Dockerfile 只能有一个 CMD 指令,如果你指定了多个,只有最后一个会被执行。这就是为什么你可以访问 sentinel 但无法访问 redis 服务器的原因。

如果你想执行多个命令,应该使用 RUN,而将 CMD 用于主要进程。

但我不建议使用 RUN 来运行 sentinel 或 redis-server,因为 Docker 容器非常轻量级,每个容器应专注于其自身的进程(CMD)。对于 sentinels 和 redis-server,你可以在同一主机上创建多个容器(docker-compose 可能是一个潜在的解决方案)。


1

您正在进入多进程容器的领域,对于这种特定情况,建议的方式是@Gawain已经提到的,即为每个Redis进程使用一个容器,并用docker-compose包装。

但在极端情况下,当您需要在同一容器上启动多个进程时this article是一个很好的参考。主要讨论init进程和信号转发,就像作者一样,我使用s6-overlay获得了最佳体验。

我喜欢这种方法的原因是,您可以设置s6,使得如果任何受监视的进程崩溃,整个容器都会崩溃,从而在Kubernetes环境中触发重建。您不希望容器从外部看起来是健康的,而它的某个子进程却失败了(这是Docker所倡导的每个容器一个进程的口号的优势之一)。

以下是同一位作者的示例存储库,可以使用提到的安全机制启动多个进程,以防万一发生任何故障。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接