Я пытаюсь запустить веб-приложение 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 run -d -p 8081:80 dockerwebmvc .
http://[::]:8080
.http://localhost:8080
внутри контейнера и правильно вернул HTML домашней страницы приложения.Однако когда я пытаюсь получить доступ к приложению со своего хост-компьютера через http://localhost:8081
, оно не работает.
Дополнительные детали:
Может ли кто-нибудь помочь мне определить, почему я не могу получить доступ к приложению с моего хост-компьютера, несмотря на то, что контейнер работает правильно? Будем признательны за любые советы по шагам отладки или потенциальным проблемам с конфигурацией Docker.
В частности, я использовал команду 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
на самом деле не публикует порт. Он функционирует как своего рода документация между человеком, создающим образ, и человеком, запускающим контейнер, о том, какие порты предполагается публиковать.
@ParthTirgar был рад помочь! Если ответ вас устраивает, пожалуйста, отметьте его как принятый (галочка слева ;)
Ваш ответ очень полезен для меня. Я трачу много времени на эту проблему, и ваш ответ решает ее за секунды. Большое спасибо!.