我希望具有以下配置:
所以对于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
答案 0 :(得分:1)
Dockerfile只能有一个CMD指令,如果指定了多个,则将执行最后一个。因此,这就是您可以访问哨兵但不能访问Redis服务器的原因。
如果要执行多个命令,则应改用RUN并将CMD用于主进程。
但是我不建议对sentinel或redis服务器使用RUN,因为Docker容器非常轻便,每个容器都应专注于自己的进程(CMD)。对于哨兵和redis服务器,您可以在同一主机上创建多个容器(docker-compose应该是潜在的解决方案)。
答案 1 :(得分:0)
您正在进入多进程容器的领域,对于这种特定情况,推荐的方法是@Gawain已经说过的方法,每个Redis进程使用一个容器,并用docker-compose将其包装起来。
但是在极端情况下,当您需要在同一容器上启动多个进程时,this article令人大开眼界。这里的主要主题是初始化过程和信号转发,就像我使用s6-overlay拥有最佳经验的作者一样。
我喜欢这种方法的事实是,您可以通过以下方式设置s6:如果任何受监视的进程出现故障,则整个容器将崩溃,从而触发这种方式在Kubernetes环境中进行重建。您不希望容器从外部看起来很健康,并且其子进程之一发生故障(这是Docker倡导的“每容器1个进程”的口头禅的优点之一。)
这是同一作者的example repo,使用提到的安全机制启动了多个过程,以防万一发生任何故障。