Не удается получить доступ к приложению .Net Core через Docker в Windows (localhost)

#c# #.net #docker #asp.net-core #.net-core

#c# #.net #docker #asp.net-core #.net-core

Вопрос:

Я создал файл docker и предоставил порт. Я также настраиваю свой program.cs для чтения этих URL-адресов портов, но не могу получить к нему доступ.

Из того, что я вижу в консоли docker, это то, что мое приложение запущено. Я просто не могу до него добраться.

Я пробовал localhost: 5024 и 172.17.0.2: 5024, но это просто не сработало.

введите описание изображения здесь

Вот мой файл docker

 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build

WORKDIR /app

EXPOSE 80
EXPOSE 5024

# copy csproj and restore as distinct layers
COPY *.sln .
COPY Api/*.csproj ./Api/

RUN dotnet restore

# copy everything else and build app
COPY Api/. ./Api/
COPY Api.Core/. ./Api.Core/

WORKDIR /app/Api
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app

COPY --from=build /app/Api/out ./
ENTRYPOINT ["dotnet", "Api.dll"]
 

Это моя program.cs

 public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseContentRoot(Directory.GetCurrentDirectory());
                webBuilder.UseIISIntegration();
                webBuilder.UseKestrel();
                webBuilder.UseStartup<Startup>();
                webBuilder.UseUrls("http://*:5024");
            });
 

И я запускаю эти команды, чтобы запустить его

 docker build -f Api/Dockerfile -t quiplogs_api .
docker run -d -p 5024:80 --name app quiplogs_api
 

Ответ №1:

короткий ответ

измените свою docker run команду на приведенную ниже:

docker run -d -p 5024:5024 --name app quiplogs_api

Доступ к api с помощью localhost:5024/api …. или измените UseUrls на использование порта 80, и все останется прежним

Длинный ответ

В мире docker есть две сети.

Первый находится внутри мира docker, где запущены все контейнеры. Второй — это хост-машина. Когда вы пишете приложение docker, вы должны быть очень осторожны с тем, в какой сети вы находитесь.

-p не для портов, это опция публикации.

с помощью этого переключателя вы устанавливаете связь между сетью хоста и сетью docker. Ваша команда говорит опубликовать порт хоста этого контейнера 5024 и сопоставить его с сетевым портом 80 docker. Но UseUrls фактически настраивает его для запуска на порту 5024 в docker. Небольшое семантическое несоответствие. Новая команда исправляет это. Или вы можете изменить UseUrls для использования порта 80.