DEV Community

Serhat Teker
Serhat Teker

Posted on • Originally published at tech.serhatteker.com on

Connect Redis from Another Container

1. Issue

I started a redis container in my local environment and now I want to connect and/or send data to it from another container.

1.1. Reproduce

1.1.1. docker cli

Let's assume that I started a redis container from cli:

$ docker run \
    --name redislocal \
    -p "6379:6379" \
    redis:6.2.5
Enter fullscreen mode Exit fullscreen mode

Or in a more appropriate way:

$ docker run \
    --name redislocal \
    --hostname redislocal \
    -p "127.0.0.1:6379:6379" \
    -d \
    redis:6.2.5 \
    redis-server \
    --appendonly yes \
    --requirepass pa$$w0rD
Enter fullscreen mode Exit fullscreen mode

1.1.2. docker-compose

Maybe I started it via docker-compose:

$ docker-compose -f compose-redis-local.yml up -d --build
Enter fullscreen mode Exit fullscreen mode

And compose-redis-local.yml something like:

# compose-redis-local.yml
version: "3.5"

volumes:
  local_redis_data: {}

services:
  redis:
    container_name: redislocal
    hostname: redislocal
    image: redis:6.2.5
    command: redis-server --appendonly yes --requirepass pa$$w0rD
    ports:
      - "127.0.0.1:6379:6379"
    volumes:
        - local_redis_data:/data
    restart:
      unless-stopped
Enter fullscreen mode Exit fullscreen mode

2. Solution

Sorry: there is NO way you can connect to above redis containers from another container.

When you spawn containers from docker-composedocker-compose example, docker will:

  1. Create a network mayapp_default with bridge driver (myapp is the directory you're in)
  2. Create redislocal container and add it to mayapp_default network under the name redis

Similar applies to docker cli.

2.1. Custom Network

What you need is a user defined custom shared network: You should create a custom network than respawn your containers in this network.

Create a network called local-dev:

$ docker network create local-dev
Enter fullscreen mode Exit fullscreen mode

Ensure it was created:

$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
6d05d9ee7371   bridge            bridge    local
ac5000845253   host              host      local
d75701b57e1e   kind              bridge    local
5bde7f533689   local-dev         bridge    local
Enter fullscreen mode Exit fullscreen mode

2.1.1. docker cli

Start within this network:

$ docker run \
    --name redislocal \
    --network local-dev
    -p "127.0.0.1:6379:6379" \
    -d \
    redis:6.2.5 \
    redis-server \
    --appendonly yes \
    --requirepass pa$$w0rD
Enter fullscreen mode Exit fullscreen mode

2.1.2. docker-compose

Use this network as an external network in your compose file:

# compose-redis-local.yml
version: "3.5"

volumes:
  local_redis_data: {}

services:
  redis:
    container_name: redislocal
    hostname: redislocal
    image: redis:6.2.5
    command: redis-server --appendonly yes --requirepass 6te0valZ2L
    ports:
      - "127.0.0.1:6379:6379"
    volumes:
        - local_redis_data:/data
    networks:
      - local-dev

networks:
  local-dev:
    external: true
Enter fullscreen mode Exit fullscreen mode

In addition to those, instead of User-defined bridge networks you can use host networks however I don't like this approach since it breaks the isolation nature of docker.

For more info you can look at this official docker docs:

3. Connect

Now you can connect in the same network:

$ docker run \
    -it \
    --rm \
    --net local-dev \
    redis:6.2.5 \
    redis-cli -h redislocal -a pa$$w0rD ping
PONG
Enter fullscreen mode Exit fullscreen mode

All done!

Latest comments (0)