Udostępnij za pośrednictwem


Wdróż konteneryzowaną aplikację webową we frameworku Flask lub FastAPI na platformie Azure App Service.

W tym samouczku pokazano, jak wdrożyć aplikację internetową Python Flask lub FastAPI w usłudze Azure App Service przy użyciu funkcji Web App for Containers. Takie podejście zapewnia usprawnioną ścieżkę dla deweloperów, którzy chcą korzystać z w pełni zarządzanej platformy podczas wdrażania aplikacji jako pojedynczego konteneryzowanego artefaktu ze wszystkimi uwzględnionymi zależnościami. Aby uzyskać więcej informacji na temat używania kontenerów na platformie Azure, zobacz Porównanie opcji kontenera platformy Azure.

W tym samouczku użyjesz Docker CLI i Docker, aby opcjonalnie utworzyć i przetestować lokalnie obraz Dockera. Następnie użyjesz interfejsu wiersza polecenia platformy Azure do przesłania obrazu Docker do Azure Container Registry (ACR) i wdrożenia w Azure App Service. Aplikacja internetowa jest skonfigurowana przy użyciu przypisanej przez system tożsamości zarządzanej na potrzeby bezpiecznego, bez hasła dostępu w celu ściągnięcia obrazu z usługi ACR przy użyciu kontroli dostępu opartej na rolach (RBAC) platformy Azure. Można również wdrożyć za pomocą programu Visual Studio Code z zainstalowanym rozszerzeniem narzędzi platformy Azure.

Aby zapoznać się z przykładem tworzenia obrazu Docker do uruchamiania w usłudze Azure Container Apps, zobacz Deploy a Flask or FastPI web app on Azure Container Apps (Wdrażanie aplikacji internetowej Flask lub FastPI w usłudze Azure Container Apps).

Uwaga

W tym samouczku pokazano, jak utworzyć obraz Docker, który można wdrożyć na Azure App Service. Jednak użycie obrazu Docker nie jest wymagane do wdrożenia na usłudze App Service. Możesz również wdrożyć kod aplikacji bezpośrednio z lokalnego obszaru roboczego w usłudze App Service bez tworzenia obrazu platformy Docker. Aby zapoznać się z przykładem, zobacz Szybki Start: wdrażanie aplikacji internetowej Python (Django lub Flask) do usługi Azure App Service.

Wymagania wstępne

Do ukończenia tego samouczka niezbędne są następujące elementy:

Pobieranie przykładowego kodu

W środowisku lokalnym pobierz kod.

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

Dodawanie plików Dockerfile i .dockerignore

Dodaj Dockerfile, aby poinstruować Docker, jak zbudować obraz. Plik Dockerfile określa użycie narzędzia Gunicorn, serwera internetowego na poziomie produkcyjnym, który przekazuje żądania internetowe do platform Flask i FastAPI. Polecenia ENTRYPOINT i CMD instruują Gunicorn do obsługi żądań dla obiektu aplikacji.

# 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 jest używany dla portu kontenera (wewnętrznego) w tym przykładzie, ale można użyć dowolnego bezpłatnego portu.

Sprawdź plik requirements.txt, aby upewnić się, że zawiera gunicorn.

Flask==3.1.0
gunicorn

Dodaj plik .dockerignore, aby wykluczyć niepotrzebne pliki z obrazu.

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

Konfigurowanie Gunicorn

Gunicorn można skonfigurować za pomocą pliku gunicorn.conf.py . Gdy plik gunicorn.conf.py znajduje się w tym samym katalogu, w którym jest uruchamiany gunicorn, nie musisz określać jego lokalizacji w pliku Dockerfile. Aby uzyskać więcej informacji na temat określania pliku konfiguracji, zobacz Ustawienia Gunicorn.

W tym samouczku sugerowany plik konfiguracyjny konfiguruje gunicorn w celu zwiększenia liczby pracowników na podstawie liczby dostępnych rdzeni CPU. Aby uzyskać więcej informacji na temat ustawień gunicorn.conf.py plików, zobacz Konfiguracja serwera 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

Kompilowanie i uruchamianie obrazu lokalnie

Skompiluj obraz lokalnie.

docker build --tag flask-demo .

Uwaga

Jeśli polecenie docker build zwróci błąd, upewnij się, że daemon Dockera jest uruchomiony. W systemie Windows upewnij się, że program Docker Desktop jest uruchomiony.

Uruchom obraz lokalnie w kontenerze platformy Docker.

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

http://localhost:5000 Otwórz adres URL w przeglądarce, aby wyświetlić aplikację internetową uruchomioną lokalnie.

Opcja --detach uruchamia kontener w tle. Opcja --publish mapuje port kontenera na port na hoście. Port hosta (zewnętrzny) jest pierwszy w parze, a port kontenera (wewnętrzny) jest drugi. Aby uzyskać więcej informacji, zobacz Dokumentacja uruchamiania platformy Docker.

Utwórz grupę zasobów i Azure Container Registry

  1. Uruchom polecenie az login, aby zalogować się na platformie Azure.

    az login
    
  2. Uruchom polecenie az upgrade, aby upewnić się, że wersja interfejsu wiersza polecenia platformy Azure jest aktualna.

    az upgrade
    
  3. Utwórz grupę przy użyciu polecenia az group create.

    RESOURCE_GROUP_NAME=<resource-group-name>
    LOCATION=<location>
    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

    Grupa zasobów platformy Azure to logiczny kontener przeznaczony do wdrażania zasobów platformy Azure i zarządzania nimi. Podczas tworzenia grupy zasobów należy określić lokalizację, taką jak eastus. Zastąp <location> dowolną lokalizacją. Niektóre jednostki SKU są niedostępne w niektórych lokalizacjach, więc może wystąpić błąd wskazujący na to. Użyj innej lokalizacji i spróbuj ponownie.

  4. Utwórz usługę Azure Container Registry za pomocą polecenia az acr create . Zamień <container-registry-name> na unikatową nazwę dla swojego wystąpienia.

    CONTAINER_REGISTRY_NAME=<container-registry-name>
    az acr create --resource-group $RESOURCE_GROOUP_NAME \
    --name $CONTAINER_REGISTRY_NAME --sku Basic
    

    Uwaga

    Nazwa rejestru musi być unikatowa na platformie Azure. Jeśli wystąpi błąd, spróbuj użyć innej nazwy. Nazwy rejestru mogą zawierać od 5 do 50 znaków alfanumerycznych. Łączniki i podkreślenia nie są dozwolone. Aby dowiedzieć się więcej, zobacz Reguły nazw usługi Azure Container Registry. Jeśli używasz innej nazwy, upewnij się, że używasz swojej nazwy, a nie webappacr123 w poleceniach odwołujących się do rejestru i artefaktów rejestru w poniższych sekcjach.

    Usługa Azure Container Registry to prywatny rejestr platformy Docker, który przechowuje obrazy do użycia w Azure Container Instances, Azure App Service, Azure Kubernetes Service i innych usługach. Podczas tworzenia rejestru należy określić nazwę, jednostkę SKU i grupę zasobów.

Tworzenie obrazu w usłudze Azure Container Registry

Skompiluj obraz platformy Docker na platformie Azure za pomocą polecenia az acr build . Polecenie używa pliku Dockerfile w bieżącym katalogu i przesyła obraz do rejestru.

az acr build \
  --resource-group $RESOURCE_GROUP_NAME \
  --registry $CONTAINER_REGISTRY_NAME \
  --image webappsimple:latest .

Opcja --registry określa nazwę rejestru, a --image opcja określa nazwę obrazu. Nazwa obrazu ma format registry.azurecr.io/repository:tag.

Wdrażanie aplikacji internetowej na platformie Azure

  1. Utwórz plan usługi App Service przy użyciu polecenia az appservice plan.

    az appservice plan create \
    --name webplan \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux
    
  2. Ustaw zmienną środowiskową do identyfikatora subskrypcji. Jest on używany w parametrze --scope w następnym poleceniu.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    

    Polecenie tworzenia zmiennej środowiskowej zostało podane dla powłoki Bash. Zmień składnię odpowiednio dla innych środowisk.

  3. Utwórz aplikację internetową używając polecenia az webapp create.

    export MSYS_NO_PATHCONV=1 # This line is for Windows users to prevent path conversion issues in Git Bash.
    az webapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --plan webplan --name <container-registry-name> \
    --assign-identity [system] \
    --role AcrPull \
    --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME \
    --acr-use-identity --acr-identity [system] \
    --container-image-name $CONTAINER_REGISTRY_NAME.azurecr.io/webappsimple:latest 
    

    Uwagi:

    • Nazwa aplikacji internetowej musi być unikatowa na platformie Azure. Jeśli wystąpi błąd, spróbuj użyć innej nazwy. Nazwa może zawierać znaki alfanumeryczne i łączniki, ale nie może rozpoczynać ani kończyć się łącznikiem. Aby dowiedzieć się więcej, zobacz Microsoft.Web name rules (Reguły nazw Microsoft.Web).

    • Jeśli używasz nazwy innej niż webappacr123 dla usługi Azure Container Registry, upewnij się, że odpowiednio zaktualizuj --container-image-name parametr.

    • Parametry --assign-identity, --role i --scope umożliwiają systemowo przypisaną tożsamość zarządzaną w aplikacji internetowej i przypisują jej rolę AcrPull w grupie zasobów. Daje to tożsamości zarządzanej uprawnienie do pobierania obrazów z dowolnego Azure Container Registry w grupie zasobów.

    • Parametry --acr-use-identity i --acr-identity umożliwiają skonfigurowanie aplikacji internetowej tak, aby korzystała z przypisanej przez system tożsamości zarządzanej do ściągania obrazów z usługi Azure Container Registry.

    • Utworzenie aplikacji internetowej może potrwać kilka minut. Można sprawdzić dzienniki wdrażania za pomocą polecenia az webapp log tail. Na przykład az webapp log tail --resource-group web-app-simple-rg --name webappsimple123. Jeśli zobaczysz wpisy z "rozgrzewanie" w nich, oznacza to, że kontener jest wdrażany.

    • Adres URL aplikacji internetowej to <web-app-name>.azurewebsites.net, na przykład https://webappsimple123.azurewebsites.net.

Wprowadzanie aktualizacji i ponowne wdrażanie

Po wprowadzeniu zmian w kodzie możesz ponownie wdrożyć usługę App Service za pomocą poleceń az acr build i az webapp update .

Czyszczenie

Wszystkie zasoby platformy Azure utworzone w tym samouczku znajdują się w tej samej grupie zasobów. Usunięcie grupy zasobów spowoduje usunięcie wszystkich zasobów w grupie zasobów i jest najszybszym sposobem usunięcia wszystkich zasobów platformy Azure używanych dla aplikacji.

Aby usunąć zasoby, użyj az group delete polecenia.

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Możesz również usunąć grupę w witrynie Azure Portal lub w programie Visual Studio Code i rozszerzeniu narzędzi platformy Azure.

Następne kroki

Aby uzyskać więcej informacji, zobacz następujące zasoby: