【问题标题】:Problem running Redis master and sentinel using docker使用 docker 运行 Redis 主服务器和哨兵时出现问题
【发布时间】:2020-11-29 02:18:33
【问题描述】:

我想要以下配置:

  • 主机 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

【问题讨论】:

  • 我刚刚尝试连接到指定端口的哨兵并且它工作但我不确定我看不到其他哨兵。命令:docker exec -it rdbcontainer redis-cli -p 26379

标签: docker redis redis-sentinel


【解决方案1】:

Dockerfile 只能有一条 CMD 指令,如果指定多条,会执行最后一条。所以这就是你可以访问哨兵但不能访问redis服务器的原因。

如果你想执行多个命令,你应该使用 RUN 来代替主进程使用 CMD。

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

【讨论】:

    【解决方案2】:

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

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

    我喜欢这种方法的地方在于,您可以设置 s6,如果任何受监控的进程发生故障,整个容器都会发生故障,从而触发 Kubernetes 环境的重建。您不希望容器从外部看起来很健康,并且其中一个子进程出现故障(这是 Docker 所宣扬的 1-process-per-container 口头禅的优点之一)。

    这是来自同一作者的example repo,使用提到的安全机制启动多个进程,以在出现任何故障时将其关闭。

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多