Как получить доступ к серверу на localhost с контейнером dginx nginx?
Я пытаюсь использовать докционированную версию nginx в качестве прокси-сервера для моего приложения node (ExpressJS). Без какой-либо конфигурации для nginx и публикации порта 80 для контейнера я могу видеть целевую страницу nginx по умолчанию. Поэтому я знаю, что многое работает.
Теперь я могу подключить каталог с поддержкой сайтов, содержащий конфигурацию для proxy_pass localhost:3000
. У меня есть приложение node, работающее локально (не в любом контейнере Docker), и я могу получить к нему доступ через порт 3000 (т.е. localhost:3000
). Тем не менее, я бы предположил, что с запуском контейнера nginx, сопоставленным с портом 80, и проксированием моего localhost: 3000, я смог бы увидеть мое очень простое (привет мир) приложение. Вместо этого я получаю 502.
Нужно ли мне что-то передавать в докер? Возможно, это ошибка конфигурации nginx? Вот моя конфигурация nginx:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://localhost:3000;
}
}
Я попытался использовать этот вопрос, но, похоже, это не помогло. То есть, если я не делаю что-то совершенно неправильное.
Ответы
Ответ 1
Вы можете получить свой текущий IP-адрес, как показано здесь:
ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}'
Затем вы можете использовать флаг --add-host
с docker run
:
docker run --add-host localnode:$(ifconfig en0 | grep inet | grep -v inet6 | awk '{print \$2}') ...
В proxypass
используйте localnode
вместо localhost
.
Ответ 2
Если вы используете docker-for-mac 18.03 или новее, он автоматически создает специальную запись DNS host.docker.internal
которая динамически связывается с хостом inet ip. Затем вы можете использовать имя dns для прокси-служб, работающих на хост-машине изнутри контейнера, в качестве замены для localhost
.
т.е. файл конфигурации nginx:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://host.docker.internal:3000;
}
}
Ответ 3
Да. Докер должен знать о вашей машине. Вы можете установить псевдоним с помощью переключателя --add-host
. В поле * nix для создания псевдонима для имени "localbox" это будет:
docker run my_repo/my_image --add-host=localbox:<host_name>`
В boot2docker это будет:
docker run my_repo/my_image --add-host=localbox:192.168.59.3`
где вы должны заменить "192.168.59.3" тем, что возвращает boot2docker ip
.
Затем вы должны всегда обращаться к своей главной машине через локальный блок псевдонимов, поэтому просто измените конфигурацию nginx на:
location / {
proxy_pass http://localbox:3000;
}
Ответ 4
И, наконец, если вы используете Nginx в качестве обратного прокси-сервера для нескольких сервисов, вы можете подключить все это с помощью docker-compose. Убедитесь, что порты "80:80" открыты только в службе Nginx. Другие сервисы вы можете выставить только сервисный порт без привязки к базовой сети, например так:
web:
.....
expose:
- 8080
nginx:
.....
port:
- "80:80"
и затем использовать конфигурацию Nginx proxy_pass http://service-name: port Вам вообще не нужна часть приложения восходящего потока