问题 运行 Redis master 和 sentinel 使用 docker

Problem running Redis master and sentinel using docker

我想要以下配置:

所以对于 Master,我创建了如下 docker 文件:

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:连接被拒绝

我不明白为什么连接不上?另外,如果有人能告诉我我是否以正确的方式创建 docker 文件?

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

docker exec -it rdbcontainer redis-cli

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

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

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

你正在进入 multi-process 容器的领域,对于这种特定情况,推荐的方法是@Gawain 已经说过的,每个 Redis 进程使用一个容器并用 docker-compose 包装它.

但在极端情况下,当您需要在同一个容器上启动多个进程时 this article is an eye opener. The main topics here are the init process and signal forwarding, like the author I've had the best experience using s6-overlay

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

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