PWAVEL Ответов: 3

Невозможно открыть какой-либо другой порт, кроме порта 80 для размещенного приложения docker


Здравствуйте Эксперты,

У меня есть демо-приложение, которое размещено на docker.Открытый порт для контейнера docker-это "80", и приложение отлично работает на локальной машине.

Файл Docker выглядит следующим образом

FROM microsoft/aspnetcore:2.0
COPY dist /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "demoapp.dll"]


Я использую нижеприведенную команду для запуска контейнера
docker run -d -p 8888:80 myapp

Я могу видеть целевую страницу для моего приложения на localhost:8888, используя приведенную выше конфигурацию файла docker.
Всякий раз, когда я использую линию "EXPOSE (любой другой порт)/tcp" для экс- "разоблачения 8080/8081/5000----so on/tcp" , чтобы выставить любой другой порт, кроме 80 контейнера docker , Я не могу запустить свое приложение в браузере. Любой порт, кроме 80, не работает.

Я также могу создавать изображение и создавать контейнер для приложения. Все идет хорошо, но когда я пытаюсь запустить приложение в браузере (localhost:8080/8081/5000 и т. д.) Целевая страница приложения не загружается.

Есть Идеи? Есть предложения? Почему это должно происходить. Нужно ли мне выполнить некоторую конфигурацию, связанную с портом, или связаться с моей сетевой командой ? или какой-то код, который мне здесь не хватает?

Заранее спасибо

Что я уже пробовал:

FROM microsoft/aspnetcore:2.0
COPY dist /app
WORKDIR /app
EXPOSE 8088/tcp / EXPOSE 5000/tcp / EXPOSE 9000/tcp etc..
ENTRYPOINT ["dotnet", "demoapp.dll"]

docker run -d -p 8088:8088 myapp 
docker run -d -p 5000:5000 myapp 
docker run -d -p 9000:9000 myapp 

F-ES Sitecore

Возможно, что-то вроде брандмауэра, антивируса или групповой политики блокирует эти порты.

PWAVEL

Ну, это тоже выглядит странно для меня, потому что я думаю, что не упускаю ни одного шага при создании, публикации или размещении приложения на docker, поскольку я прошел через многие начинающие статьи, связанные с хостингом docker. Я просто хочу быть уверен, прежде чем связаться с моей аппаратной/сетевой командой, что с моей стороны нет никаких проблем.Как мы можем узнать, что эта проблема связана с настройками брандмауэра или антивируса? Есть ли какой-нибудь способ?

3 Ответов

Рейтинг:
27

RickZeeland

Смотрите ответы здесь: Разоблачение ASP.NET основной порт через Docker : dotnet[^]

Цитата:
После нахождения "невозможно привязать к http://localhost:5000 на интерфейсе обратной связи IPv6". Я посмотрел, почему это может быть, и нашел вот это: https://stackoverflow.com/questions/43948847/net-core-web-api-error-4090-eaddrnotavail-address-not-available-on-azure?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

Они предложили добавить .UseUrls("http://+:5000") в Program.cs и это сработало!

И:
Цитата:
Вы можете использовать переменную окружения, просто добавьте, например
ENV ASPNETCORE_URLS http://*:5000


PWAVEL

ENV ASPNETCORE_URLS http://*:5000. Это сработало.Большое спасибо.

Рейтинг:
1

Afzaal Ahmad Zeeshan

Может быть, вы не понимаете цели EXPOSE в файла Docker. Прочтите второе решение и ссылку о предоставлении портов для ASP.NET ядро, а затем продолжайте читать остальную часть ответа здесь.

Посмотрите это мое хранилище и проверьте, как это работает. GitHub - afzaal-ahmad-zeeshan/nodejs-dockerized: Dockerized Node.js применение.[^], Я не выставлял ни одного порта и если вы запустите приложение с помощью,

$ docker run -d --name test afzaalahmadzeeshan/express-nodejs:latest
$ docker inspect test
Если вы отправите запрос на IP-адрес для этого контейнера на порту 5000 (потому что это то, что я установил для этого веб-приложения в app.js файл; проверьте его!), вы увидите, что он работает просто отлично, хотя я никогда не выставлял порт, любой порт.

Причина, по которой это требует от вас выставить 80, а затем ожидать отправки трафика только на порт 80, заключается в том, что приложение внутри вашего контейнера прослушивает порт 80. Для того чтобы изменить порт с 80 на, скажем, 5000, вам также необходимо изменить внутренние устройства компьютера. ASP.NET основное веб-приложение и заставить его слушать на порту 5000.

Еще одна вещь, привязка порта в Docker помогает в том случае, когда вы пытаетесь сбалансировать нагрузку служб или запускаете службу и настраиваете внешние службы для пересылки трафика на определенный порт (25 для электронной почты, 80 для HTTP и т. д.). В любом другом случае это не обязательно. Порт, который ваше приложение (приложение, которое вы контейнеризировали) решает, где оно должно слушать. -p 5000:80 просто позволяет вам отправить запрос на 5000 и пусть Docker переадресует его на 80 на контейнере—здесь начинается самое интересное, если ничего не прослушивает порт 80 в контейнере- ничего не случится..

Я также приглашаю вас прочитать мою статью на эту вводную тему о Докере, DockerOps: начало работы с Docker[^].


Рейтинг:
0

Maciej Los

Начальное примечание: Я не являюсь экспертом Docker, но имею опыт работы с ним samll.

Во-первых: по умолчанию настройки не выставить любой порт мира. Видеть:
Контейнер сеть | Докер документации[^]
Привязка контейнерных портов к документации хоста | Докера[^]
Таким образом, вы должны настроить docker, чтобы иметь возможность подключаться к нему из-за пределов мира.

Во-вторых: если образ docker установлен на станции вне брандмауэра/маршрутизатора, вы должны настроить брандмауэр/маршрутизатор и включить прослушивание портов. Вот набор шагов, которые я должен был сделать, чтобы настроить сервер PostgreSQL для включения подключения извне word на сервере QNAP NAT:
Как включить удаленное подключение к серверу PostgreSQL (в контейнерной станции) на сервере QNAP NAT через маршрутизатор[^]

Окончательно... вы должны докеризировать приложение .net core. Видеть:
Dockerize a .NET Core application | документация Docker[^]
Инструменты Visual Studio для Docker с ASP.NET ядро | Microsoft Docs[^]
Работает .Объем основного веб-приложения в контейнере Docker с помощью настройки рабочего стола для Windows Разработчик | премьер [^]


Я бы настоятельно рекомендовал вам прочитать и это тоже: Отладка ASP.NET основные приложения в локальном контейнере Docker - блог .NET Tools.Чистые инструменты блог[^]