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'
});
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:
Мне удалось подключиться к redis из другого контейнера на порту 6379 вместо 7000, несмотря на то, что он сопоставил его как таковой в файле создания.
Мне пришлось загрузить файл redis.conf и закомментировать
bind 127.0.0.1
Отключить защищенный режим
protected-mode no
Мне пришлось вручную удалить все ключи из конфигурации по умолчанию, которые были искажены один за другим.
Теперь я сталкиваюсь с той же проблемой, когда пытаюсь использовать pubsub для распространения изменений канала из реализации python websocket с использованием библиотеки rejson.
Естественно, фрагменты кода из официального канала документации на самом деле не работают. Я сожалел об использовании redis каждый день для сохранения и распространения данных подсчета, и я очень надеюсь, что мне больше никогда не придется его использовать