Azure Container Apps에서 Flask 또는 FastAPI 웹앱 배포

이 자습서에서는 Python Flask 또는 FastAPI 웹앱을 컨테이너화하고 Azure Container Apps에 배포하는 방법을 보여 줍니다. Azure Container Apps는 Docker 컨테이너 기술을 사용하여 기본 제공 이미지와 사용자 지정 이미지를 모두 호스팅합니다. Azure에서 컨테이너를 사용하는 방법에 대한 자세한 내용은 Azure 컨테이너 옵션 비교를 참조 하세요.

이 자습서에서는 Docker CLIAzure CLI를 사용하여 Docker 이미지를 만들고 Azure Container Apps에 배포합니다. Visual Studio Code 및 Azure 도구 확장을 사용하여 배포할 수도 있습니다.

필수 조건

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

샘플 코드 가져오기

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

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위치 또는 CMD 명령에서 ENTRYPOINT 해당 위치를 지정할 필요가 없습니다. 구성 파일을 지정하는 방법에 대한 자세한 내용은 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 컨테이너에서 이미지를 로컬로 실행합니다.

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

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

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

Azure에 웹앱 배포

Azure Container Apps에 Docker 이미지를 배포하려면 az containerapp up 명령을 사용합니다. (Bash 셸에 대해 다음 명령이 표시됩니다. 다른 셸에 맞게 연속 문자(\)를 변경합니다.

az containerapp up \
  --resource-group web-flask-aca-rg --name web-aca-app \
  --ingress external --target-port 50505 --source .

배포가 완료되면 그 안에 다음 리소스가 포함된 리소스 그룹이 있습니다.

  • Azure Container Registry
  • Container Apps 환경
  • 웹앱 이미지를 실행하는 컨테이너 앱
  • Log Analytics 작업 영역

배포된 앱의 URL은 명령의 출력에 있습니다 az containerapp up . 브라우저에서 URL을 열어 Azure에서 실행 중인 웹앱을 확인합니다. URL의 형식은 배포에 고유한 다음과 https://web-aca-app.<generated-text>.<location-info>.azurecontainerapps.io<generated-text><location-info> 같습니다.

업데이트 및 다시 배포

코드를 업데이트한 후 이전 az containerapp up 명령을 다시 실행하여 이미지를 다시 빌드하고 Azure Container Apps에 다시 배포할 수 있습니다. 명령을 다시 실행하면 리소스 그룹 및 앱이 이미 존재하는 것을 고려하여 컨테이너 앱만 업데이트합니다.

더 복잡한 업데이트 시나리오에서는 az acr buildaz containerapp update 명령을 함께 사용하여 다시 배포하여 컨테이너 앱을 업데이트할 수 있습니다.

정리

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

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

az group delete --name web-flask-aca-rg

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

다음 단계

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