How to run a Redis server AND another application inside Docker?

后端 未结 3 1249
执念已碎
执念已碎 2021-02-14 11:42

I created a Django application which runs inside a Docker container. I needed to create a thread inside the Django application so I used Celery and Redis as the Celery Database.

相关标签:
3条回答
  • 2021-02-14 12:15

    When you run a Docker container, there is always a single top level process. When you fire up your laptop, that top level process is an "init" script, systemd or the like. A docker image has an ENTRYPOINT directive. This is the top level process that runs in your docker container, with anything else you want to run being a child of that. In order to run Django, a Celery Worker, and Redis all inside a single Docker container, you would have to run a process that starts all three of them as child processes. As explained by Milan, you could set up a Supervisor configuration to do it, and launch supervisor as your parent process.

    Another option is to actually boot the init system. This will get you very close to what you want since it will basically run things as though you had a full scale virtual machine. However, you lose many of the benefits of containerization by doing that :)

    The simplest way altogether is to run several containers using Docker-compose. A container for Django, one for your Celery worker, and another for Redis (and one for your data store as well?) is pretty easy to set up that way. For example...

    # 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
    

    This would give you four containers for your four top level processes. redis and mysql would be exposed with the dns name "redis" and "mysql" inside your app containers, so instead of pointing at "localhost" you'd point at "redis".

    There is a lot of good info on the Docker-compose docs

    0 讨论(0)
  • 2021-02-14 12:16

    RUN commands are adding new image layers only. They are not executed during runtime. Only during build time of the image.

    Use CMD instead. You can combine multiple commands by externalizing them into a shell script which is invoked by CMD:

    CMD start.sh
    

    In the start.sh script you write the following:

    #!/bin/bash
    nohup redis-server &
    uwsgi --http 0.0.0.0:8000 --module mymodule.wsgi
    
    0 讨论(0)
  • 2021-02-14 12:17

    use supervisord which would control both processes. The conf file might look like this:

    ...
    [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
    
    0 讨论(0)
提交回复
热议问题