#docker #redis
Вопрос:
Я пытаюсь настроить кластеризацию redis в доке Windows. он отлично работает только в redis-cli-h 127.0.0.1-p 6383 внутри CLI-контейнера docker, все узлы в порядке, и у кластера нет проблем. это один из узлов файла redis.config
файл redis.config
port 6383
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
Проблема в том, что в приведенной выше конфигурации невозможно получить доступ к кластеризации с помощью приложения, потому что оно недоступно для приложения (это приложение отлично работает в одиночном режиме redis).
когда я изменяю «привязку» файла redis.conf к ip-адресу моего компьютера, который составляет 192.168.3.205, я получаю эту ошибку, введите описание изображения здесь
Я попробовал следующее:
- откройте указанный выше порт в рулоне брандмауэра
- с помощью команды telnet кажется, что никто не слушает этот порт
telnet 192.168.3.205 6383 и 127.0.0.1 6383
- в netstat прибыль 6383 никем не используется
а это мой файл .yml
version: "3.8"
networks:
default:
name: amin-cluster
services:
redis0:
container_name: node-0
image: mnadeem/redis
network_mode: "host"
volumes:
- C:WindowsSystem326379redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
build:
context: .
dockerfile: Dockerfile
hostname: node-0
restart: always
redis1:
container_name: node-1
image: mnadeem/redis
network_mode: "host"
volumes:
- C:WindowsSystem326380redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
build:
context: .
dockerfile: Dockerfile
hostname: node-1
restart: always
redis2:
container_name: node-2
image: mnadeem/redis
network_mode: "host"
volumes:
- C:WindowsSystem326381redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
build:
context: .
dockerfile: Dockerfile
hostname: node-2
restart: always
redis3:
container_name: node-3
image: mnadeem/redis
network_mode: "host"
volumes:
- C:WindowsSystem326382redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
build:
context: .
dockerfile: Dockerfile
hostname: node-3
restart: always
redis4:
container_name: node-4
image: mnadeem/redis
network_mode: "host"
volumes:
- C:WindowsSystem326383redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
build:
context: .
dockerfile: Dockerfile
hostname: node-4
restart: always
redis5:
container_name: node-5
image: mnadeem/redis
network_mode: "host"
volumes:
- C:WindowsSystem326384redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
build:
context: .
dockerfile: Dockerfile
hostname: node-5
restart: always
Комментарии:
1. Можете ли вы показать, как вы запускаете контейнер? Скорее всего, вы забыли опубликовать порт (который связывает порт хоста с портом контейнера).
2. @Matthew Я устанавливаю порт внутри файла redis.conf, а затем использую «>docker-compose up-d». нужно ли мне устанавливать порт где-то еще или как я предполагаю сообщить контейнеру, чтобы он начинался с определенного порта. в однорежимном режиме я выбираю изображение, называю контейнер и сообщаю порт, например, 6060:6379, но здесь я не знаю
3. Я добавил ответ, который должен помочь, также стандартные изображения redis, предоставленные самой командой redis, довольно надежны, есть ли какая-то особая причина использовать стороннее изображение? (mnadeem/redis), редактирование: nvm Я вижу, что эти изображения ориентированы на кластеризацию.
4. @Matthew извините, я не смог найти никакой конфигурации кластеризации для docker в его документе. Я все еще работаю над этим, я, кажется, застрял. У вас есть какие-либо рекомендации по реализации кластера Redis в докере с помощью этого стандартного образа Redis?
5. Не уверен, но если вам нужна дополнительная помощь в этом, вам следует задать второй вопрос. Что касается непосредственной проблемы, связанной с доступом к порту, решает ли предоставленный мной ответ проблему?
Ответ №1:
В вашем docker compose yml вам необходимо опубликовать порт и настроить его для каждой службы, доступ к которой вы хотите получить с хоста.
redis0:
ports:
- "6383:6383"
...
redis1:
ports:
- "12345:6383"
Синтаксис «hostport:контейнерный порт», так как у вас есть 6 экземпляров redis, предполагая, что вы хотите, чтобы каждый порт хоста был доступен, каждый порт хоста должен быть другим.
Очевидно, вы можете опустить порты, если вам не нужно, чтобы они были доступны с хоста.
Для получения более подробной информации о том, как публиковать порты, ознакомьтесь с документами docker compose yml https://docs.docker.com/compose/compose-file/compose-file-v3/#ports
Комментарии:
1. благодаря вам я решаю проблему, но не полностью. У меня есть еще одна проблема при попытке настроить узлы с помощью команды «redis-cli —cluster create <мой ip>: <мой ip><порт> … «автоматически назначьте IP-адрес типа 172.21.0.1 вместо IP-адреса, который я ему дал
2. @aminrahmati Я предлагаю вам решить этот вопрос и создать новый с вашей новой проблемой. StackOverflow лучше всего использовать, когда вы задаете конкретный вопрос и получаете конкретный ответ, и вы, скорее всего, не получите много внимания, задавая дополнительные вопросы к существующему вопросу.