如何在Docker中运行Redis服务器和另一个应用程序?

时间:2015-07-27 18:35:31

标签: redis docker

我创建了一个在Docker容器中运行的Django应用程序。我需要在Django应用程序中创建一个线程,所以我使用Celery和Redis作为Celery数据库。 如果我在docker镜像(Ubuntu 14.04)中安装redis:

RUN apt-get update && apt-get -y install redis-server
RUN pip install redis

Redis服务器未启动:Django应用程序抛出异常,因为端口6379上的连接被拒绝。如果我手动启动Redis,它就可以工作。

如果我使用以下命令启动Redis服务器,它会挂起:

RUN redis-server

如果我尝试调整上一行,它也不起作用:

RUN nohup redis-server &

所以我的问题是:有没有办法在后台启动Redis并在重启Docker容器时重启?

Docker"最后一个命令"已经用于:

CMD uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi

3 个答案:

答案 0 :(得分:4)

use supervisord将控制这两个进程。 conf文件可能如下所示:

...
[program:redis]
command= /usr/bin/redis-server /srv/redis/redis.conf
stdout_logfile=/var/log/supervisor/redis-server.log
stderr_logfile=/var/log/supervisor/redis-server_err.log
autorestart=true

[program:nginx]
command=/usr/sbin/nginx
stdout_events_enabled=true
stderr_events_enabled=true

答案 1 :(得分:3)

Private Sub oLoadedDisplays_Changed() If RtDisplayLoaded(sBotNavButton_1_1_Display) Then Call ArrangeFooter(1, 1) ... End Sub 命令仅添加新图像图层。它们不会在运行时执行。仅在图像的构建时间内。

请改用RUN。您可以通过将多个命令外部化为由CMD调用的shell脚本来组合多个命令:

CMD

CMD start.sh 脚本中,您可以编写以下内容:

start.sh

答案 2 :(得分:3)

当您运行Docker容器时,总会有一个顶级进程。当您启动笔记本电脑时,该顶级流程是一个" init"脚本,systemd等。 docker镜像具有ENTRYPOINT指令。这是在您的docker容器中运行的顶级进程,您要运行的任何其他内容都是其中的子进程。为了在单个Docker容器中运行Django,Celery Worker和Redis,您必须运行一个进程,将所有这三个作为子进程启动。正如米兰所解释的那样,你可以设置一个Supervisor配置来执行它,并启动supervisor作为你的父进程。

另一种选择是实际启动init系统。这将使您非常接近您想要的东西,因为它基本上会运行,就像您拥有一个完整的虚拟机一样。但是,你通过这样做会失去许多集装箱化的好处:)

最简单的方法是使用Docker-compose运行多个容器。 Django的一个容器,一个用于Celery工作器的容器,另一个用于Redis的容器(以及一个用于数据存储的容器?)很容易设置。例如......

# docker-compose.yml
web:
    image: myapp
    command: uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
    links:
      - redis
      - mysql
celeryd:
    image: myapp
    command: celery worker -A myapp.celery
    links:
      - redis
      - mysql
redis:
    image: redis
mysql:
    image: mysql

这将为您的四个顶级流程提供四个容器。 redis和mysql将以dns名称" redis"和" mysql"在你的app容器中,所以不要指向" localhost"你指向" redis"。

Docker-compose docs上有很多好消息