Контейнер Docker ASP.NET Core недоступен через открытый порт на хост-компьютере

Я пытаюсь запустить веб-приложение ASP.NET Core MVC внутри контейнера Docker. Кажется, контейнер запускается правильно, и журналы показывают, что приложение прослушивает ожидаемый порт http://[::]:8080. Однако когда я пытаюсь получить доступ к приложению со своего хост-компьютера с помощью http://localhost:8081, я получаю ошибку ERR_EMPTY_RESPONSE в браузере.

Это Dockerfile:

# Use the official .NET Core runtime as the base image
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80

# Use the .NET Core SDK for building the project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["DockerWebMVC.csproj", "./"]
RUN dotnet restore "./DockerWebMVC.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "DockerWebMVC.csproj" -c Release -o /app/build

# Publish the project to get the deployment-ready binaries
FROM build AS publish
RUN dotnet publish "DockerWebMVC.csproj" -c Release -o /app/publish

# Final stage: Create a runtime container image
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DockerWebMVC.dll"]

Вот что я сделал на данный момент:

  • Создал образ Docker, используя файл Dockerfile, определяющий проект ASP.NET Core.
  • Запустите контейнер с помощью следующей команды: docker run -d -p 8081:80 dockerwebmvc .
  • Проверил логи внутри контейнера, которые показывают, что приложение запущено http://[::]:8080.
  • Выполнил завиток http://localhost:8080 внутри контейнера и правильно вернул HTML домашней страницы приложения.

Однако когда я пытаюсь получить доступ к приложению со своего хост-компьютера через http://localhost:8081, оно не работает.

Дополнительные детали:

  • Сеть Docker использует режим моста по умолчанию.
  • Я проверил возможные проблемы с брандмауэром или портом, но, похоже, все настроено правильно.
  • Приложение отлично работает локально за пределами Docker.

Может ли кто-нибудь помочь мне определить, почему я не могу получить доступ к приложению с моего хост-компьютера, несмотря на то, что контейнер работает правильно? Будем признательны за любые советы по шагам отладки или потенциальным проблемам с конфигурацией Docker.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В частности, я использовал команду docker run -d -p 8081:80 dockerwebmvc для запуска контейнера и ожидал, что смогу получить доступ к приложению через http://localhost:8081 на моем хост-компьютере.

И

Журналы внутри контейнера показывают, что приложение запущено и прослушивает http://[::]:8080.

Приложение работает на порту 8080 внутри контейнера, но вы сопоставляете порт 80, вместо этого вам нужно сопоставить 8080:

docker run -d -p 8081:8080 .....

Поскольку приложения .NET 8 по умолчанию используют порт 8080, см. Порт ASP.NET Core по умолчанию изменен с 80 на 8080:

А EXPOSE используется только в целях документирования и на самом деле ничего не делает:

Инструкция EXPOSE на самом деле не публикует порт. Он функционирует как своего рода документация между человеком, создающим образ, и человеком, запускающим контейнер, о том, какие порты предполагается публиковать.

Ваш ответ очень полезен для меня. Я трачу много времени на эту проблему, и ваш ответ решает ее за секунды. Большое спасибо!.

Parth Tirgar 25.08.2024 18:54

@ParthTirgar был рад помочь! Если ответ вас устраивает, пожалуйста, отметьте его как принятый (галочка слева ;)

Guru Stron 25.08.2024 19:00

Другие вопросы по теме