Как предоставить доступ к asp.net контейнер core docker к общедоступному URL?

#c# #docker #asp.net-core

#c# #docker #asp.net-core

Вопрос:

Если у меня есть общедоступный URL, такой как https://dogsandcats.com , и я хотел бы иметь возможность подключаться к нему из развернутого контейнера docker на этом сервере, как я могу это сделать?

В настоящее время у меня есть следующий файл Dockerfile для моего проекта .Net Core:

 FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .

EXPOSE 8080
ENTRYPOINT ["dotnet", "MedicineInventoryManagement.dll"]
  

Я предоставляю доступ к порту 8080, и когда я захожу на localhost: 8080 в моей локальной среде, я вижу, что мой веб-сервер распространяет приложение. Я подключил порт 8080 на https://dogsandcats.com , но он работает не так, как на моем локальном компьютере.

Должен ли я что-то делать со следующим блоком кода в Program.cs ?

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}
  

Или проблема кроется в другом?

Комментарии:

1. по умолчанию приложения dotnet core запускаются на порту 5000, и я не вижу, чтобы вы использовали UseUrls для изменения этого. Что, как вы видите, получается, когда вы пытаетесь сделать это извне? И если я правильно понял, вы развертываете свой контейнер на сервере с общедоступным URL, и когда вы пытаетесь подключиться извне, это не работает?

2. Когда я использую этот контейнер: aspnetcore-runtime, он по умолчанию запускается на порту 8000. Когда я пытаюсь получить доступ к общедоступному веб-сайту, я получаю сообщение 503 Запрещено, сервер не запущен для обработки ошибки запроса. Я думаю, что без docker asp.net основные веб-сайты по умолчанию будут запускаться на порту 5000, но с этим контейнером все по-другому.

Ответ №1:

microsoft / dotnet:aspnetcore-runtime image устанавливает переменную среды ASPNETCORE_URLS в http:// :80 это означает, что если вы явно не задали URL-адрес в своем приложении, например, через app.UseUrl в вашем Program.cs, то ваше приложение будет прослушивать порт 80 внутри контейнера.

https://hub.docker.com/r/microsoft/aspnetcore/

Ответ №2:

Я бы отлаживал подобные проблемы, используя подход «снизу вверх».

  1. Сделайте docker ps , чтобы проверить, какие порты ваш контейнер предоставляет хосту и к каким портам он привязывается? Посмотрите в столбце порты. Вы также можете использовать следующую команду и указать свое имя контейнера:

docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID

Если порт предоставлен как задумано, есть несколько вещей, которые нужно проверить на хосте. Теперь в зависимости от того, как настроена ваша среда, шаги могут отличаться, но вы поймете, что я имею в виду.

  1. Начните с изучения правил брандмауэра. Например, если вы используете Ubuntu и у вас включен UFW, проверьте, настроены ли правила для разрешения доступа к этому порту. Если вы находитесь за домашним / офисным маршрутизатором, возможно, вам захочется открыть порты, чтобы пропускать общедоступный трафик через этот порт. Если вы используете сервер, подобный Apache / Nginx, я бы проверил, правильно ли настроены мои виртуальные хосты / серверные блоки.

  2. Если вы обнаружите, что ваши порты открыты, как ожидалось, попробуйте получить к нему доступ, используя общедоступный IP-адрес вашей сети. Нет смысла просматривать записи DNS, если мы не можем получить к нему доступ, используя общедоступный IP компьютера. В конце концов, именно на это указывают DNS. Если вы не можете получить доступ, я бы вернулся к шагу # 2.

Если с шагом # 3 все понятно, тогда я бы заглянул в записи DNS и попытался определить проблему.

Чтобы понять этот процесс, вот его обзор на очень высоком уровне. Попробуйте подход снизу вверх, чтобы вы могли точно указать на проблему, с которой вы застряли.

[DNS] => [Общедоступный IP-адрес вашей сети] => [Аппаратный брандмауэр, такой как маршрутизатор и т.д.] => [Веб-сервер Nginx / Apache и т.д., если есть] => [Брандмауэр компьютера, такой как ОС или сторонний] => Порт хоста Docker => Порт ядра Dotnet в контейнере.

Вы также могли бы использовать что-то вроде ngrok, если вы просто хотите быстро протестировать что-то в целях разработки. Это избавляет от необходимости выполнять шаги № 2 и № 3, настраивая прокси для вас (особенно когда вы находитесь за строгим брандмауэром, который вы не контролируете). Я никак не связан с ngrok. Также есть несколько других альтернатив этому.