Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to connect django to docker redis container?

I am trying to connect django to docker redis container

Here is my docker file

FROM        ubuntu:14.04
RUN         apt-get update && apt-get install -y redis-server
EXPOSE      6379
ENTRYPOINT  ["/usr/bin/redis-server"]

Here is the result of docker ps -a

4f7eaeb2761b        /redis          "/usr/bin/redis-serve"   16 hours ago        Up 16 hours               6379/tcp            redis

Here is a quick sanity check that redis is working inside docker container

 docker exec -ti redis bash

 root@4f7eaeb2761b:/# redis-cli ping
 PONG
 root@4f7eaeb2761b:/# redis-cli
 127.0.0.1:6379> exit

Here is my Django settings.py

CACHES = {
    'default': {
        'BACKEND': 'redis_cache.RedisCache',
        'LOCATION': 'localhost:6379',
    },
}

Here is my view

from django.shortcuts import render
from django.template import loader
from django.http import HttpResponse
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def index(request):
    template = loader.get_template('./index.html')

    return HttpResponse(template.render())

Here is alternative redis access

import redis

def index(request):
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    print r # this line doesn't cause error
    r.set('foo', 'bar') # this line cause error

    template = loader.get_template('./index.html')

    return HttpResponse(template.render())

I verified that everything work without the @cache_page decorator

When I used decorator I am getting

Error 61 connecting to localhost:6379. Connection refused.

I am not sure how do I expose the docker container besides setting Expose port, any help would be appreciated

Thanks

like image 842
Kevin Avatar asked Mar 19 '16 22:03

Kevin


People also ask

How do I connect to a Docker container in Redis?

To connect to a Redis instance from another Docker container, add --link [Redis container name or ID]:redis to that container's docker run command. To connect to a Redis instance from another Docker container with a command-line interface, link the container and specify the host and port with -h redis -p 6379.


1 Answers

The thing to understand here is that the container exposed ports != system exposed ports.

The Docker container for redis is exposing the port 6379 from the container -- that is not the same port in the host system.

Assuming you're running docker with:

docker run -ti redis bash

By default, Docker will choose a random port in the host to bind to the port the container is exposing. You can check the host ports with the command (will show nothing if no port is exposed):

docker port CONTAINER_ID

Instead, you'll want to run it like this:

docker run -ti redis bash -p 6379:6379

This tells Docker to link the 6379 host port to the 6379 container port. Then docker port will show you something like this:

$ docker port CONTAINER_ID
6379/tcp -> 0.0.0.0:6379

You can also use a docker-compose.yml file to configure this.

Read more:

  • Brief Primer on Docker networking rules
  • Docker Compose documentation
like image 199
Elias Dorneles Avatar answered Oct 26 '22 11:10

Elias Dorneles