Search code examples
dockerredisconnection

Connection refused when using redis with docker-compose


So this is my current docker-compose.yml:

version: "2.0"
services:
    redis:
      image: redis
      container_name: framework-redis
      ports:
        - "127.0.0.1:6379:6379"
    web:
      image: myContainer:v1
      container_name: framework-web
      depends_on:
        - redis
      volumes:
        - /var/www/myApp:/app
      environment:
        LOG_STDOUT: /var/log/docker.access.log
        LOG_STDERR: /var/log/docker.error.log
      ports:
        - "8100:80"

I've tried different settings; for example: not using a port value for redis, using 0.0.0.0, switching to the expose option.

If I try to connect using 127.0.0.1 from the host machine it works, but it fails with a connection refused message for my app container.

Any thoughts?


Solution

  • If you're accessing framework-redis from framework-web, then you need to access it using ip (or container name, i.e., framework-redis) and port of framework-redis. Since, its going to be behind a docker bridge, an ip in the range of 172.17.0.0/16 will be allocated to framework-redis. You can use that IP or better just give the container name along with 6379 port.

     $ cat docker-compose.yml
    version: "2.0"
    services:
        redis:
          image: redis
          container_name: framework-redis
        web:
          image: redis
          container_name: framework-web
          depends_on:
            - redis
          command: [ "redis-cli", "-h", "framework-redis", "ping" ]
      $
      $ docker-compose up
    Recreating framework-redis ... done
    Recreating framework-web   ... done
    Attaching to framework-redis, framework-web
    framework-redis | 1:C 09 Dec 2019 19:25:52.798 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    framework-redis | 1:C 09 Dec 2019 19:25:52.798 # Redis version=5.0.6, bits=64, commit=00000000, modified=0, pid=1, just started
    framework-redis | 1:C 09 Dec 2019 19:25:52.798 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    framework-redis | 1:M 09 Dec 2019 19:25:52.799 * Running mode=standalone, port=6379.
    framework-redis | 1:M 09 Dec 2019 19:25:52.800 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    framework-redis | 1:M 09 Dec 2019 19:25:52.800 # Server initialized
    framework-redis | 1:M 09 Dec 2019 19:25:52.800 # 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.
    framework-redis | 1:M 09 Dec 2019 19:25:52.800 * DB loaded from disk: 0.000 seconds
    framework-redis | 1:M 09 Dec 2019 19:25:52.800 * Ready to accept connections
    framework-web | PONG
    framework-web exited with code 0
    

    As you can see above, I received a PONG for the PING command.

    Some additional points:

    • ports are written in the form HOST_PORT:CONTAINER_PORT. You don't need to give IP (as pointed out by @coulburton in the comments).

    • If you're only accessing framework-redis from framework-web, then you don't need to publish ports (i.e., 6379:6379 in the ports section). We only need to publish ports when we want to access an application running in the container network (which as far as I know by default is 172.17.0.0/16) from some other network (ex, the host machine or some other physical machine).