Azure 앱 Service에서 컨테이너화된 Flask 또는 FastAPI 웹앱 배포

이 자습서에서는 Web App for Containers 기능을 사용하여 Azure 앱 ServicePython Flask 또는 FastAPI 웹앱을 배포하는 방법을 보여 줍니다. Web App for Containers는 개발자가 완전히 관리되는 Azure 앱 Service 플랫폼을 활용할 수 있는 간편한 온-램프를 제공하지만 앱 및 모든 종속성을 포함하는 배포 가능한 단일 아티팩트를 원합니다. Azure에서 컨테이너를 사용하는 방법에 대한 자세한 내용은 Azure 컨테이너 옵션 비교를 참조 하세요.

이 자습서에서는 Docker CLIDocker를 사용하여 필요에 따라 Docker 이미지를 만들고 로컬로 테스트합니다. 또한 Azure CLI사용하여 Azure에서 Docker 이미지를 만들고 Azure 앱 Service에 배포합니다. Azure 도구 확장이 설치된 Visual Studio Code를 사용하여 배포할 수도 있습니다. Azure Container Apps에서 실행할 Docker 이미지를 빌드하고 만드는 예제는 Azure Container Apps에서 Flask 또는 FastPI 웹앱 배포를 참조 하세요.

참고 항목

이 자습서에서는 App Service에서 실행할 수 있는 Docker 이미지를 만드는 방법을 보여줍니다. App Service를 사용할 필요는 없습니다. Docker 이미지를 만들지 않고 로컬 작업 영역에서 App Service로 직접 코드를 배포할 수 있습니다. 예를 들어 빠른 시작을 참조하세요. Python(Django 또는 Flask) 웹앱을 Azure 앱 Service에 배포합니다.

필수 조건

이 자습서를 완전히 학습하려면 다음이 필요합니다.

  • Azure 앱 Service 및 Azure Container Registry에 웹앱을 배포할 수 있는 Azure 계정입니다.

  • Azure CLI 를 사용하여 Docker 이미지를 만들고 App Service에 배포합니다. 필요에 따라 Docker및 Docker CLI사용하여 Docker를 만들고 로컬 환경에서 테스트합니다.

샘플 코드 가져오기

로컬 환경에서 코드를 가져옵니다.

git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git

Dockerfile 및 .dockerignore 파일 추가

Dockerfile추가하여 Docker에 이미지를 빌드하는 방법을 지시합니다. Dockerfile은 Flask 및 FastAPI 프레임워크에 웹 요청을 전달하는 프로덕션 수준 웹 서버인 Gunicorn의 사용을 지정합니다. ENTRYPOINT 및 CMD 명령은 Gunicorn에게 앱 개체에 대한 요청을 처리하도록 지시합니다.

# syntax=docker/dockerfile:1

FROM python:3.11

WORKDIR /code

COPY requirements.txt .

RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 50505

ENTRYPOINT ["gunicorn", "app:app"]

50505 는 이 예제에서 컨테이너 포트(내부)에 사용되지만 사용 가능 포트를 사용할 수 있습니다.

requirements.txt 파일이 포함되어 있는지 확인합니다gunicorn.

Flask==2.2.2
gunicorn
Werkzeug==2.2.2

.dockerignore 파일을 추가하여 이미지에서 불필요한 파일을 제외합니다.

.git*
**/*.pyc
.venv/

gunicorn 구성

Gunicorn은 gunicorn.conf.py 파일로 구성할 수 있습니다. gunicorn.conf.py 파일이 gunicorn이 실행되는 동일한 디렉터리에 있는 경우 Dockerfile에서 해당 위치를 지정할 필요가 없습니다. 구성 파일을 지정하는 방법에 대한 자세한 내용은 Gunicorn 설정을 참조 하세요.

이 자습서에서 제안된 구성 파일은 사용 가능한 CPU 코어 수에 따라 작업자 수를 늘리도록 gunicorn을 구성합니다. gunicorn.conf.py 파일 설정에 대한 자세한 내용은 Gunicorn 구성을 참조하세요.

# Gunicorn configuration file
import multiprocessing

max_requests = 1000
max_requests_jitter = 50

log_file = "-"

bind = "0.0.0.0:50505"

workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers

timeout = 120

이미지를 로컬로 빌드 및 실행

이미지를 로컬로 빌드합니다.

docker build --tag flask-demo .

참고 항목

명령이 docker build 오류를 반환하는 경우 docker deamon이 실행 중인지 확인합니다. Windows에서 Docker Desktop이 실행 중인지 확인합니다.

Docker 컨테이너에서 이미지를 로컬로 실행합니다.

docker run --detach --publish 5000:50505 flask-demo

브라우저에서 URL을 http://localhost:5000 열어 로컬로 실행되는 웹앱을 확인합니다.

--detach 옵션은 백그라운드에서 컨테이너를 실행합니다. 이 --publish 옵션은 컨테이너 포트를 호스트의 포트에 매핑합니다. 호스트 포트(외부)는 쌍에서 첫 번째이고 컨테이너 포트(내부)는 두 번째입니다. 자세한 내용은 Docker 실행 참조를 참조하세요.

리소스 그룹 및 Azure Container Registry 만들기

  1. az group create 명령을 사용하여 그룹을 만듭니 다.

    az group create --name web-app-simple-rg --location eastus
    

    Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다. 리소스 그룹을 만들 때 eastus와 같은 위치를 지정합니다.

  2. az acr create 명령을 사용하여 Azure Container Registry를 만듭니 다.

    az acr create --resource-group web-app-simple-rg \
    --name webappacr123 --sku Basic --admin-enabled true
    

    참고 항목

    레지스트리 이름은 Azure에서 고유해야 합니다. 오류가 발생하면 다른 이름을 사용해 보세요. 레지스트리 이름은 5-50자의 영숫자로 구성됩니다. 하이픈과 밑줄은 허용되지 않습니다. 자세한 내용은 Azure Container Registry 이름 규칙을 참조하세요. 다른 이름을 사용하는 경우 다음 섹션의 레지스트리 및 레지스트리 아티팩트를 참조하는 명령 대신 webappacr123 이름을 사용해야 합니다.

    Azure Container Registry는 Azure Container Instances, Azure 앱 Service, Azure Kubernetes Service 및 기타 서비스에서 사용할 이미지를 저장하는 프라이빗 Docker 레지스트리입니다. 레지스트리를 만들 때 이름, SKU 및 리소스 그룹을 지정합니다. 두 번째 명령은 az credential show 명령을 사용하여 변수에 암호를 저장합니다. 암호는 이후 단계에서 레지스트리에 인증하는 데 사용됩니다.

  3. 환경 변수를 레지스트리의 암호 값으로 설정합니다.

    $ACR_PASSWORD=(az acr credential show \
    --resource-group web-app-simple-rg \
    --name webappacr123 \
    --query "passwords[?name == 'password'].value" \
    --output tsv)
    

    Bash 셸에 대해 환경 변수를 만드는 명령이 표시됩니다. 구문 및 연속 문자()를\ 다른 셸에 맞게 변경합니다.

    레지스트리로 이동하고, 액세스 키를 선택하고, 암호를 복사하여 Azure Portal에서 암호(ACR_PASSWORD)를 가져올 수도 있습니다.

Azure Container Registry에서 이미지 빌드

az acr build 명령을 사용하여 Azure에서 Docker 이미지를 빌드 합니다. 이 명령은 현재 디렉터리의 Dockerfile을 사용하고 이미지를 레지스트리에 푸시합니다.

az acr build \
  --resource-group web-app-simple-rg \
  --registry webappacr123 \
  --image webappsimple:latest .

--registry 옵션은 레지스트리 이름을 지정하고 --image 옵션은 이미지 이름을 지정합니다. 이미지 이름은 형식 registry.azurecr.io/repository:tag입니다.

Azure에 웹앱 배포

  1. az appservice plan 명령을 사용하여 App Service 계획을 만듭니다.

    az appservice plan create \
    --name webplan \
    --resource-group web-app-simple-rg \
    --sku B1 \
    --is-linux
    
  2. az webapp create 명령을 사용하여 웹앱을 만듭니 다.

    az webapp create \
    --resource-group web-app-simple-rg \
    --plan webplan --name webappsimple123 \
    --docker-registry-server-password $ACR_PASSWORD \
    --docker-registry-server-user webappacr123 \
    --role acrpull \
    --deployment-container-image-name webappacr123.azurecr.io/webappsimple:latest 
    

    참고:

    • 웹앱 이름은 Azure에서 고유해야 합니다. 오류가 발생하면 다른 이름을 사용해 보세요. 이름은 영숫자 문자와 하이픈으로 구성되지만 하이픈으로 시작하거나 끝낼 수는 없습니다. 자세한 내용은 Microsoft.Web 이름 규칙을 참조하세요.

    • Azure Container Registry와 다른 webappacr123 이름을 사용하는 경우 해당 이름 및 --deployment-container-image-name 매개 변수를 --docker-registry-server-user 적절하게 업데이트해야 합니다.

    • 웹앱을 만드는 데 몇 분 정도 걸릴 수 있습니다. az webapp log tail 명령을 사용하여 배포 로그를 검사 수 있습니다. 예들 들어 az webapp log tail --resource-group web-app-simple-rg --name webappsimple123입니다. "준비"가 포함된 항목이 표시되면 컨테이너가 배포됩니다.

    • 웹앱의 URL은 <web-app-name>.azurewebsites.net다음과 같습니다 https://webappsimple123.azurewebsites.net.

업데이트 및 다시 배포

코드를 변경한 후 az acr buildaz webapp update 명령을 사용하여 App Service에 다시 배포할 수 있습니다.

정리

이 자습서에서 만든 모든 Azure 리소스는 동일한 리소스 그룹에 있습니다. 리소스 그룹을 제거하면 리소스 그룹의 모든 리소스가 제거되며 앱에 사용되는 모든 Azure 리소스를 제거하는 가장 빠른 방법입니다.

리소스를 제거하려면 az group delete 명령을 사용합니다.

az group delete --name web-app-simple-rg

Azure Portal 또는 Visual Studio CodeAzure Tools 확장에서 그룹을 제거할 수도 있습니다.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.