У меня есть приложение Node, использующее эту клиентскую библиотеку javascript ioredis. Моя проблема в том, что я не могу подключить это приложение, которое также является докеризированным, к моему кластеру Redis (на портах с 7000 по 7005) и его контейнеру. Вот моя установка и результаты:
Я клонирую это репозиторий Docker-redis-cluster и следую инструкциям по созданию образа из Dockerfile
.
$ docker build -t gsccheng/redis-cluster .
Однако перед сборкой моим единственным изменением было установить свою собственную версию, которую я изменил на
ARG redis_version=3.2.1
Следуя инструкциям, я бегу
docker run -i -t -p 7000:7000 -p 7001:7001 -p 7002:7002 -p 7003:7003 -p 7004:7004 -p 7005:7005 -p 7006:7006 -p 7007:7007 gsccheng/redis-cluster
ОТЛИЧНО ...
За исключением нескольких предупреждений типа: WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
, пока все в порядке. Почему?:
- Вот снимок экрана с выходными данными.
- Я могу войти в интерфейс командной строки, используя
redis-cli -c -p 7000
С
docker inspect [container id]
я вижу, что у него есть NetworkSettings> IPAddress 172.17.0.2, а в NetworkSettings> Ports я вижу"Ports": { "6379/tcp": null, "7000/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "7000" } ], ... }
Далее останавливаю и удаляю все контейнеры. Я перехожу в корень своего веб-приложения, где у меня есть Dockerfile
и docker-compose.yml
, которые находятся здесь:
docker-compose.yml
version: '2.1'
services:
web:
build: .
ports:
- '8080:8080'
depends_on:
- redis
redis:
image: gsccheng/redis-cluster
ports:
- '7000:7000'
- '7001:7001'
- '7002:7002'
- '7003:7003'
- '7004:7004'
- '7005:7005'
Dockerfile
FROM node:4.4.7
# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
# Bundle app source
COPY . /usr/src/app
EXPOSE 8080
CMD [ "npm", "run", "prod" ]
connect.js
import Redis from 'ioredis';
console.log('I am totally in here');
// The commented out host options shows the many different configurations I tried too.
const node = [{
// Just need to connect to at least one of the startup nodes in the cluster. Redis will find the rest of the nodes in the cluster. All nodes only have a single db of 0 and SELECT is disabled.
port: 7000,
// host: '0.0.0.0'
// host: '127.0.0.1'
// host: '172.18.0.4'
host: 'redis'
// host: 'gsccheng/redis-cluster'
}, {
port: 7001,
// host: '0.0.0.0'
// host: '127.0.0.1'
// host: '172.18.0.4'
host: 'redis'
// host: 'gsccheng/redis-cluster'
}]
client = new Redis.Cluster(node, {});
...
Я тогда бегу
$ docker-compose build
а также
$ docker-compose up
Вывод находится в этой сути. Я удалил оттуда несколько нерелевантных строк (обозначенных "...") для этого примера.
Если это имеет значение, мое приложение было создано на основе этого шаблона React-redux, но он не включал Redis.
Проверка работоспособности
Когда
docker-compose up
запущен и ошибки постоянно регистрируются, как вы видите в сути, я все еще могу подключиться к кластеру извне контейнера, когда я выполняю:$ redis-cli -c -p 7000
$ docker ps
показывает этот снимок экрана.$ docker exec 4b3ec3e53e32 ps aux | grep redis
показывает этот снимок экрана.Вот полный вывод из
$ docker inspect 4b3ec3e53e32
снова контейнера redis. Обратите внимание на"IPAddress": ""
под _22 _...
Дополнительные вопросы
- ... Почему это пусто? Поэтому мой клиент Redis не может подключиться к кластеру?
- В чем разница между этим ip и
"HostIp": "0.0.0.0",
?0.0.0.0
был привязан кredis.conf
конфигурациям, и я думаю, это означает, что сервер будет слушать только запросы с этого адреса. Означает ли это, что указанный там IP-адрес должен совпадать с IP-адресом другого моегоctn_web_1
контейнера? - Мы также видели из вывода
docker-compose up
, что серверы Redis работают на172.18.0.2
. Я заметил, что это также сильно менялось от экземпляра к экземпляру (например,172.18.0.4
,172.18.0.3
) моего запускаdocker-compose
. Почему? Это потому, что я еще не полностью удалил контейнеры перед повторным запуском? Однако мне не следует использовать этот IP-адрес в моемconnect.js
коде правильно, потому что этот адрес является внутренним для контейнера redis (тогда как интерфейс, который будет интересовать мой веб-контейнер, является адресом контейнера redis)?
Обновление:
A. $ docker-compose ps
вывод находится здесь. Б. Также обратите внимание на эту проблему. В частности, что
кластер redis еще не поддерживает докеры (если вы не используете сеть хоста) -> объявленный IP-адрес будет отличаться от того, через который они могут разговаривать