Экспортировать порт контейнера докеров на другую машину

Я установил 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).