Какой URL-адрес Kestrel должен прослушивать в Docker-контейнере в Службе приложений Azure

У меня есть ASP.NET Core в Docker-контейнере, который будет размещен в Службе приложений Azure. Какой URL-адрес должен прослушивать Kestrel, находящийся внутри контейнера, при развертывании в Службе приложений Azure?

Моя мысленная модель такова: я мог бы использовать localhost:8080, а затем привязать порт контейнера 8080 к порту 443 службы приложений Azure через -p 443:8080. Поэтому при посещении https://myapp.azurewebsites.net этот номер 443 будет перенаправлен на номер 8080, который слушает Kestrel.

Так как же правильно поступить? Спасибо. Я самоучка и имею лишь самые базовые знания в области сетевых технологий, поэтому, пожалуйста, объясните, как будто мне 5 лет, и дайте ключевые слова, чтобы я мог исследовать больше. Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы обязательно захотите привязаться к (так оно называется) 0.0.0.0. Он определяет, откуда вы будете принимать соединения. В контейнере localhost — это сам контейнер, поэтому, если вы привязываетесь к localhost, ваше приложение будет принимать соединения, поступающие только изнутри контейнера. Это не то, чего вы хотите.

Что касается того, какой порт использовать внутри контейнера, это не имеет особого значения, поскольку вы сопоставите его с портом хоста при запуске контейнера. Образы aspnet от Microsoft настроены на прием HTTP-трафика через порт 8080 для .NET 8 и порт 80 для .NET 7 и более ранних версий.

Поскольку вы сопоставляете порт хоста 443, похоже, вы хотите использовать HTTPS, а не HTTP. Для этого вам необходимо настроить ASP, поскольку по умолчанию используется только HTTP. Вы можете настроить ASP, установив для переменной среды ASPNETCORE_URLS значение вроде https://+:8443. Затем он будет прослушивать HTTPS на порту 8443. Если вы это сделаете, я рекомендую прослушивать другой порт, кроме 8080, поскольку он обычно используется для HTTP-трафика.

Чтобы использовать HTTPS, вам также необходимо настроить сертификаты. Подробнее об этом можно прочитать здесь.

Краткий ответ: чтобы запустить контейнер .NET 8 aspnet, эта команда должна помочь:

docker run -d -p 8080:8080 -e ASPNETCORE_ENVIRONMENT=Development my-image

Если вы хотите, чтобы Swagger был доступен, для среды необходимо выбрать «Разработка». Swagger доступен только в среде разработки, и по умолчанию контейнер Docker не находится в стадии разработки.

очень ценю ваш подробный ответ. Я хотел бы уточнить: какой именно сетевой интерфейс или IP-адрес является шлюзом в контейнер? Другими словами, когда запрос GET поступает на предоставленный общедоступный URL-адрес службы приложений Azure, порт https://myapp.azurewebsites.net и пересылается на порт 443 контейнера, какой IP-адрес контейнера получит этот запрос? 0.0.0.0 будет прослушивать весь сетевой интерфейс, но какой сетевой интерфейс фактически получает запрос, перенаправленный из службы приложений Azure?

Tri 27.06.2024 20:01

Я не очень хорошо знаком с Azure. Но в настройке Docker контейнер обычно подключается к сети Docker Bridge и получает IP-адрес в этой сети. Итак, сопоставление портов заключается в приеме трафика через порт хоста и пересылке его в контейнер в сети моста и в сопоставленный порт контейнера. Что касается интерфейса, через который поступает трафик, я только что попробовал запустить контейнер Debian, и он поступает через интерфейс eth0.

Hans Kilian 27.06.2024 20:52

это очень интересно. Короче говоря, мне следует настроить Kestrel на прослушивание подстановочного знака сетевого интерфейса, то есть 0.0.0.0, чтобы перехватывать весь входящий трафик, пересылаемый в контейнер, верно? Будут ли возникать какие-либо проблемы с безопасностью производства? Другими словами, кажется, что людей действительно не волнует, из какого сетевого интерфейса контейнер получает трафик, их волнует только порт. Я прав? Также какую команду вы выполнили, чтобы узнать, какой контейнер прослушивается eth0?

Tri 27.06.2024 21:11

Да, это правильно. По умолчанию MS для контейнеров .NET привязывается к 0.0.0.0, поэтому я считаю, что это безопасно. Что вы можете сделать на стороне хоста, так это привязать его к localhost, чтобы сопоставленный порт принимал только трафик, исходящий от самого хост-компьютера. Вы можете сделать это, привязавшись к 127.0.0.1 в сопоставлении портов, и у вас будет -p 127.0.0.1:8080:8080. Но внутри контейнера вы все равно привязываетесь к 0.0.0.0. Возможно, вам захочется сделать это, если вы не ожидаете трафика извне хост-компьютера.

Hans Kilian 27.06.2024 21:18

ценю вашу помощь. Я попробую!

Tri 27.06.2024 22:00

Другие вопросы по теме