Delen via


Zelfstudie: Containerafbeeldingen bouwen en implementeren in de cloud met Azure Container Registry-taken

ACR Tasks is een suite met functies in Azure Container Registry die gestroomlijnde en efficiënte builds van Docker-containerinstallatiekopieën mogelijk maakt in Azure. In dit artikel leert u hoe u de functie quick task van ACR Tasks gebruikt.

De ontwikkelingscyclus voor de 'inner loop' is het iteratieve proces van het schrijven van code, en het bouwen en testen van uw toepassing voordat u deze commit naar versiebeheer. Met een quick task breidt u de 'binnenste lus' van uw ontwikkeling uit naar de cloud, zodat u beschikt over succesvalidatie van builds en het automatisch pushen van met succes samengestelde installatiekopieën naar uw containerregister. Uw afbeeldingen worden native opgebouwd in de cloud, dicht bij het register, wat een snellere implementatie mogelijk maakt.

Al uw Dockerfile-expertise is direct overdraagbaar naar ACR Tasks. U hoeft uw Dockerfiles niet te wijzigen om in de cloud te bouwen met ACR Tasks, alleen de opdracht die u uitvoert.

In deze zelfstudie, deel één van een reeks:

  • De broncode van een voorbeeldtoepassing ophalen
  • Een containerafbeelding maken in Azure
  • Een container implementeren in Azure Container Instances

In de volgende zelfstudies leert u hoe u ACR Tasks gebruikt voor het automatisch bouwen van containerimages bij het indienen van code en updates van basisimages. Met ACR-taken kunnen ook taken bestaande uit meerdere stappen worden uitgevoerd. Hierbij wordt een YAML-bestand gebruikt om de stappen voor het bouwen, pushen en optioneel testen van meerdere containers te definiëren.

Vereisten

GitHub-account

Maak een account op https://github.com als u er nog geen hebt. In deze tutorialreeks wordt een GitHub-opslagplaats gebruikt om geautomatiseerde image builds in ACR Tasks te demonstreren.

Fork van voorbeeldopslagplaats

Gebruik vervolgens de GitHub UI om de voorbeeldopslagplaats te splitsen naar uw GitHub-account. In deze handleiding maak je een containerimage van de bron in de repository. In de volgende handleiding push je een commit naar je fork van de repository om een geautomatiseerde taak te starten.

Deze opslagplaats forken: https://github.com/Azure-Samples/acr-build-helloworld-node

Schermafbeelding van de knop Fork (gemarkeerd) in GitHub

Je fork klonen

Zodra u de repository hebt geforked, kloont u uw fork en opent u de map die uw lokale kloon bevat.

Kloon de opslagplaats met git, vervang <your-github-username> door uw GitHub-gebruikersnaam:

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

Geef de map op waarin de broncode zich bevindt:

cd acr-build-helloworld-node

Bash-shell

De opdrachten in deze zelfstudiereeks zijn geformatteerd voor de Bash-shell. Als u liever PowerShell, de opdrachtprompt of een andere shell wilt gebruiken, moet u wellicht de regelvoortzetting en indeling van de omgevingsvariabele overeenkomstig aanpassen.

De omgeving voorbereiden op de Azure CLI

Bouwen in Azure met ACR Tasks

Nu u de broncode hebt opgehaald naar uw computer, volgt u deze stappen om een containerregister te maken en de containerinstallatiekopie te bouwen met ACR Tasks.

Om het uitvoeren van de voorbeeldopdrachten eenvoudiger te maken, worden in de zelfstudies in deze serie shell-omgevingsvariabelen gebruikt. Voer de volgende opdracht uit om de variabele ACR_NAME in te stellen. Vervang <registry-name> door een unieke naam voor uw nieuwe containerregister. De registernaam moet uniek zijn binnen Azure, mag alleen uit kleine letters bestaan, en moet 5 tot 50 alfanumerieke tekens bevatten. De andere resources die u in de zelfstudie maakt, zijn gebaseerd op deze naam, dus u hoeft alleen deze eerste variabele te wijzigen.

ACR_NAME=<registry-name>

Nu de omgevingsvariabele van de containerregister is ingevuld, kunt u de rest van de opdrachten in de zelfstudie kopiëren en plakken zonder waarden te bewerken. Voer de volgende opdrachten uit om een resourcegroep en containerregister te maken.

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

Nu u een register heeft, kunt u ACR Tasks gebruiken om een containerafbeelding te maken van de voorbeeldcode. Voer de opdracht az acr build uit om een snelle taak uit te voeren.

Notitie

De Dockerfile die in het volgende voorbeeld wordt gebruikt, is afhankelijk van een openbare basiscontainerimage van Docker Hub. Om de betrouwbaarheid te verbeteren bij het gebruik van openbare inhoud, importeert en beheert u de installatiekopieën in een persoonlijk Azure-containerregister en werkt u uw Dockerfile bij om uw privé beheerde basisinstallatiekopieën te gebruiken. Meer informatie over het werken met openbare afbeeldingen.

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

De uitvoer van de opdracht az acr build is vergelijkbaar met de volgende. U ziet het uploaden van de broncode (de 'context') naar Azure en de details van de docker build-bewerking die ACR Tasks uitvoert in de cloud. Omdat ACR-taken docker build gebruiken om uw images te bouwen, hoeven er geen wijzigingen te worden aangebracht in uw Dockerfiles om ACR-taken direct te kunnen gebruiken.

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

Bijna aan het einde van de uitvoer geeft ACR Tasks de afhankelijkheden weer die het heeft ontdekt voor uw image. ACR Tasks stelt in staat om de opbouw van installatiekopieën te automatiseren bij updates van basisinstallatiekopieën, bijvoorbeeld wanneer een basisinstallatiekopie wordt bijgewerkt met OS- en frameworkpatches. Later in deze zelfstudiereeks leer je meer over de ondersteuning van ACR Tasks voor updates van basisafbeeldingen.

Implementeren naar Azure Container Instances

ACR Tasks pusht met succes samengestelde installatiekopieën standaard naar het register, zodat u ze onmiddellijk vanuit het register kunt implementeren.

In deze sectie maakt u een Azure Key Vault en service-principal. Vervolgens implementeert u de container naar Azure Container Instances (ACI) met de referenties van de service-principal.

Registerverificatie configureren

Alle productiescenario's moeten service-principals gebruiken voor toegang tot een Azure-containerregister. Serviceprincipals maken het mogelijk om rolgebaseerde toegangscontrole te bieden aan uw containerafbeeldingen. U kunt bijvoorbeeld een service-principal configureren met alleen pull-toegang tot een register.

Maak een sleutelkluis.

Als u nog geen kluis hebt in Azure Key Vault, kunt u met de volgende opdrachten één maken met de Azure CLI.

AKV_NAME=$ACR_NAME-vault

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

Een service-principal maken en referenties opslaan

U moet nu een service-principal maken en de referenties ervan opslaan in uw sleutelkluis.

Gebruik de opdracht az ad sp create-for-rbac om de service-principal te maken en opdracht az keyvault secret set om het wachtwoord van de service-principal op te slaan in de kluis. Gebruik Azure CLI versie 2.25.0 of hoger voor deze opdrachten:

De juiste rol die moet worden gebruikt in de roltoewijzing, is afhankelijk van of het register al dan niet is ingeschakeld voor ABAC.

# Create service principal, store its password in AKV (the registry *password*)
ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
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 "$ROLE" \
                --query password \
                --output tsv)

Het --role argument in de voorgaande opdracht configureert de service-principal met een ingebouwde rol om deze alleen-pull-toegang tot het register te verlenen. De juiste rol die moet worden gebruikt in de roltoewijzing, is afhankelijk van of het register al dan niet is ingeschakeld voor ABAC, waarbij abAC-registers de Container Registry Repository Reader rol en niet-ABAC-registers nodig hebben die de AcrPull rol nodig hebben.

Als u zowel push- als pull-toegang wilt verlenen, wijzigt u het --role argument in de Container Registry Repository Writer rol voor registers waarvoor ABAC is ingeschakeld of de AcrPush rol voor niet-ABAC-registers.

Voor meer informatie over Microsoft Entra ABAC, zie Microsoft Entra-machtigingen voor opslagplaatsen.

Vervolgens slaat u de appId van de service-principal op in de kluis. Deze ID is de gebruikersnaam die u voor verificatie doorgeeft aan Azure Container Registry:

# 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)

U hebt een Azure Key Vault gemaakt en er twee geheimen in opgeslagen:

  • $ACR_NAME-pull-usr: de service principal-ID, voor gebruik als de gebruikersnaam van het containerregister.
  • $ACR_NAME-pull-pwd: het service principal-wachtwoord, voor gebruik als het wachtwoord van het containerregister.

U kunt nu op naam naar deze geheimen verwijzen wanneer u of uw toepassingen en services afbeeldingen uit de registry halen.

Een container implementeren met Azure CLI

Nu de referenties voor de service-principal zijn opgeslagen als Azure Key Vault-sleutels, kunnen uw toepassingen en services deze gebruiken voor toegang tot uw privéregister.

Voer het volgende commando az container create uit om een containerinstantie uit te rollen. De opdracht maakt gebruik van de referenties van de service-principal die zijn opgeslagen in Azure Key Vault om uw containerregister te verifiëren.

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

De waarde --dns-name-label moet uniek zijn binnen Azure, dus de voorgaande opdracht voegt de naam van uw containerregister toe aan het label van de DNS-naam van de container. De uitvoer van de opdracht geeft bijvoorbeeld de Fully Qualified Domain Name (FQDN) van de container weer:

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

Let op de FQDN van de container; u gaat deze gebruiken in de volgende sectie.

De implementatie controleren

Als u de opstartprocedure van de container wilt bekijken, gebruikt u de opdracht az container attach:

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

De az container attach-uitvoer geeft eerst de status van de container weer terwijl de afbeelding wordt opgehaald en gestart, en verbindt vervolgens de STDOUT en STDERR van je lokale console met die van de container.

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

Wanneer Server running at http://localhost:80 wordt weergegeven, gaat u naar de FQDN van de container in de browser om de actieve toepassing weer te geven. De FQDN had moeten verschijnen in de uitvoer van de opdracht az container create die u in de vorige sectie hebt uitgevoerd.

Voorbeeldtoepassing die wordt uitgevoerd in browser

Als u de console wilt loskoppelen van de container, klikt u op Control+C.

Middelen opschonen

Stop de containerinstantie met de opdracht az container delete:

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

Als u alle resources wilt verwijderen die u in deze zelfstudie hebt gemaakt, met inbegrip van het containerregister, de sleutelkluis en de service-principal, geeft u de volgende opdrachten. Deze resources worden echter gebruikt in de volgende zelfstudie in de reeks. U kunt ze dus bewaren als u direct verdergaat met de volgende zelfstudie.

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

Volgende stappen

Nu u de binnenste lus hebt getest met een quick task, configureert u een build-taak om containerinstallatiekopieën te activeren wanneer u broncode doorvoert naar een Git-opslagplaats: