Невозможно подключиться к Redis из другого контейнера докера - PullRequest
0 голосов
/ 28 мая 2018

Я использую Redis-сервер внутри док-контейнера.Он работает на порту 127.0.0.1 6379.

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

С хоста: Когда я делаю redis-cli с хоста на контейнер с помощью монитора redis-cli, выдает ошибку: Сервер закрыл соединение.

Если я простоdo redis-cli, он выдает подсказку;

127.0.0.1:6379> 
127.0.0.1:6379> set www yee
Error: Server closed the connection

Кажется, что у докера выставлен правильный порт, и отображение порта док-станции работает.Ошибка не в установлении соединения, но соединение прерывается вскоре после этого.

Из другого контейнера в той же сети докера (моста):

redis.on('error', function(err) {    
        logger.error('Redis error: ' + err);
    } );

Redis error: Redis connection to 172.18.0.2:6379 failed - connect ECONNREFUSED 172.18.0.2:6379

Мой redis.conf файл имеет protected-mode no.

Запись в журнал настроена на отладку, но в журнале также нет информации, показывающей, что соединение было предпринято и отклонено.

Клиент Redisповторяет попытку по таймауту, но каждый раз, когда он получает соединение отказано.Я попытался использовать как имя контейнера (в качестве имени хоста), так и IP-адрес контейнера в сети Docker, и в обоих случаях результат был идентичным.

docker network create redisnet
docker run --name redis -p 6379:6379 -d --net "redisnet" redis-server
docker run --name apiserver -p 81:8080 --net "redisnet" -d api-server

If I try to ping it from another container on the same net:
docker run -it --rm --net redisnet redis redis-cli -h redis ping
Could not connect to redis at redis:6379: Connection refused

Если есть какие-либо советы по отладке, это было бы оченьполезно;

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Чтобы общаться с хоста на контейнер, вам нужно опубликовать порт на хосте.Например, docker run -p 6379:6379 redis.Не нужно выставлять порт.Это сделает сервис доступным для всего в сети.Вы можете ограничить это, указав интерфейс для прослушивания, например: docker run -p 127.0.0.1:6379:6379 -d redis

Для связи между контейнерами, они должны находиться в одной и той же сети, созданной пользователем.Например:

docker network create my_app
docker run --net my_app -d --name redis redis

После этого вы сможете подключить другие контейнеры к той же сети и связаться с "redis: 6379".например:

$ docker run -it --rm --net my_app redis redis-cli -h redis ping
PONG
0 голосов
/ 28 мая 2018

Я исправил это, закомментировав следующую строку в redis.conf.

# bind 127.0.0.1

Когда Redis запускается в контейнере и подключается к сети Docker, в этой сети создается новый интерфейс для Redisи этот интерфейс имеет свой собственный IP-адрес.Например, сеть докеров может назначать адреса в диапазоне 172.18.0.2/24, а контейнеру redis можно назначать 172.18.0.2.Не всегда возможно предсказать, какой IP-адрес будет назначен для redis, если только в явной форме не был назначен IP-адрес в команде docker run.Единственный вариант - комментировать привязку в redis.conf, что позволит redis теперь прослушивать запросы к 6379 на всех интерфейсах.

Это устранило проблему, и я могу подключиться к Redis из другого контейнера.

0 голосов
/ 28 мая 2018

Сопоставьте порт контейнера Redis с портом хоста, используя опцию -p при создании контейнера.Пример:

sudo docker run  -p 6379:6379 --name containername imageId

Затем вы можете получить доступ к redis, работающему внутри контейнера на хост-компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...