2017-02-07 6 views
11

Я установил Redis в Докер с помощью следующей командыExpose Docker контейнерного порта на другую машину

docker run -d -p 6379:6379 redis:3.0.1 
docker run -d -p 6380:6379 redis:2.8.20 

Теперь мне нужно открыть REDIS экземпляра от другой машины

public static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(IPOFDOCKERINSTALLEDMACHINE:6379); 

My App размещен в другом машина на другом сервере.

Wnen я бегу приложение, ниже является исключением

Не удалось подключиться к серверу (ов) Redis; для создания отключенного мультиплексора отключите AbortOnConnectFail. SocketFailure on PING

Есть ли что-то в докере или оракуле виртуальной машины?

+0

Докер должен открыть порты, как ожидалось, что произойдет, если вы попытаетесь подключиться через redis-cli с другой машины? –

+0

В дополнение к тестированию соединения с кли на локальном компьютере, существуют ли какие-либо межсетевые экраны или другие ограничения соединения между двумя узлами? – BMitch

+0

Я проверяю аппаратный ip, где установлен Docker, он работает, если я даю 127.0.0.1, но не с адресом Ip – Prithvi

ответ

1

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

docker run -d -p 0.0.0.0:6380:6379 redis:2.8.20 
docker run -d -p 0.0.0.0:6379:6379 redis:3.0.1 

Той часть, которая изменилась в том, что теперь вы определяете как хост и порт для локальной части (и оставив контейнерную часть, как это было, один порт).

Я надеюсь, что это поможет вам спать! И, пожалуйста, будьте осторожны с этим. Это не похоже на то, чего вы обычно хотели бы достичь. Убедитесь, что вы не оставите свой redis-сервис без проверки подлинности, если используете его для чего-то даже близкого к производству.

1

Учитывая вашу команду запуска без каких-либо ограничений внутрибрюшинно в:

$ docker run -d -p 6379:6379 redis:3.0.1 
$ docker run -d -p 6380:6379 redis:2.8.20 

И на NETSTAT вывод, который показывает, что неизбежно локальный в комментарии:

$ netstat -na | grep 6379 && netstat -na | grep 6380 
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING 

Существует несоответствие между портом вы опубликован на все интерфейсы и порт, который прослушивает localhost. Существует несколько возможностей:

  1. Что-то еще слушает 127.0.0.1:6379. Запустите sudo netstat -lntp | grep 6379, чтобы найти процесс, используя этот порт.

  2. Скорее всего, контейнеры не работают. Я говорю это, потому что на 6380 ничего не было. Проверьте, работают ли ваши контейнеры с docker ps -a. Выход ps будет содержать любые привязки портов, если контейнер запущен. Если контейнеры существуют, даже если они выходят, вы можете проверить их журналы с помощью docker logs container_id, чтобы узнать, есть ли какие-либо ошибки.

  3. Docker не работает на вашем локальном компьютере. Если echo $DOCKER_HOST указывает на ip или hostname, ваш клиент отправляет туда команды. Это также применимо, если вы выполняете свои команды внутри виртуальной машины и проверяете результаты на вашем физическом хосте.

  4. Вряд ли, но вы могли бы изменить ip по умолчанию на dockerd на 127.0.0.1 с флагом --ip.По умолчанию опубликованные порты прослушивают все интерфейсы (0.0.0.0).

  5. Возможно, что указанная выше команда выполнения может быть неточной. Если вы опубликовали порт с docker run -d -p 127.0.0.1:6379:6379 redis:3.0.1, который мог бы объяснить привязку к 127.0.0.1. Удаление команды 127.0.0.1: по умолчанию приведет к привязке ко всем интерфейсам.

+0

Я воссоздал машину по умолчанию docker run -d -p 0.0.0.0:6380:6379 redis: 2.8.20 docker run -d -p 0.0.0.0:6379:6379 redis: 3.0.1 Все еще я получаю netstat -na | grep 6379 && netstat -na | grep 6380 TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING Сообщите мне, если я делаю что-то неправильно – Prithvi

+0

netstat -a | grep 6379 TCP 127.0.0.1:6379 MY-SYS-460: 0 LISTENING – Prithvi

+1

В приведенном выше ответе приведено несколько шагов для решения вопроса. Вы проверили их все? Воспроизведение контейнера с помощью вашей команды не было указано, потому что оно не должно решить вашу проблему. – BMitch

1

Исходя из вашей ошибки;

Не удалось подключиться к серверам redis; для создания> отключенного мультиплексора отключите AbortOnConnectFail. SocketFailure on PING

Я думаю, что ваша другая машина не может получить доступ к машине с докерными контейнерами.

  1. Пробег: ping IPOFDOCKERMACHINE.
  2. Если шаг 1 не работает, значит, вы не можете получить доступ к машине с контейнерами докеров с другой машины. Сначала вам нужно исправить это.
  3. Если шаг 1 успешный, попробуйте команду telnet, чтобы убедиться, что вы можете получить доступ к портам. Пожалуйста, обратитесь к this article о команде telnet. This article показывает, как включить telnet в ОС Windows. telnet IPOFDOCKERMACHINE 6380 telnet IPOFDOCKERMACHINE 6379

  4. Если telnet терпит неудачу, это означает, что у вас нет доступа к необходимым портам. Вам нужно решить эту проблему, прежде чем двигаться вперед.

  5. Если шаг 3 прошел успешно, вам необходимо убедиться, что ваши контейнеры для докеров запущены как показано в ответе David Gonzalez.
3

Подключение нескольких контейнеров по сети на разных серверах является идеальным вариантом использования для docker swarm. Вы должны попытаться создать оверлейную сеть и подключить запущенные контейнеры к рою и этой сети, как описано here. В зависимости от ваших знаний о экосистеме рой вы можете попробовать различные решения.

Начиная с грузчиком 1.12, и если вы хотите вручную управлять контейнерами можно запустить

# retrieve the last swarm version 
$ docker pull swarm 
# running your swarm manager on your server 
$ docker swarm init --advertise-addr $(hostname -I | awk '{print $1}') 
# creating a cross server container network 
$ docker network create --driver overlay redisnet 

Эта команда будет выводить команду рабыня, чтобы использовать на вашем узле. Эта команда позволит вам присоединиться к рою в качестве «подчиненного» сервера. Если вы хотите запустить службы с этого сервера, вы должны вывести следующую команду, которая даст вам токен менеджера.

$ docker swarm join-token manager 

To add a manager to this swarm, run the following command: 
docker swarm join \ 
--token SWMTKN-1-1ewyz5urm5ofu78vddmrixfaye5mx0cnuj0hwxdt7baywmppav-0p5n6b7hz170gb79uuvd2ipoy \ 
<IP_ADDRESS>:2377 

Когда ваши узлы на роя можно запускать REDIS услуги с репликами

$ docker service create --network redisnet \ 
         --name redis --replicas 1 redis:3.0.1 
$ docker service create --network redisnet \ 
         --name old_redis --replicas 1 redis:2.8.20 
$ docker service create --network redisnet --name app <APP_IMAGE> 

Теперь все ваши контейнеры могут сделать HTTP вызовы, используя имя службы, как имя хоста для конкретной службы. В принципе, если вам нужно только получить доступ к вашим услугам redis из вашего приложения, это должно сделать это.

Вы также можете открыть порты, используя ту же опцию докера, с помощью -p, но вам нужно выяснить, какой сервер выполняет вашу службу. Тем не менее, это требует, чтобы вы следовали другим ответам, чтобы проверить, нет ли каких-либо блокировок портов на вашей виртуальной машине.

Кроме того, существуют другие решения, такие как Kubernetes или Mesos, но рой похож на официальный путь.

0

@Prithvi: Похоже, что вы не в состоянии Redis доступа из локальной машины .. вы попробуйте перенаправление портов в гадательных настройках виртуальной машины

enter image description here

enter image description here

Таким образом, вы можете получить доступ к приложение, запущенное в Oracle для VM, для доступа к вашему локальному компьютеру.

0

Экспозиция контейнера очень важна для хоста, чтобы определить, в каком контейнере порта работает. -p в команде запуска docker, используемой для раскрытия портов. Синтаксис: docker run -p host_ip: host_port: container_port image_name (добавить host_ip для запуска) docker run -d -p host_ip: 6379: 6379 redis: 3.0.1 Это связывает порт 6379 контейнера с портом 6379 на host_ip хост-машины. использовать iptables для освобождения: iptables -L -n -t nat принять контейнер ip be: 172.17.0.2 Теперь запрос на отправку на host_ip и порт (6379) перенаправляется в контейнер с ip (172.17.0.2) и портом (6379).