Что вы можете сделать, это запустить контейнер 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-адресу удаленного сервера, запрос будет обслуживаться контейнером, работающим в его среде разработки.
Что он сделал до сих пор
- Создать
development webserver
контейнер, который прослушивает порт 3000
. - Создать
nginx
контейнер на remote server
, который прослушивает порт 7890
, и отобразить этот порт из контейнера на хост-компьютер и, следовательно, хост-машина также привязывается к порту 7890
. - . Из этого контейнера создайте удаленную переадресацию порта s sh с
development webserver
на remote server
, которая перенаправляет весь трафик c из порта. 7890
в remote server
к порту 3000
, который development webserver
слушает.
Проблема, с которой он сталкивается
В step 3
, при выполнении удаленного порта переадресации, команда будет одновременно пытаться привязать порт 7890
в remote server
, который уже используется в step 2
Что он просит нас
Любое предложение поработать вокруг этого вопроса, поскольку он все еще хочет использовать Docker для решение.
Мои предлагаемые решения
Теперь есть два решения для этого, которые позволят ему продолжать использовать Docker в этом случае.
Первое решение, как описано в первые 2 абзаца
Это самый простой и требует наименьшего изменения.
- Поскольку идея использования nginx состоит в том, чтобы иметь обратный прокси-сервер, который перенаправляет трафик c из Интернета от 1 порта (например,
80
) до другого порта, например 7890
, в этом случае контейнеру nginx
просто нужно иметь возможность обнаружить порт 7890
на локальном хосте, который создается переадресацией удаленного порта команда. - Очевидно, что отображение порта
7890
с локального компьютера на контейнер не работает и никогда не будет решением. Здесь можно разрешить присоединению контейнера nginx
к сети host
. Таким образом, контейнер сможет видеть все порты, к которым привязан хост-компьютер, и наоборот. - Как это можно сделать, запустив
docker run ... --network host ...
вместо docker run ... -p 7890:7890 ...
при создании nginx
контейнер. - Если вы используете docker -compose, тогда network_mode: "host" - это путь к go.
Второе решение
Это немного более продвинутый вариант, но он делает свою работу.
- Установите
ssh server
внутри контейнера nginx
, как описано в официальном руководстве - Отображение порта
22
контейнера nginx
на доступный порт в remote server
скажем 30010
. Таким образом, из development webserver
вы сможете s sh напрямую в контейнер nginx
через порт 30010
remote server
. - Создать туннель S SH через новый порт
30010
, как обычно, например ssh -R 7890:localhost:3000 -N myexampledomain.com