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

#.net #azure #docker #containers #azure-container-instances

Вопрос:

Я довольно новичок в Docker и Azure в целом, поэтому, пожалуйста, потерпите меня..

ДЛЯ НАЧАЛА

У меня есть образ докера на основе контейнера 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: " amp;amp; node --version
RUN echo "NPM Version: " amp;amp; 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 land я настроил конвейер 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: " amp;amp; node --version
RUN echo "NPM Version: " amp;amp; 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'
 

Ответ №1:

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

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

1. О, ничего себе, я был в кроличьей норе, надеюсь, это решит проблему. Просто пытаюсь разместить наше приложение в качестве контейнера Linux в Azure в качестве доказательства концепции. Давайте попробуем это сейчас

2. Все еще получая ERR_CONNECTION_RESET, к сожалению, я предоставляю порт 5000 в своем файле dockerfile и использую порт 5000 для экземпляра контейнера azure. Есть ли какой-нибудь хороший способ определить, запущено ли приложение? Я пробовал завивать localhost:5000 из оболочки bash в azure, но мне просто отказывают в подключении

3. @BrandonJerz Какую команду вы используете для создания ACI? Можете ли вы поделиться этим?

4. команда, которую я использую для развертывания в ACI, находится в сообщении. Я использую опцию создания контейнера az в Azure CLI. В основном после вашего комментария я изменил свойство —ports на 5000 (которое должно быть по умолчанию для kestral и правильно отображается на моей локальной машине под управлением Linux) контейнеров)

5. @BrandonJerz Изображение то же самое, которое вы запускаете локально и хорошо работает? И получаете ли вы доступ к ACI с помощью URL http://publicIP:5000 -адреса ?