Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Docker中运行Redis服务器和其他应用程序?_Redis_Docker - Fatal编程技术网

如何在Docker中运行Redis服务器和其他应用程序?

如何在Docker中运行Redis服务器和其他应用程序?,redis,docker,Redis,Docker,我创建了一个Django应用程序,它在Docker容器中运行。我需要在Django应用程序中创建一个线程,所以我使用芹菜和Redis作为芹菜数据库。 如果我在docker映像(Ubuntu 14.04)中安装redis: Redis服务器未启动:Django应用程序引发异常,因为端口6379上的连接被拒绝。如果我手动启动Redis,它就会工作 如果使用以下命令启动Redis服务器,它将挂起: RUN redis-server 如果我尝试调整前一行,它也不起作用: RUN nohup redis

我创建了一个Django应用程序,它在Docker容器中运行。我需要在Django应用程序中创建一个线程,所以我使用芹菜和Redis作为芹菜数据库。 如果我在docker映像(Ubuntu 14.04)中安装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

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

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

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

#!/bin/bash
nohup redis-server &
uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
这将控制这两个过程。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

运行Docker容器时,始终存在一个顶级进程。当您启动笔记本电脑时,顶层进程是一个“init”脚本、systemd或类似的东西。docker映像具有入口点指令。这是在docker容器中运行的顶级进程,您希望运行的任何其他进程都是该进程的子进程。为了在一个Docker容器中运行Django、芹菜工人和Redis,您必须运行一个进程,将它们作为子进程启动。正如Milan所解释的,您可以设置一个主管配置来执行此操作,并启动主管作为您的父进程

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

最简单的方法是使用Docker compose运行多个容器。一个用于Django的容器、一个用于芹菜工人的容器和另一个用于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”公开,因此您不必指向“localhost”,而是指向“redis”


Docker compose docs上有很多很好的信息

这会起作用,但信号不会被代理到redis实例,这有点烦人,因为它不会完全关闭。一般来说,最好为redis使用一个单独的容器,这在我看来也会更简单。谢谢,如果我添加脚本
芹菜--app=myapp.芹菜:app-worker--loglevel=INFO&
,它就会工作。我接受这个答案,因为这是我为了快速解决问题而测试的答案。然而,其他答案似乎更干净,人们应该考虑它们。
# 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