Kurz: Sestavení a nasazení imagí kontejneru v cloudu pomocí úloh služby Azure Container Registry

ACR Tasks je sada funkcí ve službě Azure Container Registry, která poskytuje zjednodušená a efektivní sestavení imagí kontejnerů Dockeru v Azure. V tomto článku se dozvíte, jak používat funkci rychlé úlohy služby ACR Tasks.

Vývojový cyklus typu „vnitřní smyčka“ je iterativní proces psaní kódu, sestavení a testování aplikace před potvrzením do správy zdrojového kódu. Rychlá úloha rozšiřuje vnitřní smyčku do cloudu, poskytuje ověření úspěšnosti sestavení a automatické odesílání úspěšně sestavených imagí do registru kontejneru. Vaše image se nativně sestavují v cloudu, blízko registru, a umožňují tak rychlejší nasazení.

Veškeré vaše znalosti ohledně souboru Dockerfile můžete přímo aplikovat ve službě ACR Tasks. Pokud chcete provádět sestavení v cloudu pomocí ACR Tasks, nemusíte soubory Dockerfile měnit, stačí změnit jen spouštěný příkaz.

V tomto kurzu, který je první částí série, se naučíte:

  • Získat zdrojový kód ukázkové aplikace
  • Sestavit image kontejneru v Azure
  • Nasazení kontejneru do služby Azure Container Instances

V následujících kurzech se naučíte použít ACR Tasks k automatizovanému sestavení imagu kontejneru při potvrzení kódu a aktualizaci základní image. ACR Tasks může také spouštět úlohy s více kroky a pomocí souboru YAML definovat kroky pro sestavení, vložení a volitelně testování více kontejnerů.

Požadavky

Účet GitHub

Pokud ještě nemáte účet na webu https://github.com, vytvořte si ho. Tato série kurzů používá úložiště GitHub k předvedení automatizovaných sestavení imagí v ACR Tasks.

Vytvoření forku ukázkového úložiště

Potom použijte uživatelské rozhraní GitHubu a vytvořte fork ukázkového úložiště v účtu GitHub. V tomto kurzu sestavíte image kontejneru ze zdroje v úložišti a v dalším kurzu odešlete potvrzení do forku úložiště a spustíte automatizovanou úlohu.

Vytvořte fork tohoto úložiště: https://github.com/Azure-Samples/acr-build-helloworld-node

Snímek obrazovky s tlačítkem forku (zvýrazněným) v GitHubu

Klonování forku

Po vytvoření forku úložiště fork naklonujte a zadejte adresář obsahující místní klon.

Naklonujte úložiště pomocí gitpříkazu , nahraďte <your-github-username> svým uživatelským jménem GitHubu:

git clone https://github.com/<your-github-username>/acr-build-helloworld-node

Zadejte adresář obsahující zdrojový kód:

cd acr-build-helloworld-node

Prostředí Bash

Příkazy v této sérii kurzů jsou formátované pro prostředí Bash. Pokud byste chtěli raději použít PowerShell, příkazový řádek nebo jiné prostředí, budete možná podle toho muset přizpůsobit pokračování řádku a formát proměnné prostředí.

Příprava prostředí pro rozhraní příkazového řádku Azure

  • Použijte prostředí Bash v Azure Cloud Shell. Další informace najdete v tématu Rychlý start pro Bash v Azure Cloud Shell.

  • Pokud dáváte přednost místnímu spouštění referenčních příkazů rozhraní příkazového řádku, nainstalujte Azure CLI. Pokud používáte Windows nebo macOS, zvažte spuštění Azure CLI v kontejneru Docker. Další informace najdete v tématu Spuštění Azure CLI v kontejneru Dockeru.

    • Pokud používáte místní instalaci, přihlaste se k Azure CLI pomocí příkazu az login. Pokud chcete dokončit proces ověřování, postupujte podle kroků zobrazených na terminálu. Další možnosti přihlášení najdete v tématu Přihlášení pomocí Azure CLI.

    • Po zobrazení výzvy nainstalujte rozšíření Azure CLI při prvním použití. Další informace o rozšířeních najdete v tématu Využití rozšíření v Azure CLI.

    • Spuštěním příkazu az version zjistěte verzi a závislé knihovny, které jsou nainstalované. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade.

Sestavení v Azure pomocí ACR Tasks

Když teď máte zdrojový kód ve svém počítači, postupujte podle těchto kroků k vytvoření registru kontejneru a sestavení image kontejneru pomocí ACR Tasks.

Aby bylo spouštění ukázkových souborů jednodušší, používají kurzy v této sérii proměnné prostředí shell. Spuštěním následujícího příkazu nastavte proměnnou ACR_NAME. Nahraďte <registry-name> jedinečným názvem nového registru kontejneru. Název registru musí být jedinečný v rámci Azure, musí obsahovat pouze malá písmena a musí obsahovat 5 až 50 alfanumerických znaků. Další prostředky, které v tomto kurzu vytvoříte, jsou založené na tomto názvu. Proto byste měli změnit jenom tuto první proměnnou.

ACR_NAME=<registry-name>

S vyplněnou proměnnou prostředí registru kontejneru byste teď měli být schopni zkopírovat a vložit zbytek příkazů v kurzu, aniž byste museli upravovat nějaké hodnoty. Spuštěním následujících příkazů vytvořte skupinu prostředků a registr kontejneru.

RES_GROUP=$ACR_NAME # Resource Group name

az group create --resource-group $RES_GROUP --location eastus
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Standard --location eastus

Když teď máte registr, pomocí ACR Tasks sestavte image kontejneru ze vzorového kódu. Spuštěním příkazu az acr build proveďte rychlou úlohu.

Poznámka

Soubor Dockerfile použitý v následujícím příkladu závisí na imagi veřejného základního kontejneru z Docker Hub. Pokud chcete zvýšit spolehlivost při používání veřejného obsahu, naimportujte a spravujte image v privátním registru kontejneru Azure a aktualizujte soubor Dockerfile tak, aby používal vaši soukromě spravovanou základní image. Přečtěte si další informace o práci s veřejnými imagemi.

az acr build --registry $ACR_NAME --image helloacrtasks:v1 --file /path/to/Dockerfile /path/to/build/context.

Výstup příkazu az acr build je podobný následujícímu. Můžete si zobrazit nahrání zdrojového kódu („obsahu“) do Azure a podrobnosti operace docker build, kterou úloha ACR spouští v cloudu. Vzhledem k tomu, že úlohy ACR používají k sestavení imagí docker build, můžete začít okamžitě používat ACR Tasks, aniž by se vyžadovaly změny souborů Dockerfile.

Packing source code into tar file to upload...
Sending build context (4.813 KiB) to ACR...
Queued a build with build ID: da1
Waiting for build agent...
2020/11/18 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2020/11/18 18:31:42 Setting up Docker configuration...
2020/11/18 18:31:43 Successfully set up Docker configuration
2020/11/18 18:31:43 Logging in to registry: myregistry.azurecr.io
2020/11/18 18:31:55 Successfully logged in
Sending build context to Docker daemon   21.5kB
Step 1/5 : FROM node:15-alpine
15-alpine: Pulling from library/node
Digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
Status: Image is up to date for node:15-alpine
 ---> a56170f59699
Step 2/5 : COPY . /src
 ---> 88087d7e709a
Step 3/5 : RUN cd /src && npm install
 ---> Running in e80e1263ce9a
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN helloworld@1.0.0 No repository field.

up to date in 0.1s
Removing intermediate container e80e1263ce9a
 ---> 26aac291c02e
Step 4/5 : EXPOSE 80
 ---> Running in 318fb4c124ac
Removing intermediate container 318fb4c124ac
 ---> 113e157d0d5a
Step 5/5 : CMD ["node", "/src/server.js"]
 ---> Running in fe7027a11787
Removing intermediate container fe7027a11787
 ---> 20a27b90eb29
Successfully built 20a27b90eb29
Successfully tagged myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 18:32:11 Pushing image: myregistry.azurecr.io/helloacrtasks:v1, attempt 1
The push refers to repository [myregistry.azurecr.io/helloacrtasks]
6428a18b7034: Preparing
c44b9827df52: Preparing
172ed8ca5e43: Preparing
8c9992f4e5dd: Preparing
8dfad2055603: Preparing
c44b9827df52: Pushed
172ed8ca5e43: Pushed
8dfad2055603: Pushed
6428a18b7034: Pushed
8c9992f4e5dd: Pushed
v1: digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1 size: 1366
2020/11/18 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 18:32:43 Step ID acb_step_0 marked as successful (elapsed time in seconds: 15.648945)
The following dependencies were found:
- image:
    registry: myregistry.azurecr.io
    repository: helloacrtasks
    tag: v1
    digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 15-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git: {}

Run ID: da1 was successful after 1m9.970148252s

ACR Tasks zobrazí téměř na konci výstupu závislosti, které u image zjistila. ACR Tasks díky tomu může automatizovat sestavení imagí při aktualizacích základních imagí, například při aktualizaci základní image opravami operačního systému nebo architektury. Informace o podpoře aktualizací základních imagí v ACR Tasks najdete v dalších částech této série kurzů.

Nasazení do Azure Container Instances

Ve výchozím nastavení úlohy ACR automaticky vloží úspěšně sestavené image do registru a umožní vám je z registru okamžitě nasadit.

V této části vytvoříte Azure Key Vault a instanční objekt a pak pomocí přihlašovacích údajů instančního objektu nasadíte kontejner do Azure Container Instances (ACI).

Konfigurace ověřování registru

Veškeré produkční scénáře by měly pro přístup k registru kontejneru Azure používat instanční objekty. Instanční objekty vám umožní poskytnout řízení přístupu k vašim imagím kontejnerů na základě role. Můžete například nakonfigurovat instanční objekt s přístupem k registru pouze ke čtení.

Vytvořte trezor klíčů.

Pokud ještě nemáte trezor ve službě Azure Key Vault, vytvořte si ho v Azure CLI pomocí následujících příkazů.

AKV_NAME=$ACR_NAME-vault

az keyvault create --resource-group $RES_GROUP --name $AKV_NAME

Vytvoření instančního objektu a uložení přihlašovacích údajů

Teď je potřeba vytvořit instanční objekt a uložit jeho přihlašovací údaje do trezoru klíčů.

Pomocí příkazu az ad sp create-for-rbac vytvořte instanční objekt a pomocí příkazu az keyvault secret set uložte heslo instančního objektu do trezoru. Pro tyto příkazy použijte Azure CLI verze 2.25.0 nebo novější:

# Create service principal, store its password in AKV (the registry *password*)
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp create-for-rbac \
                --name $ACR_NAME-pull \
                --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
                --role acrpull \
                --query password \
                --output tsv)

Argument --role v předchozím příkazu nakonfiguruje instanční objekt s rolí acrpull , která mu udělí přístup k registru jen pro čtení. Pokud chcete udělit přístup pro nasdílení změn i vyžádání změn, změňte --role argument na acrpush.

V dalším kroku uložte appId instančního objektu v trezoru. Jedná se o uživatelské jméno, které předáte službě Azure Container Registry pro ověření:

# Store service principal ID in AKV (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp list --display-name $ACR_NAME-pull --query [].appId --output tsv)

Vytvořili jste Azure Key Vault a uložili jste do něj dva tajné kódy:

  • $ACR_NAME-pull-usr: ID instančního objektu, které se bude používat jako uživatelské jméno registru kontejneru.
  • $ACR_NAME-pull-pwd: heslo instančního objektu, které se bude používat jako heslo registru kontejneru.

Teď můžete na tyto tajné kódy odkazovat názvem, když vy nebo vaše aplikace a služby budou načítat image z tohoto registru.

Nasazení kontejneru pomocí Azure CLI

Když teď jsou přihlašovací údaje instančního objektu uložené jako tajné kódy služby Azure Key Vault, mohou je vaše aplikace a služby používat pro přístup k vašemu privátnímu registru.

Spuštěním následujícího příkazu az container create nasaďte instanci kontejneru. Příkaz používá k ověření u registru kontejneru přihlašovací údaje instančního objektu uložené ve službě Azure Key Vault.

az container create \
    --resource-group $RES_GROUP \
    --name acr-tasks \
    --image $ACR_NAME.azurecr.io/helloacrtasks:v1 \
    --registry-login-server $ACR_NAME.azurecr.io \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label acr-tasks-$ACR_NAME \
    --query "{FQDN:ipAddress.fqdn}" \
    --output table

Hodnota --dns-name-label musí být v Azure jedinečná, proto předchozí příkaz připojí název registru kontejneru k popisku názvu DNS kontejneru. Výstup příkazu zobrazí plně kvalifikovaný název domény kontejneru, například:

FQDN
----------------------------------------------
acr-tasks-myregistry.eastus.azurecontainer.io

Poznamenejte si tento plně kvalifikovaný název domény kontejneru, použijete ho v další části.

Ověření nasazení

Pokud chcete sledovat proces spuštění kontejneru, použijte příkaz az container attach:

az container attach --resource-group $RES_GROUP --name acr-tasks

Výstup az container attach nejprve zobrazí stav kontejneru, který načítá image a spustí se, a pak vytvoří vazbu STDOUT a STDERR místní konzoly s kontejnerem.

Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2020-11-18 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Started container

Start streaming logs:
Server running at http://localhost:80

Když se zobrazí Server running at http://localhost:80, přejděte v prohlížeči na plně kvalifikovaný název domény kontejneru a zobrazte spuštěnou aplikaci. Plně kvalifikovaný název domény by se měl zobrazit ve výstupu příkazu az container create, který jste spustili v předchozí části.

Ukázková aplikace spuštěná v prohlížeči

Pokud chcete konzolu od kontejneru odpojit, stiskněte Control+C.

Vyčištění prostředků

Instanci kontejneru zastavte pomocí příkazu az container delete:

az container delete --resource-group $RES_GROUP --name acr-tasks

Pokud chcete odebrat všechny prostředky, které jste v tomto kurzu vytvořili, včetně registru kontejneru, trezoru klíčů a instančního objektu, použijte následující příkazy: Tyto prostředky se ale používají v dalším kurzu série. Pokud tedy přejdete přímo k dalšímu kurzu, můžete si je chtít nechat.

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

Další kroky

Teď, když jste pomocí rychlé úlohy otestovali vnitřní smyčku, můžete nakonfigurovat úlohu sestavení, která aktivuje sestavení imagí kontejnerů při potvrzení zdrojového kódu do úložiště Git: