У меня есть 2 отдельных контейнера Docker: приложение Node и Nginx, работающие локально на компьютере с Windows. Оба контейнера запущены и работают, но я не могу получить доступ к моему приложению Node через обратный прокси-сервер, который я настроил в Nginx:
Контейнер приложения Node запускается с помощью следующей команды:
docker run -p 2020:2020 --name nodeapp myimage:1.0
Приложение Node доступно по адресу localhost:2020
URL
Для контейнера Nginx я использую
docker run -p 7070:80 --name nginx mynginx:1.0
Nginx доступен по адресу localhost:7070
Ниже мой файл конфигурации nginx:
default.conf
upstream nodeserver {
server 127.0.0.1:2020;
}
server {
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded_Proto $scheme;
proxy_pass http://nodeserver;
}
}
Что я делаю неправильно?
127.0.0.1
изнутри докер будет разрешать свой собственный локальный хост, а не локальный хост Windows.
Обновите server 127.0.0.1:2020;
до server <Windows server IP>:2020;
. Он должен работать.
Отлично, что это сработало для вас. Чтобы исключить доступ NGINX с помощью localhost:7070
, сопоставьте его с портом 80, чтобы http://localhost
разрешил порт 80.
Что я сопоставляю вот так docker run -p 7070:80 --name nginx mynginx:1.0
во время запуска контейнера nginx.
docker run -p <hostport>:<containerport>
— это синтаксис. Значит, надо docker run -p 80:80
заставить его слушать http://localhost
Что, если я разверну эти два контейнера через AWS ECS, тогда для этого потребуется IP-адрес удаленного сервера вместо IP-адреса Windows, правильно ли это?
Если оба контейнера находятся в одной сети докеров, вы можете использовать имя контейнера. В данном случае это может быть nodeapp:2020
Одна и та же сеть докеров означает один и тот же кластер в ECS. Если оба находятся внутри одного и того же кластера, мы можем соединить их по именам.
Если это настройки по умолчанию, то должно работать. Также в кластере могут быть дополнительные сети. Вы можете проверить сети в своем кластере с помощью команды docker network ls
.
Согласно предыдущему ответу да, вы должны использовать Windows ip. Докер взаимодействует друг с другом со своими контейнерами, используя IP-адрес локального хоста, но вне контейнера вы должны использовать IP-адрес Windows, который должен быть:
192.168.99.100
Что, если я разверну эти два контейнера через AWS ECS, тогда потребуется IP-адрес удаленного сервера, как я понимаю.
Теперь все работает, спасибо, что указали на ошибку. Есть ли способ удалить порт, потому что в настоящее время я обращаюсь к
localhost:7070
, поэтому я могу удалить 7070 любым способом.