Не удается подключиться к экземпляру контейнера Azure .net Core MVC Контейнер Linux

Я новичок в Docker и Azure в целом, так что терпите меня ...

ДЛЯ НАЧИНАЮЩИХ

У меня есть образ Docker на основе контейнера Linux, который я могу запустить и подключиться к нему локально.

Вот файл докеров, который я собрал

#Use microsoft's sdk image for build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app 

#1. copy csproj and restore as distinct layers
COPY *.sln .
COPY Client.Web/*.csproj ./Client.Web/
COPY DataOneDecoder/*.csproj ./DataOneDecoder/
COPY DealershipTenant/*.csproj ./DealershipTenant/
COPY Portal.Web/*.csproj ./Portal.Web/ 
COPY Multitenancy/*.csproj ./Multitenancy/ 
COPY Shared/*.csproj ./Shared/
COPY AdfSerialization/*.csproj ./AdfSerialization/

#2. dotnet-restore
RUN dotnet restore 

#3. copy everything else and build app
COPY Client.Web/. ./Client.Web/
COPY DataOneDecoder/. ./DataOneDecoder/
COPY DealershipTenant/. ./DealershipTenant/ 
COPY Portal.Web/. ./Portal.Web/
COPY Multitenancy/.  ./Multitenancy/
COPY Shared/. ./Shared/
COPY AdfSerialization/. ./AdfSerialization/

#4. Install nodejs and npm
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs
RUN echo "NODE Version: " && node --version
RUN echo "NPM Version: " && npm --version


#5. Navigate to Portal.Web and install npm dependencies
WORKDIR /app/Portal.Web
RUN npm install

#6. Build and publish solution
WORKDIR /app/
RUN dotnet publish -c Release -o out 

#7. Copy built application to runtime image, expose port 5000, and define entrypoint
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime
COPY --from=build /app/out ./
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
ENTRYPOINT ["dotnet", "Portal.Web.dll"]

Локально я могу открыть приложение на порту 80, сопоставленном с портом 5000 (отображается в файле dockerfile), используя следующие команды

docker build  -t exampleApp  . --no-cache  
docker run -d -p 80:5000 --name exampleContainer exampleApp

Теперь в стране Azure я настроил конвейер gitlab, который создает и развертывает контейнер в моем реестре контейнеров Azure.

Оттуда я использую интерфейс командной строки для развертывания контейнера в группе контейнеров и, в конечном итоге, в качестве экземпляра контейнера.

az container create \
    --name dstestacg \
    --resource-group $RES_GROUP \
    --image $ACR_LOGIN_SERVER/portal_web_test:38b63ff933ea5a04b9ed7906ee01db33afb9abb6 \
    --registry-login-server $ACR_LOGIN_SERVER \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
    --restart-policy Never \
    --ip-address Public \
    --cpu 2 \
    --memory 3.5 \
    --ports 80 \
    --environment-variables 'ASPNETCORE_URLS'='http://*:5000' \
    --command-line "tail -f /dev/null"

Похоже, что приложение запущено (я вижу всплеск использования ресурсов, больше, чем я испытывал, когда приложение не работало), но я не могу подключиться к общедоступному IP-адресу с портом 80. Я получаю ошибку ERR_CONNECTION_RESET в браузере

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

Я немного не понимаю, как это размещается на машине без Windows. Я считаю, что это с Kestrel, который, как я предполагаю, использовал мой локальный контейнер Linux. Я не уверен, почему я могу получить доступ к контейнеру через порт 80 локально, но не как к экземпляру контейнера Azure.

Любая помощь будет принята с благодарностью, и если вам нужна дополнительная информация, пожалуйста, спросите.

Спасибо!

Обновлен файл Docker и команда Azure CLI после обсуждения сопоставления портов.

#Use microsoft's sdk image for build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /app 

#1. copy csproj and restore as distinct layers
COPY *.sln .
COPY Client.Web/*.csproj ./Client.Web/
COPY DataOneDecoder/*.csproj ./DataOneDecoder/
COPY DealershipTenant/*.csproj ./DealershipTenant/
COPY Portal.Web/*.csproj ./Portal.Web/ 
COPY Multitenancy/*.csproj ./Multitenancy/ 
COPY Shared/*.csproj ./Shared/
COPY AdfSerialization/*.csproj ./AdfSerialization/

#2. dotnet-restore
RUN dotnet restore 

#3. copy everything else and build app
COPY Client.Web/. ./Client.Web/
COPY DataOneDecoder/. ./DataOneDecoder/
COPY DealershipTenant/. ./DealershipTenant/ 
COPY Portal.Web/. ./Portal.Web/
COPY Multitenancy/.  ./Multitenancy/
COPY Shared/. ./Shared/
COPY AdfSerialization/. ./AdfSerialization/

#4. Install nodejs and npm
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install -y nodejs
RUN echo "NODE Version: " && node --version
RUN echo "NPM Version: " && npm --version


#5. Navigate to Portal.Web and install npm dependencies
WORKDIR /app/Portal.Web
RUN npm install

#6. Build and publish solution
WORKDIR /app/
RUN dotnet publish -c Release -o out 

#7. Copy built application to runtime image, expose port 5000, and define entrypoint
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS runtime
COPY --from=build /app/out ./
EXPOSE 5000/tcp
ENV ASPNETCORE_URLS=http://*:5000
ENV ASPNETCORE_ENVIRONMENT=Development
ENTRYPOINT ["dotnet", "Portal.Web.dll"]
az container create \
    --name idkman \
    --resource-group $RES_GROUP \
    --image $ACR_LOGIN_SERVER/portal_web_test:deb5e784f1a7f9904f50a97b93ff42380b85158c \
    --registry-login-server $ACR_LOGIN_SERVER \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
    --restart-policy Never \
    --ip-address Public \
    --cpu 2 \
    --memory 3.5 \
    --ports 5000 \
    --environment-variables 'PORT'='5000'

person Brandon Jerz    schedule 13.04.2021    source источник


Ответы (1)


ACI не поддерживает сопоставление портов, поэтому вы можете напрямую открыть только тот порт, который вы указали в Dockerfile, здесь порт должен быть 5000. И тогда вы можете получить доступ к ACI, например, http: // publicIP: 5000.

person Charles Xu    schedule 13.04.2021
comment
Ого, я был в кроличьей норе, надеюсь, это решит проблему. Просто пытаюсь разместить наше приложение как контейнер Linux в Azure в качестве доказательства концепции. Давая это попробовать сейчас - person Brandon Jerz; 13.04.2021
comment
Все еще получаю ERR_CONNECTION_RESET, к сожалению, я выставляю порт 5000 в своем файле докеров и использую порт 5000 для экземпляра контейнера Azure. Есть ли хороший способ узнать, запущено ли приложение? Я пробовал скручивать localhost: 5000 из оболочки bash в лазурном, но мне просто отказывают в соединении - person Brandon Jerz; 13.04.2021
comment
@BrandonJerz Какую команду вы используете для создания ACI? Вы можете поделиться этим? - person Charles Xu; 13.04.2021
comment
команда, которую я использую для развертывания в ACI, находится в сообщении. Я использую параметр создания контейнера az в интерфейсе командной строки Azure. В основном, после вашего комментария я изменил свойство --ports на 5000 (которое должно быть по умолчанию для kestral и правильно отображается на моем локальном компьютере, на котором запущен linux) контейнеры) - person Brandon Jerz; 13.04.2021
comment
@BrandonJerz Это тот же образ, который вы запускаете локально, и он хорошо работает? И вы получаете доступ к ACI с URL-адресом http://publicIP:5000? - person Charles Xu; 13.04.2021
comment
Да обоим. это идентичный образ, который я отправил в ACR для того, что работает у меня локально в контейнерах linux, и я получаю доступ через общедоступный IP-адрес, предоставленный лазурью на порту 5000. Достаточно интересно, когда я пытаюсь выполнить curl из терминала bash для моего контейнера в azure Я получаю отказ в соединении curl localhost: 5000 curl: (7) Не удалось подключиться к порту localhost 5000: в соединении отказано - person Brandon Jerz; 13.04.2021
comment
@BrandonJerz Что ваше приложение делает в контейнере? Вы проверяете, хорошо ли работает приложение? Кажется, что приложение не запускается, так что нет ничего, что слушает порт 5000 внутри контейнера. - person Charles Xu; 13.04.2021
comment
Локально приложение хорошо работает в контейнере Linux (я на машине с Windows), я пытаюсь найти способ узнать, как оно работает в ACI, но я не могу получить к нему доступ. Я посмотрю, смогу ли я добавить логирование, так как сейчас я ничего не получаю. - person Brandon Jerz; 13.04.2021
comment
@BrandonJerz Хорошо, я знаю причину, вы пытаетесь удалить параметр --command-line в команде CLI. Это перезаписывает параметр CMD в вашем Dockerfile. - person Charles Xu; 13.04.2021
comment
Я удалил свойство --command-line, но все еще вижу сброс соединения. Я добавил обновленный файл dockerfile и команды Azure CLI в сообщение - person Brandon Jerz; 13.04.2021
comment
Кроме того, отображение 5000: 5000 локально отлично работает - person Brandon Jerz; 13.04.2021
comment
@BrandonJerz Правда? Вы подключаетесь к контейнеру и получаете доступ к приложению с помощью curl loclahost:5000? Если с изображением проблем нет, не используйте --command-line, ACI должен работать как на вашем локальном компьютере. - person Charles Xu; 13.04.2021
comment
да, я подключаюсь к контейнеру через функцию Azure Connect с помощью bin \ bash. Когда я пытаюсь curl localhost: 5000, я просто получаю curl: (7) Не удалось подключиться к порту localhost 5000: соединение отклонено - person Brandon Jerz; 13.04.2021
comment
@BrandonJerz Можете ли вы поделиться изображением? Если вы не возражаете, я могу помочь вам протестировать изображение. - person Charles Xu; 13.04.2021
comment
@BrandonJerz Я не могу создать изображение без кода вашего приложения. Так какая сейчас ситуация? - person Charles Xu; 13.04.2021
comment
@BrandonJerz Есть новости по этому вопросу? Вы решаете проблему? - person Charles Xu; 23.04.2021