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

Mic*_*130 9 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
Run Code Online (Sandbox Code Playgroud)

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

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

RUN redis-server
Run Code Online (Sandbox Code Playgroud)

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

RUN nohup redis-server &
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:有没有一种方法可以在后台启动Redis并在重新启动Docker容器时使其重新启动?

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

CMD uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
Run Code Online (Sandbox Code Playgroud)

h3n*_*rik 5

RUN命令仅添加新的图像层。它们不会在运行时执行。仅在映像构建期间。

使用CMD代替。您可以通过将多个命令外部化为shell脚本来组合多个命令,这些脚本由调用CMD

CMD start.sh
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash
nohup redis-server &
uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
Run Code Online (Sandbox Code Playgroud)

  • 这会起作用,但是信号不会被代理到redis实例,这有点烦人,因为它不会干净地关闭。通常,最好使用单独的容器来存储Redis,这也将简化IMO。 (2认同)

mil*_*lan 5

使用可以控制两个进程的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
Run Code Online (Sandbox Code Playgroud)


Pau*_*tte 5

当您运行 Docker 容器时,始终只有一个顶级进程。当您启动您的笔记本电脑时,该顶级进程是一个“init”脚本、systemd 等。docker 镜像有一个 ENTRYPOINT 指令。这是在您的 docker 容器中运行的顶级进程,您想要运行的任何其他进程都是它的子进程。为了在单个 Docker 容器中运行 Django、Celery Worker 和 Redis,您必须运行一个进程,将这三个进程作为子进程启动。正如 Milan 所解释的,您可以设置一个主管配置来执行此操作,并将主管作为您的父进程启动。

另一种选择是实际启动 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
Run Code Online (Sandbox Code Playgroud)

这将为您的四个顶级流程提供四个容器。redis 和 mysql 将在您的应用程序容器内以 dns 名称“redis”和“mysql”公开,因此您不必指向“localhost”,而是指向“redis”。

Docker-compose 文档上有很多很好的信息