Как получить доступ к серверу на 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 Вам вообще не нужна часть приложения восходящего потока