我希望有以下配置:
主机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容器,它不会抛出任何错误,看起来很好。但当我尝试使用rediscli连接到容器时,我得到了下面的错误。
错误:无法在127.0.0.1:6379连接到redis:连接被拒绝
我不明白为什么它不能连接?另外,如果有人能告诉我,如果我创建dockerfile正确的方式?
注意:正在尝试使用下面的命令进行连接
docker exec -it rdbcontainer redis-cli
2条答案
按热度按时间eqzww0vc1#
您正在进入多进程容器的领域,对于这种特定的情况,推荐的方法是@gawain已经说明的方法,每个redis进程使用一个容器,并用docker compose Package 所有容器。
但是,在这种情况下,当您需要在同一个容器上启动多个进程时,本文是一个令人大开眼界的例子。这里的主要主题是init进程和信号转发,就像我在使用s6overlay方面有过最好经验的作者一样。
我喜欢这种方法的地方在于,您可以这样设置s6:如果任何被监视的进程崩溃,整个容器都会崩溃,从而触发kubernetes环境的重建。您不希望容器从外部看起来很健康,并且它的一个子进程失败(这是docker宣扬的每个容器一个进程的咒语的优点之一)。
这是同一个作者的一个例子,他用提到的安全机制启动了多个进程,以便在出现任何故障时将其关闭。
2j4z5cfb2#
dockerfile只能有一条cmd指令,如果指定了多条,将执行最后一条指令。所以这就是为什么你可以访问sentinel而不能访问redis服务器。
如果要执行多个命令,应该改用run,并对主进程使用cmd。
但我不建议使用runforsentinel或redis服务器,因为docker容器非常轻量级,每个容器都应该关注自己的进程(cmd)。对于sentinels和redis服务器,您可以在同一个主机上创建多个容器(docker compose应该是一个潜在的解决方案)。