Docker не может подключиться к Redis из другого сервиса - PullRequest
0 голосов
/ 12 июня 2018

Я не могу понять, как подключиться к моей службе redis из моей службы app.Используя DDocker версии 18.03.1-ce, соберите 9ee9f40ocker для Mac.

Я попытался соединить различные способы, которые я нашел, на похожие вопросы:

const client = redis.createClient({ host: 'localhost', port: 6379});

const client = redis.createClient({ host: 'redis', port: 6379});

const client = redis.createClient('redis://redis:6379');

const client = redis.createClient('redis', 6379); // and reversed args

Я всегда получаю некоторую формуиз:

Ошибка: подключение Redis к локальному узлу: 6379 не удалось - подключение ECONNREFUSED 127.0.0.1:6379

Ошибка: подключение Redis к Redis: 6379 ошибка - подключение ECONNREFUSED 172.20.0.2:6379

Контейнеры Docker

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                    NAMES
0fd798d58561        app_app         "pm2-runtime start e…"   2 seconds ago        Up 7 seconds                                 app
65d148e498f7        app_redis       "docker-entrypoint.s…"   About a minute ago   Up 8 seconds        0.0.0.0:6379->6379/tcp   redis

Redis работает:

$ docker exec -it redis /bin/bash
root@65d148e498f7:/data# redis-cli ping
PONG

Redis Dockerfile (довольно просто)

FROM redis:4.0.9
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

приложение Dockerfile

FROM node:10.3.0-slim
RUN mkdir -p /app
COPY src/* /app/
CMD ["pm2-runtime", "start", "/app/ecosystem.config.js"]

docker-compose.yml

version: "3"
services:
  redis:
    build: ./redis/
    container_name: redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    expose:
      - "6379"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - 'API_PORT=6379'
      - 'NODE_ENV=production'
  app:
    depends_on:
      - redis
    build: ./app/
    container_name: app
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /app/node_modules
    environment:
      - 'NODE_ENV=production'

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Похоже, что ваш образ redis настроен на прослушивание 127.0.0.1, а не на все интерфейсы.Это не проблема с изображениями Redis по умолчанию, поэтому либо используйте официальный образ из докера-концентратора, либо исправьте свою конфигурацию для прослушивания 0.0.0.0.

Вы сможете проверить это с помощью netshoot:

docker run --rm --net container:app_redis nicolaka/netshoot netstat -ltn

В Redis Conf прослушивание всех интерфейсов осуществляется путем закомментирования строки «bind» в redis.conf.

0 голосов
/ 12 июня 2018

localhost с точки зрения контейнера app не сможет покинуть контейнер app.Поэтому лучше всего использовать redis или IP-адрес хоста.

Если вы хотите достичь redis из контейнера app, вам нужно связать их или поместить в один и тот жесеть.Пожалуйста, добавьте свойство network к обеим службам, используя одно и то же имя сети.Затем Docker предоставит вам действительные DNS-запросы для имен сервисов.

См. Официальные документы по https://docs.docker.com/compose/compose-file/#networks (для свойства service:) и https://docs.docker.com/compose/compose-file/#network-configuration-reference (длясвойство верхнего уровня networks).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...