Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

docker-compose + django + redis - Error 111 connecting to 127.0.0.1:6379. Connection refused

I've looked through this answer and can't figure out how to apply it to my problem, so if the answer is there, clarification would be appreciated.

I'm also a noob to docker and docker-compose.

I have a simple docker-compose.yml

version: '3'

services:
  redis:
    image: "redis:alpine"
  web:
    build: . # current directory
    command: bash -c "python /app/src/manage.py migrate && 
                      python /app/src/manage.py runserver 0.0.0.0:8000"
    volumes: 
      - .:/app
    ports:
      - "8000:8000"

When I run this with: docker-compose up everything seems ok:

$ docker-compose up
Starting hackerspace_redis_1 ... 
Starting hackerspace_redis_1 ... done
Starting hackerspace_web_1 ... 
Starting hackerspace_web_1 ... done
Attaching to hackerspace_redis_1, hackerspace_web_1
redis_1  | 1:C 19 Jul 2019 16:49:10.644 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 19 Jul 2019 16:49:10.644 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 19 Jul 2019 16:49:10.644 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1  | 1:M 19 Jul 2019 16:49:10.645 * Running mode=standalone, port=6379.
redis_1  | 1:M 19 Jul 2019 16:49:10.645 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1  | 1:M 19 Jul 2019 16:49:10.645 # Server initialized
redis_1  | 1:M 19 Jul 2019 16:49:10.645 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1  | 1:M 19 Jul 2019 16:49:10.645 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1  | 1:M 19 Jul 2019 16:49:10.645 * DB loaded from disk: 0.000 seconds
redis_1  | 1:M 19 Jul 2019 16:49:10.645 * Ready to accept connections
web_1    | Operations to perform:
web_1    |   Apply all migrations: account, admin, announcements, auth, badges, comments, contenttypes, courses, django_summernote, djconfig, djcytoscape, flatpages, notifications, portfolios, prerequisites, profile_manager, quest_manager, sessions, sites, socialaccount, suggestions, utilities
web_1    | Running migrations:
web_1    |   No migrations to apply.
web_1    | Performing system checks...
web_1    | 
web_1    | System check identified no issues (0 silenced).
web_1    | July 19, 2019 - 09:49:16
web_1    | Django version 2.0.13, using settings 'hackerspace_online.settings'
web_1    | Starting development server at http://0.0.0.0:8000/
web_1    | Quit the server with CONTROL-C.

And I can visit my django app through a browser at 127.0.0.0:8000. However, when I try to log in to the app, I get:

ConnectionError at /accounts/login/

Error 111 connecting to 127.0.0.1:6379. Connection refused.

Here's how I'm connecting to redis in my django settings:

REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1')
REDIS_PORT = os.environ.get('REDIS_PORT', '6379')

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://{}:{}/1".format(REDIS_HOST, REDIS_PORT),
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    #...
}

How do I get my django app to connect to the redis container?

Note that as far as I can tell, there is nothing else using port 6379 (via sudo lsof -i -P -n | grep LISTEN)

like image 615
43Tesseracts Avatar asked Jul 19 '19 16:07

43Tesseracts


2 Answers

127.0.0.1 in Docker almost always means "this container". If you're running your application under Docker Compose, it

... sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.

That is, within the context of this docker-compose.yml file, there are host names redis and web that point at the two containers.

You've already done one of the important configuration things. When your code says

REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1')

you can set an environment variable that overrides the built-in default value. So here you just need to add an environment variable setting to your docker-compose.yml file:

version: '3'
services:
  redis:
    image: "redis:alpine"
  web:
    build: . # current directory
    environment:
      - REDIS_HOST=redis
    ports:
      - "8000:8000"
    # application source code and default command are built into the image
like image 200
David Maze Avatar answered Nov 12 '22 05:11

David Maze


If you are using docker-compose you need to refer to the name of the container (i.e. redis) and not localhost. Localhost is per a container and docker-compose will connect each container on a implicit network for which they need to resolve the name. Think of them as separate machines. It helps to get perspective when configuring the networking. So a quick adjustment for which you are trying to connect to redis should fix the problem.

The documentation https://docs.docker.com/compose/networking/ describes how the default network is created when you don't create them yourself explicitly.

like image 2
user2065750 Avatar answered Nov 12 '22 05:11

user2065750