Naučíte sa:

  • Použiť vlastný kontajnerový obraz a register obrazov na nasadenie aplikácie do verejného cloudu.
  • Nasadiť aplikáciu pomocou služby Azure Container Instances (ACI).

Požiadavky (prerequisites)

Potrebujete:

  • Docker nainštalovaný a spustený (docker version)
  • Azure CLI nainštalované (az version) a prihlásenie (az login)
  • Aktívne Azure predplatné s dostatočným kreditom

Nastavte si premenné (budete ich používať v celom cvičení, aby ste nemuseli prepisovať názvy):

# Upravte podľa seba
RG="mrg"
LOCATION="eastus"
ACR="registerkvietocek12345"   # musí byť globálne unikátne (len písmená+čísla)
DNS_LABEL="kvietocek-demo-12345" # musí byť unikátne v rámci regiónu
IMAGE_NAME="pozdravma"
IMAGE_TAG="dev"

(Voliteľné) Overte si aktuálne predplatné:

az account show --query "{name:name, id:id}" -o table
# az account set --subscription "<SUBSCRIPTION_ID>"

Zostavenie obrazu kontajnera

Zoberme si jednoduchú aplikáciu z minulého cvičenia (uložte ako app.py):

from datetime import date
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1><a href='/date'>Dátum a čas</a>"

@app.route("/date")
def today():
    today = date.today()
    return "<p>{}</p>".format(today.strftime("%d.%m.%Y"))

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80)

Pre aplikáciu, ktorá má zložitejšie závislosti, je výhodné vytvoriť obraz kontajnera. Do súboru Dockerfile zapíšeme postup pre inštaláciu a konfiguráciu všetkého potrebného na beh aplikácie. To nám uľahčí jej spustenie lokálne aj vo verejnom alebo súkromnom cloude.

Vytvorte súbor requirements.txt (pinovanie verzií pomôže, aby bolo cvičenie reprodukovateľné):

Flask==3.0.2

Príklad Dockerfile:

FROM python:3.12-alpine
WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY ./app.py /app

ENV FLASK_APP=app.py
EXPOSE 80

ENTRYPOINT ["flask"]
CMD ["run", "--host", "0.0.0.0", "--port", "80"]

Poznámka: flask run spúšťa vývojový server. Pre produkciu sa používa WSGI server (napr. gunicorn).

Zostavte obraz kontajnera a priraďte mu meno:

docker build . -t ${IMAGE_NAME}:${IMAGE_TAG}

(Voliteľné) Otestujte lokálne:

docker run --rm -p 8080:80 ${IMAGE_NAME}:${IMAGE_TAG}
# Otvorte http://localhost:8080

Register obrazov (container registry)

Ak chcete vo verejnom cloude použiť vlastný obraz kontajnera, musíte ho najprv umiestniť do registra obrazov. Register obrazov je miesto, z ktorého je možné získať obraz na požiadanie z ľubovoľného pracovného uzla v cloude.

Bude to vyzerať asi takto:

                              Verejný Cloud

 +---------------+          +-----------+          +-----------+
 | lokálny stroj | docker   | registry  | docker   | container |
 | docker build  | push --->| images    | pull --->| instance  |
 +---------------+          +-----------+          +-----------+

Register musí byť zabezpečený pred neoprávneným prístupom. Obraz kontajnera môže obsahovať citlivé dáta alebo zdrojové kódy, ktoré nechceme zdieľať. Register nastavíme tak, aby lokálny stroj mal právo na zápis a cloud runtime mal právo na čítanie.

Vytvorenie registra obrazov (ACR)

Na to, aby sme mohli použiť vlastný obraz v Azure, uložíme ho do služby Azure Container Registry (ACR).

Najprv vytvoríme skupinu prostriedkov a následne register:

az group create --name "$RG" --location "$LOCATION"

# Overenie dostupnosti mena (ACR name musí byť globálne unikátne)
az acr check-name --name "$ACR" --query nameAvailable -o tsv

az acr create --resource-group "$RG" --name "$ACR" --sku Basic

LOGIN_SERVER="$(az acr show --name "$ACR" --query loginServer -o tsv)"
echo "$LOGIN_SERVER"

Prihlásenie a odoslanie obrazu (push)

Najprv prihláste lokálneho Docker klienta do ACR:

# Funguje to?
az acr login --name "$ACR"

Ak tento spôsob prihlásenia nefunguje, môžete použiť prihlasovanie menom a heslom.

Upozornenie: Zapnutie ACR "Admin user" sa v reálnych projektoch neodporúča; použite to len pre toto cvičenie a potom to vypnite.

# Lab-only fallback (admin user)
# az acr update --name "$ACR" --admin-enabled true
# USERNAME="$(az acr credential show --name "$ACR" --query username -o tsv)"
# PASSWORD="$(az acr credential show --name "$ACR" --query passwords[0].value -o tsv)"
# docker login "$LOGIN_SERVER" -u "$USERNAME" -p "$PASSWORD"

Označte (tag) lokálny image DNS menom registra (pred lomítkom /) a odošlite ho:

# Ak ste otvorili nový terminál, znovu exportujte premennú:
LOGIN_SERVER="$(az acr show --name "$ACR" --query loginServer -o tsv)"
docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${LOGIN_SERVER}/${IMAGE_NAME}:${IMAGE_TAG}
docker push ${LOGIN_SERVER}/${IMAGE_NAME}:${IMAGE_TAG}

Overte, že je obraz v registri:

az acr repository list --name "$ACR" -o table
az acr repository show-tags --name "$ACR" --repository "$IMAGE_NAME" -o table

Vytvorenie kontajnera pomocou ACI

Na vytvorenie kontajnera použijeme službu Azure Container Instances. Príkaz na vytvorenie kontajnera je podobný príkazu docker run.

Pre stiahnutie obrazu z privátneho registra sú potrebné prihlasovacie údaje ACR admin používateľa. Zapnite admin používateľa teraz (ak ste to ešte neurobili):

az acr update --name "$ACR" --admin-enabled true

Upozornenie: Po cvičení admin používateľa vypnite (az acr update --name "$ACR" --admin-enabled false).

# ACI pri ťahaní z privátneho registra potrebuje prihlasovacie údaje (lab: admin user)
USERNAME="$(az acr credential show --name "$ACR" --query username -o tsv)"
PASSWORD="$(az acr credential show --name "$ACR" --query passwords[0].value -o tsv)"

az container create \
  --resource-group "$RG" \
  --name "mycontainer" \
  --image "${LOGIN_SERVER}/${IMAGE_NAME}:${IMAGE_TAG}" \
  --dns-name-label "$DNS_LABEL" \
  --ports 80 \
  --cpu 0.5 \
  --memory 0.5 \
  --registry-login-server "$LOGIN_SERVER" \
  --registry-username "$USERNAME" \
  --registry-password "$PASSWORD"

ACI nepodporuje mapovanie portov. Port, ktorý uvediete, musí byť rovnaký ako port, na ktorom kontajner počúva.

Podrobná dokumentácia: az container create.

Zistite DNS meno (FQDN), pod ktorým je kontajner prístupný:

az container show \
  --resource-group "$RG" \
  --name "mycontainer" \
  --query "{FQDN:ipAddress.fqdn,ProvisioningState:provisioningState}" \
  --out table

FQDN="$(az container show --resource-group "$RG" --name "mycontainer" --query ipAddress.fqdn -o tsv)"
echo "http://$FQDN"

Pozrite si aplikáciu (pobeží na porte, ktorý ste zverejnili):

curl -fsS "http://$FQDN/" | head

Pozrite si logy aplikácie:

az container logs --resource-group "$RG" --name "mycontainer"

Riešenie problémov (troubleshooting)

  • Meno ACR nie je dostupné: zvoľte iné $ACR (pomôže az acr check-name).
  • docker push je odmietnutý: skontrolujte $LOGIN_SERVER a prihlásenie (az acr login alebo lab-only admin-user fallback).
  • DNS label už existuje: zvoľte iné $DNS_LABEL (musí byť unikátne v rámci regiónu).
  • Kontajner má chyby pri ťahaní image: pozrite udalosti:
az container show --resource-group "$RG" --name "mycontainer" --query "instanceView.events" -o table
  • Nesprávny port: upravte aplikáciu/kontajner tak, aby počúval na rovnakom porte, ktorý zverejňujete (ACI porty nemapuje).

Ak nevymažete prostriedky, bude sa vám míňať kredit.

Vyčistite po sebe prostredie

Vymažte celú skupinu prostriedkov. Týmto sa vymaže aj register obrazov s obsahom:

az group delete --name "$RG" --yes --no-wait

Bibliografia

  • Azure Container Instances overview: https://learn.microsoft.com/en-us/azure/container-instances/container-instances-overview
  • Quickstart – nasadenie kontajnera pomocou Azure CLI: https://learn.microsoft.com/en-us/azure/container-instances/container-instances-quickstart
  • Tutorial – príprava registra kontajnerov: https://learn.microsoft.com/en-us/azure/container-instances/container-instances-tutorial-prepare-acr
  • Tutorial – nasadenie kontajnerovej aplikácie: https://learn.microsoft.com/en-us/azure/container-instances/container-instances-tutorial-deploy-app
  • Referencia az container create: https://learn.microsoft.com/en-us/cli/azure/container?view=azure-cli-latest#az-container-create

Previous Post Next Post

Azure Container Instances