Создание туннеля S SH для порта, уже связанного Docker - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу переслать трафик c из контейнера docker на удаленном сервере на мой локальный сервер разработки.

В основном у меня есть следующие настройки,

  1. У меня есть локальный сервер разработки на порту 3000.
  2. У меня есть удаленный сервер, который запускает контейнер Docker с nginx, который получает входящий веб-трафик c (входящий веб-трафик c не показывается). Эта часть уже работает.
  3. Входящий веб-трафик c в контейнере перенаправляется на порт 7890 в контейнере.
  4. Я опубликовал порт 7890 на контейнере для хоста на порту 7890 с -p 7890:7890.
  5. Затем я попытался настроить обратный туннель s sh от удаленного сервера к локальному веб-серверу, используя ssh -R 7890:localhost:3000 -N myexampledomain.com, но затем я получаю сообщение Warning: remote port forwarding failed for listen port 7890, вероятно, потому что Docker связал порт 7890 от имени контейнера.

Как переслать traffi c traffi c из контейнера Docker на мою локальную машину разработки?

Мне кажется, что я пропускаю некоторую часть загадка здесь. Есть ли у вас какие-либо предложения о том, как решить эту проблему? Я хочу продолжать использовать Docker по разным причинам (я понимаю, что этот конкретный пример c будет проще сделать, если выкинуть Docker из окна).

Изображение, детализирующее текущую ситуацию (за исключением входящий webtraffi c).

tu

1 Ответ

0 голосов
/ 12 февраля 2020

Что вы можете сделать, это запустить контейнер docker в remote server (тот, у которого nginx) в сетевом режиме host.

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

EDIT 1 Чтобы было понятно, вместо запуска контейнера на удаленном хосте с

docker run ... -p 7890:7890 ...

запустите его вместо

docker run ... --network host ...

РЕДАКТИРОВАТЬ 2 Для тех, кто все еще смущены вопросом. Я попытаюсь уточнить это здесь:

Чего он пытается достичь

Перенаправить все запросы с удаленного сервера (который предоставляется Inte rnet) на его веб-сервер разработки. Это так, что когда пользователи со всего Inte rnet получают доступ к IP-адресу удаленного сервера, запрос будет обслуживаться контейнером, работающим в его среде разработки.

Что он сделал до сих пор

  1. Создать development webserver контейнер, который прослушивает порт 3000.
  2. Создать nginx контейнер на remote server, который прослушивает порт 7890, и отобразить этот порт из контейнера на хост-компьютер и, следовательно, хост-машина также привязывается к порту 7890.
  3. . Из этого контейнера создайте удаленную переадресацию порта s sh с development webserver на remote server, которая перенаправляет весь трафик c из порта. 7890 в remote server к порту 3000, который development webserver слушает.

Проблема, с которой он сталкивается

В step 3, при выполнении удаленного порта переадресации, команда будет одновременно пытаться привязать порт 7890 в remote server, который уже используется в step 2

Что он просит нас

Любое предложение поработать вокруг этого вопроса, поскольку он все еще хочет использовать Docker для решение.

Мои предлагаемые решения

Теперь есть два решения для этого, которые позволят ему продолжать использовать Docker в этом случае.

Первое решение, как описано в первые 2 абзаца

Это самый простой и требует наименьшего изменения.

  1. Поскольку идея использования nginx состоит в том, чтобы иметь обратный прокси-сервер, который перенаправляет трафик c из Интернета от 1 порта (например, 80) до другого порта, например 7890, в этом случае контейнеру nginx просто нужно иметь возможность обнаружить порт 7890 на локальном хосте, который создается переадресацией удаленного порта команда.
  2. Очевидно, что отображение порта 7890 с локального компьютера на контейнер не работает и никогда не будет решением. Здесь можно разрешить присоединению контейнера nginx к сети host . Таким образом, контейнер сможет видеть все порты, к которым привязан хост-компьютер, и наоборот.
  3. Как это можно сделать, запустив docker run ... --network host ... вместо docker run ... -p 7890:7890 ... при создании nginx контейнер.
  4. Если вы используете docker -compose, тогда network_mode: "host" - это путь к go.

Второе решение

Это немного более продвинутый вариант, но он делает свою работу.

  1. Установите ssh server внутри контейнера nginx, как описано в официальном руководстве
  2. Отображение порта 22 контейнера nginx на доступный порт в remote server скажем 30010. Таким образом, из development webserver вы сможете s sh напрямую в контейнер nginx через порт 30010 remote server.
  3. Создать туннель S SH через новый порт 30010, как обычно, например ssh -R 7890:localhost:3000 -N myexampledomain.com
...