Я не могу получить доступ к контейнеру с запущенным внутри приложением ASP.NET Core 3.1. Цель - запустить приложение в контейнере на порту 5000. Когда я запускаю его локально, используя стандартный профиль VS, я перехожу к http: // localhost: 5000 / swagger / index.html, чтобы загрузить swaggerUI. . Я хотел бы добиться того же с помощью докера.
Действия по воспроизведению моей проблемы:
Добавьте файл докеров с открытым портом 5000 и переменной ENV ASPNETCORE_URLS:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app ENV ASPNETCORE_URLS=http://+:5000 EXPOSE 5000 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY ["myapp/myapp.csproj", "myapp/"] RUN dotnet restore "myapp/myapp.csproj" COPY . . WORKDIR "/src/myapp/" RUN dotnet build "myapp.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "myapp.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "myapp.dll"]
Создать образ
docker build -t myapp .
Запустить образ докера:
docker run myapp -p 5000:5000
Выполнение приведенных выше команд с конкретным файлом докеров приводит к следующему:
[21:28:42 INF] Starting host.
[21:28:42 INF] Now listening on: http://[::]:5000
[21:28:42 INF] Application started. Press Ctrl+C to shut down.
[21:28:42 INF] Hosting environment: Production
[21:28:42 INF] Content root path: /app
Однако я не могу получить доступ к контейнеру с помощью http: // localhost: 5000 / swagger / index.html из-за ERR_CONNECTION_REFUSED - ›Этот сайт недоступен.
Я залез в контейнер, чтобы проверить, работает ли хост наверняка, используя:
docker exec -it containerId /bin/bash
cd /app
dotnet myapp.dll
что привело к следующей ошибке:
Unable to start Kestrel.
System.IO.IOException: Failed to bind to address http://[::]:5000: address already in use.
Вывод таков: порт внутри контейнера используется, приложение живое, просто не доступно извне, как попасть внутрь не знаю. Пожалуйста, укажите мне правильное направление.
ОБНОВЛЕНИЕ Проблема решена, ответ размещен ниже. Однако было бы неплохо объяснить, зачем это было нужно и как это работает!