Search code examples
dockerredisvagrant

Redis connection refused between Vagrant and Docker


I have a docker like this:

version: '3.5'

services:

  RedisServerA:
    container_name: RedisServerA
    image: redis:3.2.11
    command: "redis-server --port 26379"
    volumes:
      - ../docker/redis/RedisServerA:/data
    ports:
      - 26379:26379
    expose:
      - 26379

  RedisServerB:
    container_name: RedisServerB
    image: redis:3.2.11
    command: "redis-server --port 6379"
    volumes:
      - ../docker/redis/RedisServerB:/data
    ports:
      - 6379:6379
    expose:
      - 6379

Now I do a vagrant ssh and do

ping RedisServerA
ping RedisServerB

They both work.

Now I try to connect to the redis server:

redis-cli -h RedisServerB

Works fine

Then I try to connect to the other

redis-cli -h RedisServerA -p 26739

It says:

Could not connect to Redis at RedisServerA:26739: Connection refused
Could not connect to Redis at RedisServerA:26739: Connection refused

Twice.

What am I missing here?


Solution

  • Typically in this setup you'd let each container run on its "natural" port. For connections from outside Docker you need the ports: mapping, and you'd access a container via its published port on the host's IP address. For connections between Docker containers (assuming they're on the same network, and if you used bare docker run, you manually created that network), you use the container name and the container's internal port number.

    We can clean up the docker-compose.yml file by removing some unnecessary lines (container_name: and expose: don't really have a practical effect) and letting the image run its default command: on the default port, and only remapping with ports:. We'd get:

    version: '3.5'
    services:
      RedisServerA:
        image: redis:3.2.11
        volumes:
          - ../docker/redis/RedisServerA:/data
        ports:
          - 26379:6379
      RedisServerB:
        image: redis:3.2.11
        volumes:
          - ../docker/redis/RedisServerB:/data
        ports:
          - 6379:6379
    

    Between containers, you'd use the default port

    redis-cli -h RedisServerA
    redis-cli -h RedisServerB
    

    From outside Docker you'd use the server's host name and the published ports

    redis-cli -h server.example.com -p 23679
    redis-cli -h server.example.com