Не удалось создать прослушивающий сокет TCP сервера *:6383 привязка: Не удается назначить запрошенный адрес в кластере redis в docker (в Windows)

#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, я получаю эту ошибку, введите описание изображения здесь

Я попробовал следующее:

  1. откройте указанный выше порт в рулоне брандмауэра
  2. с помощью команды telnet кажется, что никто не слушает этот порт

telnet 192.168.3.205 6383 и 127.0.0.1 6383

  1. в 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 лучше всего использовать, когда вы задаете конкретный вопрос и получаете конкретный ответ, и вы, скорее всего, не получите много внимания, задавая дополнительные вопросы к существующему вопросу.