Я установил Redis в 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);
Мое приложение размещено на другой машине на другом сервере.
Wnen Я запускаю приложение, ниже - исключение
Не удалось подключиться к серверам redis; для создания отключен мультиплексор, отключите AbortOnConnectFail. SocketFailure on PING
Нужно ли что-то менять в виртуальной машине докера или оракула?
Ответ 1
Подключение нескольких контейнеров по сети на разных серверах - идеальный вариант для док-рой. Вы должны попытаться создать оверлейную сеть и подключить запущенные контейнеры к рою и этой сети, как описано здесь.
В зависимости от ваших знаний о роевой экосистеме вы можете попробовать разные решения.
Начиная с докера 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
Эта команда выведет подчиненную команду для использования на вашем node. Эта команда позволит вам присоединиться к рою в качестве "подчиненного" сервера. Если вы хотите запускать службы с этого сервера, вы должны вывести следующую команду, которая даст вам токен менеджера.
$ 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, но рой похож на официальный путь.
Ответ 2
Docker привязывает ваши открытые порты к localhost. Вот почему вы находите проблемы. Чтобы заставить 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-сервис без проверки подлинности, если используете его для чего-то даже близкого к производству.
Ответ 3
Учитывая вашу команду запуска без какого-либо ограничения ip в:
$ docker run -d -p 6379:6379 redis:3.0.1
$ docker run -d -p 6380:6379 redis:2.8.20
И вывод netstat, который показывает, что он связан с localhost в комментарии:
$ netstat -na | grep 6379 && netstat -na | grep 6380
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING
Существует несоответствие между портом, который вы опубликовали, для всех интерфейсов и порта, который прослушивает локальный хост. Есть несколько возможностей:
-
Что-то еще прослушивает 127.0.0.1:6379. Запустите sudo netstat -lntp | grep 6379
, чтобы найти процесс, используя этот порт.
-
Скорее всего, контейнеры не работают. Я говорю это, потому что на 6380 ничего не было. Проверьте, работают ли ваши контейнеры с docker ps -a
. Выход ps будет содержать любые привязки портов, если контейнер запущен. Если контейнеры существуют, даже если они выходят, вы можете проверить свои журналы с помощью docker logs container_id
, чтобы увидеть, есть ли какие-либо ошибки.
-
Docker не работает на вашем локальном хосте. Если echo $DOCKER_HOST
указывает на ip или имя хоста, ваш клиент отправляет туда команды. Это также применимо, если вы выполняете свои команды внутри виртуальной машины и проверяете результаты на вашем физическом хосте.
-
Вряд ли, но вы могли бы изменить ip по умолчанию на dockerd на 127.0.0.1 с флагом --ip
. По умолчанию опубликованные порты прослушивают все интерфейсы (0.0.0.0).
-
Выбранная выше команда выполнения может быть неточной. Если вы опубликовали порт с docker run -d -p 127.0.0.1:6379:6379 redis:3.0.1
, который мог бы объяснить привязку к 127.0.0.1. Удаление 127.0.0.1:
из команды по умолчанию будет привязываться ко всем интерфейсам.
Ответ 4
Исходя из вашей ошибки;
Не удалось подключиться к серверам redis; для создания > отключенного мультиплексора отключите AbortOnConnectFail. SocketFailure on PING
Я думаю, что ваша другая машина не может получить доступ к машине с контейнерами докеров.
- Попробуйте
ping IPOFDOCKERMACHINE
.
- Если шаг 1 не работает, значит, вы не можете получить доступ к машине с контейнерами докеров с другой машины. Сначала вам нужно исправить это.
-
Если шаг 1 успешный, попробуйте команду telnet, чтобы убедиться, что вы можете получить доступ к портам. Пожалуйста, обратитесь к этой статье о команде telnet. В этой статье показано, как включить telnet в ОС Windows.
telnet IPOFDOCKERMACHINE 6380
telnet IPOFDOCKERMACHINE 6379
-
Если telnet терпит неудачу, это означает, что у вас нет доступа к необходимым портам. Вам нужно решить эту проблему, прежде чем двигаться вперед.
- Если шаг 3 успешный, вам нужно убедиться, что ваши контейнеры для докеров запущены как Дэвид Гонсалес показал в своем ответе выше.
Ответ 5
@Prithvi: похоже, что вы не можете получить доступ к redis с локального компьютера. Пробовали ли вы переадресацию портов в oracle Настройки виртуальной машины
![введите описание изображения здесь]()
![введите описание изображения здесь]()
Таким образом, вы можете получить доступ к приложению, запущенному в Oracle, к виртуальной машине, доступ к которому будет осуществляться с вашего локального компьютера.
Ответ 6
Экспозиция контейнера очень важна для хоста, чтобы определить, в каком контейнере порта выполняется. -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).