Redis-соединение отклонено между контейнерами

Я создаю небольшое приложение, разделенное на 3 службы, используя докер. У меня есть служба redisjson, сервер узлов и приложение Python.

Я всегда запускаю redis внутри контейнера для разработки, на первых этапах я запускаю скрипт python и приложение узла изначально, которое я просто использовал для подключения к redis с помощью localhost.

Чтобы стандартизировать и развернуть среду, я настроил контейнеры для каждой службы, но в тот момент, когда я попытался подключиться к redis из других контейнеров, соединение отклоняется. Ниже мой файл компоновки, отступы могли быть пугающими во время копирования макаронных изделий, надеюсь, нет. Мне пришлось переключить порты с 6379 на 7000 для Redis, потому что это тоже доставляло мне проблемы с подключением.

version: '3.7'
networks:
  app-tier:
    driver: bridge

services:
 redis:
  image: 'redislabs/rejson:latest'
  command: ["redis-server", "--bind", "redis", "--port", "6379", "--requirepass", "password"]
  environment:
    - appendonly
  ports:
    - '7000:6379'
  volumes:
    - redis:/data
  networks:
    - app-tier

 node:
  build: ./tickingServer
  environment:
    TZ: Europe/Rome
  depends_on:
    - redis
  # - mariadb 
  links:
    - "redis"
  # - "mariadb"

  ports:
    - 3000:3000
  restart: always
  networks:
    - app-tier

 wsdaemon:
  build: ./socketServer
  environment:
    TZ: Europe/Rome
  depends_on:
    - redis
  links:
    - "redis"
  volumes:
    - ./logs:/usr/src/websocketdaemon/logs
  ports:
    - 8000:8000
  restart: always
  networks:
    - app-tier
volumes:
  redis:

в моей системе как собственный порт, так и 7000 были бесплатными, и теперь они корректно используются докером-прокси. Согласно сети докеров, я использую в качестве имени хоста для соединения «redis», как я назвал службу так. Фрагмент тестирования соединения на Python выглядит следующим образом:

import log
import configuration
import redis

config = configuration.configuration()
logger = log.Log().get_logger(
     __name__, config['logFolder'], config['logFormat'])


redis_client = redis.Redis(host='redis', port=7000, db=0, password='password')

коннектор nodejs выглядит так:

var Redis = require('ioredis');
var logger = require('../helpers/logHelper');
var JSONCache = require('redis-json');


let modName = "RedisConnector";

var redis = new Redis({
  'host': 'redis',
  'family': 4,
  'db': 0,
  'port': 7000,
  'password': 'password'
});

person not.Rick.Sanchez    schedule 02.06.2020    source источник


Ответы (2)


В конечном итоге я решил рефакторинг файла конфигурации до следующих настроек:

loadmodule /usr/lib/redis/modules/rejson.so 

protected-mode no

port 6379

timeout 0

tcp-keepalive 300

loglevel notice

logfile ""

databases 4

always-show-logo yes

save 900 1

save 300 10

save 60 10000

dbfilename dump.rdb

appendonly yes

appendfilename "appendonly.aof"

что по-прежнему, вероятно, является всего лишь заглушкой и абсурдным объемом работы по настройке среды разработки.

Определение службы в файле docker-compose теперь выглядит следующим образом.

redis:
  image: 'redislabs/rejson:latest'
  command: ["redis-server",  "/usr/local/etc/redis/redis.conf", "--bind", "redis", "--port", "6379", "--requirepass", "password", "--appendonly", "yes"]


  ports:
    - '7000:6379'

  volumes:
    - redis:/data
    - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
  networks:
    - app-tier

volumes:
  redis:
person not.Rick.Sanchez    schedule 08.06.2020

Мне удалось подключиться к Redis из другого контейнера на порту 6379 вместо 7000, несмотря на то, что он сопоставил его как таковой в файле создания.

Мне пришлось загрузить файл redis.conf и закомментировать

bind 127.0.0.1 

Отключить защищенный режим

protected-mode no

Мне пришлось вручную удалить все ключи из конфигурации по умолчанию, которые были искажены один за другим.

Теперь я сталкиваюсь с той же проблемой, когда пытаюсь использовать pubsub для распространения изменений канала из реализации python websocket с использованием библиотеки rejson.

Естественно, фрагменты кода из официального канала документации на самом деле не работают. Я сожалел об использовании redis каждый день для сохранения и распространения данных подсчета, и я очень надеюсь, что мне больше никогда не придется его использовать

person not.Rick.Sanchez    schedule 04.06.2020