使用docker运行Redis master和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容器时,它不会抛出任何错误,看起来也很好。但当我尝试使用reds-cli连接到容器时,我得到了以下错误。

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

    我不明白为什么它不能连接?如果有人能告诉我我是否以正确的方式创建dockerfile?

    注意:尝试以下命令连接

    docker exec -it rdbcontainer redis-cli
    

    Dockerfile只能有一条CMD指令,如果指定了多条,则执行最后一条。所以这就是您可以访问sentinel而不能访问redis服务器的原因。

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

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

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

    但在极端情况下,当您需要在同一个容器上启动多个进程时,本文让您大开眼界。这里的主要主题是初始化过程和信号转发,就像作者一样,我使用s6覆盖有着最好的经验。

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

    下面是一个来自同一作者的示例repo,它启动了具有上述安全机制的多个流程,以在出现任何故障时将其删除。

    最新更新