#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 внутри контейнера.
Ответ №2:
Я бы отлаживал подобные проблемы, используя подход «снизу вверх».
- Сделайте
docker ps
, чтобы проверить, какие порты ваш контейнер предоставляет хосту и к каким портам он привязывается? Посмотрите в столбце порты. Вы также можете использовать следующую команду и указать свое имя контейнера:
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID
Если порт предоставлен как задумано, есть несколько вещей, которые нужно проверить на хосте. Теперь в зависимости от того, как настроена ваша среда, шаги могут отличаться, но вы поймете, что я имею в виду.
-
Начните с изучения правил брандмауэра. Например, если вы используете Ubuntu и у вас включен UFW, проверьте, настроены ли правила для разрешения доступа к этому порту. Если вы находитесь за домашним / офисным маршрутизатором, возможно, вам захочется открыть порты, чтобы пропускать общедоступный трафик через этот порт. Если вы используете сервер, подобный Apache / Nginx, я бы проверил, правильно ли настроены мои виртуальные хосты / серверные блоки.
-
Если вы обнаружите, что ваши порты открыты, как ожидалось, попробуйте получить к нему доступ, используя общедоступный IP-адрес вашей сети. Нет смысла просматривать записи DNS, если мы не можем получить к нему доступ, используя общедоступный IP компьютера. В конце концов, именно на это указывают DNS. Если вы не можете получить доступ, я бы вернулся к шагу # 2.
Если с шагом # 3 все понятно, тогда я бы заглянул в записи DNS и попытался определить проблему.
Чтобы понять этот процесс, вот его обзор на очень высоком уровне. Попробуйте подход снизу вверх, чтобы вы могли точно указать на проблему, с которой вы застряли.
[DNS] => [Общедоступный IP-адрес вашей сети] => [Аппаратный брандмауэр, такой как маршрутизатор и т.д.] => [Веб-сервер Nginx / Apache и т.д., если есть] => [Брандмауэр компьютера, такой как ОС или сторонний] => Порт хоста Docker => Порт ядра Dotnet в контейнере.
Вы также могли бы использовать что-то вроде ngrok, если вы просто хотите быстро протестировать что-то в целях разработки. Это избавляет от необходимости выполнять шаги № 2 и № 3, настраивая прокси для вас (особенно когда вы находитесь за строгим брандмауэром, который вы не контролируете). Я никак не связан с ngrok. Также есть несколько других альтернатив этому.