Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 11 Min.

ACR optimal nutzen

Die Azure Container Registry dient als elementares Bindeglied in containerbasierten ­Anwendungen – in AKS wie auch in eigens betriebenen Kubernetes-Umgebungen.
Azure Container Registry (kurz ACR) ist ein verwalteter Dienst, der von Microsoft selbst in Azure angeboten und betrieben wird. ACR ist eine Implementierung der Docker Registry 2.0 und erlaubt es Anwendern, Docker-Images und andere Artefakte zentral zu verwalten. Im Vergleich zu anderen Anbietern besticht die Microsoft-Implementierung durch eine nahtlose Integration in andere Azure-Dienste, leichte Administration und einfache Absicherung durch das Azure Active Directory (AAD).ACR wird in drei unterschiedlichen Ausprägungen angeboten: Basic, Standard und Premium. In Tabelle 1 finden Sie die Unterschiede der jeweiligen Editionen und deren monatliche Preise (exemplarisch für die Azure-Region Westeuropa). Natürlich müssen Sie beim Erstellen einer ACR eine entsprechende Edition auswählen, allerdings können Sie die gewählte Edition jederzeit wechseln.

Tabelle 1 – ACR-Editionen im Vergleich

Kennzahl / Edition Basic Standard Premium
Speicherplatz 10 GiB* 100 GiB* 500 GiB*
Operationen pro Minute Lesen / Schreiben 1000 / 100 3000 / 500 10 000 / 2000
Webhooks 2 10 100
Geo-Replikation Nein Nein Ja
Bandbreite Download / Upload 30 MBps / 10 MBps 60 MBps / 20 MBps 100 MBps / 50 MBps
Preis pro Monat 4,31 Euro 16,86 Euro 42,16 Euro
Die in Tabelle 1 dargestellten Angaben zum Speicherplatz stellen keine harten Limits dar. Sollten Sie in der Praxis mehr Speicherplatz konsumieren, als im jeweiligen Tarif inbegriffen ist, so wird dieser individuell nach Verbrauch abgerechnet. Falls Sie Container Build (siehe weiter unten im Artikel) verwenden, wird die hierbei verbrauchte CPU-Zeit zusätzlich abgerechnet, sofern Sie mehr als die im monatlichen Preis inbegriffenen 100 Freiminuten in Anspruch nehmen. Die hierbei anfallenden Preise und konkrete Preise für den Betrieb von ACR in anderen Azure-Regionen können Sie der offiziellen Webseite unter [1] entnehmen.Eine neue Azure Container Registry lässt sich über viele unterschiedliche Wege erstellen. Sofern Sie noch keine oder lediglich wenig Erfahrung im Umgang mit Microsoft Azure haben, können Sie das Azure Portal verwenden. Etwas flexib­ler und mächtiger sind jedoch Tools wie das Azure CLI oder das Azure PowerShell Module. In diesem Artikel werden sämtliche Automatisierungen in Azure unter Verwendung des Azure CLI in PowerShell Core 6 durchgeführt. Wie Sie das Azure CLI unter Windows installieren und zur Verwendung vorbereiten, lesen Sie im Kasten Azure-CLI-Installation unter Windows.

Azure-CLI-Installation unter Windows

Das Azure Command Line Interface (kurz Azure CLI) kann auf unterschiedlichen Betriebssystemen wie Windows, Linux oder macOS betrieben werden und stellt eine effiziente Kommunikationsschnittstelle zu Microsoft Azure dar. Sie können das Azure CLI unter Windows entweder über den MSI Installer [5] oder über ein kleines PowerShell-Skript installieren:
In vielen Umgebungen stellt die ACR einen zentralen Dienst dar, der von vielen unterschiedlichen Konsumenten verwendet wird, um Docker-Images herunterzuladen, damit Anwendungen betrieben werden können. Daher empfiehlt Microsoft in einer Sammlung von Best Practices zur ACR, den Dienst in einer dedizierten Azure Resource Group zu betreiben. Das Skript in Listing 1 erstellt entsprechend zunächst eine neue Azure Resource Group, bevor in dieser eine neue ACR in der Standard Edition angelegt wird. Sollten Sie sich für die Premium Edition von ACR entscheiden, können Sie dem Kommando az acr create auch den Namen eines eigenen Azure-Storage-Accounts übergeben, wodurch Sie individuell steuern können, wo sich der Datenspeicher Ihrer ACR befinden soll.
Listing 1: Azure Resource Group und ACR anlegen
$ACR_NAME = <span class="hljs-string">"dotnetpro2020"</span> <br/>$RG_NAME = <span class="hljs-string">"dotnetpro"</span> <br/><br/># Dedizierte Resource Group anlegen für die ACR <br/>az <span class="hljs-keyword">group</span> create --name $RG_NAME --location <br/>  westeurope <br/><br/># Eine neue ACR-Instanz erstellen <br/>az acr create --name $ACR_NAME --resource-<span class="hljs-keyword">group</span> <br/>  $RG_NAME --location westeurope --sku Standard <br/>  --admin-enabled false  

Der ACR-Admin-Account

Beim Erstellen der ACR können Sie bestimmen, ob Sie den administrativen Account aktiveren möchten oder nicht. Zu Test- und Demonstrationszwecken stellt der dedizierte Administrator-Account die einfachste Möglichkeit dar, um sich an der ACR zu authentifizieren. In Produktionsumgebungen sollten Sie den administrativen Account allerdings immer deaktivieren und stattdessen die Authentifizierung über einen separaten Service Principal (SP) oder eine Managed Service Identity (MSI) durchführen. Um den Best Practices zur ACR zu folgen, bleibt der administrative Account im Verlauf dieses Artikels deaktiviert.

Docker-Images bereitstellen und konsumieren

Die Hauptaufgabe der Azure Container Registry ist es, Docker-Images zu verwalten. Hierzu wird eine lokale Docker-Installation benötigt. Docker Desktop steht in der kostenlosen Community Edition zur Verfügung und kann auf den Betriebssystemen Windows, macOS und Linux installiert und betrieben werden. Eine entsprechende Installationsanleitung finden Sie auf der offiziellen Docker-Webseite [2].

Wichtige ACR-Kommandos

Im Laufe des Artikels haben Sie bereits einige essenzielle Kommandos des Azure CLI für den Umgang mit der Azure Container Registry kennengelernt. Hier noch einmal einige wichtige Kommandos im Überblick:
Sobald Docker auf Ihrem System installiert ist, können Sie Docker-Images vom öffentlichen Docker Hub konsumieren und nach erfolgreicher Anmeldung mit einem Docker-Account auch dort bereitstellen. Damit die lokale Docker-Installation mit der zuvor erstellten Microsoft-ACR-Instanz genutzt werden kann, müssen Sie sich lediglich an der ACR anmelden. Hierzu können Sie das Kommando az acr login verwenden. Die verwendete Variable $ACR_NAME wurde im ersten Snippet definiert und beinhaltet den Namen der zuvor erstellten ACR-Instanz:
<span class="hljs-attribute">az</span> acr login -n <span class="hljs-variable">$ACR_NAME</span> 
Zur Anmeldung wird hierbei der im Azure CLI vorhandene SecurityContext verwendet. Nach erfolgreicher Anmeldung an der ACR können Sie Docker-Images auch dort bereitstellen und von dort konsumieren. Voraussetzung für die Bereitstellung in der ACR ist, dass die Docker-Images einem bestimmten Namensschema folgen. Als Beispiel wird in Listing 2 das offizielle NGINX-Webserver-Image vom öffentlichen Docker Hub heruntergeladen, umbenannt und abschließend auf die eigene ACR hochgeladen.
Listing 2: Docker-Image laden
# Offizielles Docker-Image von Docker Hub &lt;br/&gt;# herunterladen &lt;br/&gt;docker pull nginx:latest &lt;br/&gt;&lt;br/&gt;# Docker-Image umbenennen, um individuelles Präfix &lt;br/&gt;# sicherzustellen &lt;br/&gt;docker tag nginx:latest dotnetpro2020/nginx:&lt;span class="hljs-number"&gt;1&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;# Auflistung aller lokalen Docker-Images anzeigen &lt;br/&gt;docker images &lt;br/&gt;&lt;br/&gt;# Docker-Image auf privater ACR bereitstellen &lt;br/&gt;docker push dotnetpro2020/nginx:&lt;span class="hljs-number"&gt;1&lt;/span&gt;  
Eine Liste sämtlicher Docker-Images, die sich aktuell auf der ACR-Instanz befinden, erhalten Sie durch das Kommando az acr repository list. Alternativ können Sie an dieser Stelle das Azure Portal besuchen und die Docker-Images direkt im Portal durchsuchen. Hierzu navigieren Sie zu Ihrer ACR-Instanz und öffnen den Reiter Repositories, wie in Bild 1 gezeigt.
Docker-Imagesin der ACR(Bild 1) © Autor
Das Kommando az acr repository bietet noch mehr Möglichkeiten, um existierende Images in der ACR zu verwalten. So können Sie beispielsweise mit az acr repository delete Docker-Images löschen oder sich mit az acr repository show-tags sämtliche Tags eines Docker-Images auflisten lassen. Eine Auflistung aller Kommandos zur Administration von Docker-Images in ACR erhalten Sie mit az acr repository --help.

ACR in AKS nutzen

Falls Sie den Azure Kubernetes Service (kurz AKS) verwenden, können Sie diesen mit der ACR verbinden, um private Docker-Images von der geschützten Container Registry zu konsumieren. Die Produktteams haben im Jahr 2019 die Integration der beiden Dienste aus administrativer Sicht weiter vereinfacht. So können Sie die zu verwendende ACR entweder direkt bei der Erstellung der AKS-Instanz angeben, wie es in Listing 3 zu sehen ist. Möchten Sie eine ACR an einen bereits existierenden AKS anbinden, so realisieren Sie dies über das Kommando az aks attach-acr wie folgt:
Listing 3: ACR mit AKS verbinden
&lt;span class="hljs-variable"&gt;$AKS_NAME&lt;/span&gt; = &lt;span class="hljs-string"&gt;"dotnetpro2020"&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-variable"&gt;$ACR_NAME&lt;/span&gt; = &lt;span class="hljs-string"&gt;"dotnetpro2020"&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-variable"&gt;$AKS_RESOURCE_GROUP&lt;/span&gt; = &lt;span class="hljs-string"&gt;"dotnetpro-aks"&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;# Neue Resource Group für AKS erstellen &lt;br/&gt;az group create --name &lt;span class="hljs-variable"&gt;$AKS_RESOURCE_GROUP&lt;/span&gt; &lt;br/&gt;  --location westeurope &lt;br/&gt;&lt;br/&gt;# Id der ACR abrufen &lt;br/&gt;&lt;span class="hljs-variable"&gt;$ACR_ID&lt;/span&gt; = az acr show --name &lt;span class="hljs-variable"&gt;$ACR_NAME&lt;/span&gt; -o tsv &lt;br/&gt;  --&lt;span class="hljs-keyword"&gt;query&lt;/span&gt; id &lt;br/&gt;&lt;br/&gt;# AKS erstellen und ACR direkt damit verknüpfen &lt;br/&gt;az aks create --resource-group &lt;span class="hljs-variable"&gt;$AKS_RESOURCE_GROUP&lt;/span&gt; &lt;br/&gt;  --name &lt;span class="hljs-variable"&gt;$AKS_NAME&lt;/span&gt; --attach-acr &lt;span class="hljs-variable"&gt;$ACR_ID&lt;/span&gt; --node-&lt;span class="hljs-keyword"&gt;count&lt;/span&gt;&lt;br/&gt;  1 --enable-addons monitoring --&lt;span class="hljs-keyword"&gt;generate&lt;/span&gt;-ssh-keys  
<span class="hljs-variable">$ACR_ID</span> = az acr show --name <span class="hljs-variable">$ACR_NAME</span> -o tsv --<span class="hljs-keyword">query</span> id 
az aks <span class="hljs-keyword">update</span> --name <span class="hljs-variable">$AKS_NAME</span> --resource-group <span class="hljs-variable">$AKS_RG</span> 
  --attach-acr <span class="hljs-variable">$ACR_ID</span> 
Nachdem die ACR mit AKS verbunden wurde, können Sie in gängigen Kubernetes-Artefakten wie Pods, ReplicaSets oder Deployments auf private Images aus der ACR zugreifen. Um ein neues Deployment in AKS zu erstellen, verwenden Sie das initial erstellte NGINX-Image von der privaten ACR in folgender Weise:
kubectl <span class="hljs-keyword">create</span> <span class="hljs-keyword">namespace</span> dotnetpro1 

kubectl <span class="hljs-keyword">create</span> deployment dotnetpro --image dotnetpro
  <span class="hljs-number">2020</span>.azurecr.io/nginx:latest --<span class="hljs-keyword">namespace</span> dotnetpro1 

ACR in Kubernetes nutzen

Sie können die Azure Container Registry in jeder Kubernetes-Installation verwenden. Hierzu müssen Sie die Verbindung zur ACR innerhalb des Clusters erstellen. In Kubernetes gibt es dafür zwei unterschiedliche Wege.Die einfachste Integration lässt sich über ein Kubernetes-Secret bewerkstelligen. Hierbei werden sämtliche Informationen zur Authentifizierung an der ACR im Secret gespeichert. Dieses Secret ist anschließend in jedem Kubernetes-Objekt anzugeben, das Images von ACR herunterladen soll. Der Zugriff auf die ACR wird in den folgenden Beispielen über einen neuen Service Principal realisiert. Sie erstellen den Service Principal und berechtigen diesen auf die ACR durch:
$<span class="hljs-string">ACR_ID </span>= <span class="hljs-string">az </span><span class="hljs-string">acr </span><span class="hljs-string">show </span><span class="hljs-built_in">--name</span> <span class="hljs-string">dotnetpro2020 </span>-o <span class="hljs-string">tsv </span>
  <span class="hljs-built_in">--query</span> <span class="hljs-string">id </span>
$<span class="hljs-string">SP </span>= <span class="hljs-string">az </span><span class="hljs-string">ad </span><span class="hljs-string">sp </span><span class="hljs-built_in">create-for-rbac</span> <span class="hljs-built_in">--name</span> <span class="hljs-string">dotnetpro2020 </span>
  <span class="hljs-built_in">--skip-assignment</span> -o <span class="hljs-string">json </span>
$<span class="hljs-string">SP_ID </span>= $<span class="hljs-string">SP </span>| <span class="hljs-string">ConvertFrom-Json </span>| <span class="hljs-string">Select-Object </span><span class="hljs-string">appId </span>
$<span class="hljs-string">SP_PASSWORD </span>= $<span class="hljs-string">SP </span>| <span class="hljs-string">ConvertFrom-Json </span>| <span class="hljs-string">Select-Object </span>
  <span class="hljs-string">password </span>
<span class="hljs-string">az </span><span class="hljs-string">role </span><span class="hljs-string">assignment </span><span class="hljs-string">create </span><span class="hljs-built_in">--role</span> <span class="hljs-string">Reader </span><span class="hljs-built_in">--scope</span> $<span class="hljs-string">ACR_ID </span>
  <span class="hljs-built_in">--assignee</span> $<span class="hljs-string">SP_ID </span> 
Anschließend können Sie mit dem Befehl kubectl create namespace dotnetpro2 einen isolierten Bereich im Cluster für dieses Beispiel erstellen. Das benötigte Secret lässt sich mithilfe von kubectl erstellen und im Namespace dotnetpro2 bereitstellen.
<span class="hljs-comment">kubectl</span> <span class="hljs-comment">create</span> <span class="hljs-comment">secret</span> <span class="hljs-comment">docker</span><span class="hljs-literal">-</span><span class="hljs-comment">registry</span> <span class="hljs-comment">acr</span><span class="hljs-literal">-</span><span class="hljs-comment">secret</span> 
<span class="hljs-comment"> </span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">docker</span><span class="hljs-literal">-</span><span class="hljs-comment">username=</span>&lt;<span class="hljs-comment">Service</span> <span class="hljs-comment">Principal</span> <span class="hljs-comment">ID</span>&gt; 
<span class="hljs-comment"> </span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">docker</span><span class="hljs-literal">-</span><span class="hljs-comment">password=</span>&lt;<span class="hljs-comment">Service</span> <span class="hljs-comment">Principal</span> <span class="hljs-comment">Password</span>&gt; 
<span class="hljs-comment"> </span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">docker</span><span class="hljs-literal">-</span><span class="hljs-comment">email=</span>&lt;<span class="hljs-comment">Ihre</span> <span class="hljs-comment">Email</span> <span class="hljs-comment">Addresse</span>&gt; 
<span class="hljs-comment"> </span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">docker</span><span class="hljs-literal">-</span><span class="hljs-comment">server=dotnetpro2020</span><span class="hljs-string">.</span><span class="hljs-comment">azurecr</span><span class="hljs-string">.</span><span class="hljs-comment">io</span> 
<span class="hljs-comment"> </span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-comment">namespace</span> <span class="hljs-comment">dotnetpro2</span> 
Die Definition für einen exemplarischen Pod können Sie sich ebenfalls von kubectl erstellen lassen, allerdings müssen Sie danach die Referenz auf das Secret manuell in das Pod-Manifest einfügen:
kubectl run dotnetproweb 
  --image dotnetpro2020<span class="hljs-selector-class">.azurecr</span><span class="hljs-selector-class">.io</span>/nginx:latest  
  --port <span class="hljs-number">80</span> --restart=Never --namespace <span class="hljs-variable">$KUBE_NS</span> 
  --dry-run -o yaml &gt; dotnetpro_pod<span class="hljs-selector-class">.yml</span> 
Nachdem die Definition erstellt wurde, stellen Sie sicher, dass diese der Definition aus Listing 4 entspricht. Haben Sie die Anpassungen vorgenommen, können Sie den Pod mit kubectl apply -f dotnetpro_pod.yml in Kubernetes bereitstellen.
Listing 4: Definition für einen exemplarischen Pod
&lt;span class="hljs-string"&gt;apiVersion:&lt;/span&gt; v1 &lt;br/&gt;&lt;span class="hljs-string"&gt;kind:&lt;/span&gt; Pod &lt;br/&gt;&lt;span class="hljs-string"&gt;metadata:&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-string"&gt;creationTimestamp:&lt;/span&gt; &lt;span class="hljs-literal"&gt;null&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-string"&gt;labels:&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-string"&gt;run:&lt;/span&gt; dotnetproweb &lt;br/&gt;  &lt;span class="hljs-string"&gt;name:&lt;/span&gt; dotnetproweb &lt;br/&gt;  &lt;span class="hljs-string"&gt;namespace:&lt;/span&gt; dotnetpro2 &lt;br/&gt;&lt;span class="hljs-string"&gt;spec:&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-string"&gt;containers:&lt;/span&gt; &lt;br/&gt;    - &lt;span class="hljs-string"&gt;image:&lt;/span&gt; dotnetpro2020.azurecr.io/&lt;span class="hljs-string"&gt;nginx:&lt;/span&gt;latest &lt;br/&gt;      &lt;span class="hljs-string"&gt;name:&lt;/span&gt; dotnetproweb &lt;br/&gt;      &lt;span class="hljs-string"&gt;ports:&lt;/span&gt; &lt;br/&gt;        - &lt;span class="hljs-string"&gt;containerPort:&lt;/span&gt; &lt;span class="hljs-number"&gt;80&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-string"&gt;resources:&lt;/span&gt; {} &lt;br/&gt;  &lt;span class="hljs-string"&gt;dnsPolicy:&lt;/span&gt; ClusterFirst &lt;br/&gt;  &lt;span class="hljs-string"&gt;restartPolicy:&lt;/span&gt; Never &lt;br/&gt;  &lt;span class="hljs-string"&gt;imagePullSecrets:&lt;/span&gt; &lt;br/&gt;    - &lt;span class="hljs-string"&gt;name:&lt;/span&gt; acr-secret &lt;br/&gt;&lt;span class="hljs-string"&gt;status:&lt;/span&gt; {}  
Alternativ dazu bewerkstelligen Sie die Verbindung zwischen ACR und Kubernetes durch eine Kombination aus Service-Account und Secret. Anstatt das Image-Pull-Secret auf den Pods oder Deployments anzugeben, können Sie einen Service-Account dazwischenschalten und diesem Account das Image-Pull-Secret zuweisen. Sämtliche Pods, die diesen Service-Account verwenden, sind somit in der Lage, automatisch Docker-Images von der ACR anhand der im Secret gespeicherten Authentifizierungsinformationen zu laden.Listing 5 zeigt die Definition eines Namespace, des Secrets, des Service-Accounts und eines Pods, der den Service-Account verwendet. Sie können sämtliche Artefakte über das Kommando kubectl apply -f all-in-one.yml in Kubernetes bereitstellen.
Listing 5: Weitere Definitionen
&lt;span class="hljs-attribute"&gt;apiVersion&lt;/span&gt;: v1 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;kind&lt;/span&gt;: Namespace &lt;br/&gt;&lt;span class="hljs-attribute"&gt;metadata&lt;/span&gt;: &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;name&lt;/span&gt;: dotnetpro3 &lt;br/&gt;--- &lt;br/&gt;&lt;span class="hljs-attribute"&gt;apiVersion&lt;/span&gt;: v1 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;data&lt;/span&gt;: &lt;br/&gt;  .&lt;span class="hljs-attribute"&gt;dockerconfigjson&lt;/span&gt;: eyJhdXRocyI6eyJ0aGhkZXYuYXp1cm&lt;br/&gt;    Vjci5pbyI6eyJ1c2VybmFtZSI6IjE4Y2Y2NWM0LTIxYzItN&lt;br/&gt;    GQ3MS04MDVkLWI1Mzg4MzI5NGI5MyIsInBhc3N3b3JkIjoi&lt;br/&gt;    YWUxNDBhZGUtYTVhNy00NzM1LWIwNDAtNThkMDY4YzcwNmQ&lt;br/&gt;    &lt;span class="hljs-number"&gt;2&lt;/span&gt;IiwiZW1haWwiOiJ0aG9yc3Rlbi5oYW5zQG91dGxvb2suY2&lt;br/&gt;    &lt;span class="hljs-number"&gt;9&lt;/span&gt;tIiwiYXV0aCI6Ik1UaGpaalkxWXpRdE1qRmpNaTAwWkRje&lt;br/&gt;    ExUZ3dOV1F0WWpVek9EZ3pNamswWWprek9tRmxNVFF3WVdS&lt;br/&gt;    bExXRTFZVGN0TkRjek5TMWlNRFF3TFRVNFpEQTJPR00zTUR&lt;br/&gt;    aa05nPT0ifX19 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;kind&lt;/span&gt;: Secret &lt;br/&gt;&lt;span class="hljs-attribute"&gt;metadata&lt;/span&gt;: &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;name&lt;/span&gt;: acr-secret &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;namespace&lt;/span&gt;: dotnetpro3 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;type&lt;/span&gt;: kubernetes.io/dockerconfigjson &lt;br/&gt;--- &lt;br/&gt;&lt;span class="hljs-attribute"&gt;apiVersion&lt;/span&gt;: v1 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;kind&lt;/span&gt;: ServiceAccount &lt;br/&gt;&lt;span class="hljs-attribute"&gt;metadata&lt;/span&gt;: &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;name&lt;/span&gt;: sadotnetpro &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;namespace&lt;/span&gt;: dotnetpro3 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;imagePullSecrets&lt;/span&gt;: &lt;br/&gt;  - &lt;span class="hljs-attribute"&gt;name&lt;/span&gt;: acr-secret &lt;br/&gt;--- &lt;br/&gt;&lt;span class="hljs-attribute"&gt;apiVersion&lt;/span&gt;: v1 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;kind&lt;/span&gt;: Pod &lt;br/&gt;&lt;span class="hljs-attribute"&gt;metadata&lt;/span&gt;: &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;labels&lt;/span&gt;: &lt;br/&gt;    &lt;span class="hljs-attribute"&gt;run&lt;/span&gt;: dotnetproweb &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;name&lt;/span&gt;: dotnetproweb &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;namespace&lt;/span&gt;: dotnetpro3 &lt;br/&gt;&lt;span class="hljs-attribute"&gt;spec&lt;/span&gt;: &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;serviceAccountName&lt;/span&gt;: sadotnetpro &lt;br/&gt;  &lt;span class="hljs-attribute"&gt;containers&lt;/span&gt;: &lt;br/&gt;    - &lt;span class="hljs-attribute"&gt;image&lt;/span&gt;: dotnetpro2020.azurecr.io/&lt;span class="hljs-attribute"&gt;nginx&lt;/span&gt;:latest &lt;br/&gt;      &lt;span class="hljs-attribute"&gt;name&lt;/span&gt;: dotnetproweb &lt;br/&gt;      &lt;span class="hljs-attribute"&gt;ports&lt;/span&gt;: &lt;br/&gt;        - &lt;span class="hljs-attribute"&gt;containerPort&lt;/span&gt;: &lt;span class="hljs-number"&gt;80&lt;/span&gt;  

Container Build – lagern Sie das Erstellen von Docker-Images aus

Falls Sie keine lokale Docker-Installation haben oder wenn Sie das Erstellen der Docker-Images an die ACR auslagern möchten, können Sie ACR Container Build verwenden. In der einfachsten Form laden Sie den notwendigen Quellcode hierzu in die ACR hoch und instruieren diese, ein Docker-Image zu erstellen.Listing 6 zeigt exemplarisch das Erstellen eines kleinen neuen Projekts: Ein Dockerfile wird von GitHub in das neue Projektverzeichnis heruntergeladen und durch az acr build in der ACR-Instanz in ein Docker-Image verwandelt. Abschließend wird das Docker-Image auf das lokale System heruntergeladen und durch docker run einmalig ausgeführt.
Listing 6: Neues Projekt erstellen
$PROJECT_FOLDER = ".\container-build" &lt;br/&gt;If(!(test-path $PROJECT_FOLDER)) &lt;br/&gt;{ &lt;br/&gt;  New-Item -ItemType Directory -Force -Path &lt;br/&gt;    $PROJECT_FOLDER &lt;br/&gt;} &lt;br/&gt;cd $PROJECT_FOLDER &lt;br/&gt;&lt;br/&gt;Invoke-WebRequest -Uri https://raw.githubusercontent&lt;br/&gt;  .com/ThorstenHans/acr-samples/master/&lt;br/&gt;  containerbuild/Dockerfile -OutFile Dockerfile &lt;br/&gt;&lt;br/&gt;az acr build --registry dotnetpro2020 --image &lt;br/&gt;  dotnetpro2020.azurecr.io/cowsay:1 . &lt;br/&gt;&lt;br/&gt;docker pull dotnetpro2020.azurecr.io/cowsay:1 &lt;br/&gt;&lt;br/&gt;docker run dotnetpro2020.azurecr.io/cowsay:1  
Bitte beachten Sie, dass Container Build auf Sekunden­basis abgerechnet wird, daher sollten Sie die hierbei anfallenden Kosten in Ihre Kostenplanung aufnehmen, um transparent planen zu können, welche Kosten durch die Verwendung der ACR pro Monat anfallen können.

Container Build mithilfe von ACR-Tasks ­automatisieren

Mit ACR-Tasks ist es möglich, den zuvor kennengelernten Container Build zu automatisieren. Hierbei kann das Erstellen des Docker-Images von unterschiedlichen Quellen ausgelöst werden. So können Sie beispielsweise eine neue Version Ihres Images erstellen lassen, sobald
  • ein neues Commit in einem Git-Repository bereitgestellt wurde,
  • ein Basis-Docker-Image in einer neuen Version bereitgestellt wurde,
  • ein zeitliches Intervall eingetreten ist (beispielsweise jede Nacht um 3:00 Uhr),
  • eine externe Quelle ein Ereignis ausgelöst hat (Webhook).
Exemplarisch möchte ich mit Ihnen einen Nightly Build für das NGINX-Image konfigurieren, der jede Nacht um 4:00 Uhr eine neue Version des Docker-Images erstellt und in der ACR persistiert:
az acr task create --image dotnetpro2020.azurecr.io/cowsay:nightly-{{.Run.ID}} 
  --name nightly-image-build --registry dotnetpro2020 
  --schedule "0 4 * * *" --file Dockerfile 
  –-base-image-trigger-enabled false 
  --commit-trigger-enabled false 
  --context https://github.com/ThorstenHans/acr-samples.
    git#master:containerbuild 
Nachdem der Task in der ACR erstellt wurde, können Sie diesen auch direkt manuell ausführen, um sicherzustellen, dass die Konfiguration Ihren Ansprüchen entspricht und das erwartete Resultat liefert. Hierzu verwenden Sie das folgende Kommando:
az acr task run --name nightly-image-build --registry 
  dotnetpro2020 
Sie können auch die gesamte Historie eines ACR-Tasks auflisten lassen. Mit az acr task list-runs erhalten Sie eine Liste sämtlicher Ausführungen eines bestimmten ACR-Tasks.
az acr task list-runs --name nightly-image-build 
  --registry dotnetpro2020 --output table 
Schlussendlich können Sie einen ACR-Task wieder löschen, indem Sie das Kommando az acr task delete verwenden.

Integrationen mit ACR-Webhooks

Durch ACR-Webhooks lassen sich externe Systeme ansteuern, sobald Ereignisse in der ACR auftreten. Diesen Mechanismus können Sie beispielsweise verwenden, um Continuous Deployment (kurz CD) mit Azure DevOps zu realisieren oder um Integration in kollaborativen Tools wie Microsoft Teams oder Slack abzubilden.Die Integrationsmöglichkeiten mit ACR-Webhooks sind nahezu unbegrenzt: Möchten Sie auf neu bereitgestellten Docker-Images ein eigenes System benachrichtigen? Dies können Sie einfach realisieren, indem Sie einen Webhook für eine individuelle Azure Function registrieren.
az acr webhook create --registry dotnetpro2020 
  --name dotnetprowebhook 
  --actions push 
  --uri https://dotnetproacrwebhook.azurewebsites.net/
    api/IncomingWebhook 
Zur Veranschaulichung werden Sie einen neuen Webhook registrieren, der eine bereits bereitgestellte Azure Function aufruft, sobald eine neue Version des NGINX-Docker-Images in der ACR bereitgestellt wird. Den Quellcode der Azure Functions finden Sie unter [3].Sie können den Webhook auch testen: Öffnen Sie hierzu das Azure Portal und navigieren Sie zu Ihrer ACR-Instanz. In der Registerkarte Webhooks finden Sie sämtliche bestehenden Webhooks. Wählen Sie den zuvor erstellten Webhook aus und betätigen Sie die Ping-Schaltfläche. Sie sollten nun den HTTP-Antwortcode 200 in der korrespondierenden Spalte sehen. Alternativ können Sie den Webhook triggern, indem Sie eine neue Version des NGINX-Docker-Images bereitstellen:
docker tag dotnetpro2020.azurecr.io/nginx:1  
  dotnetpro2020.azurecr.io/nginx:2 
docker push dotnetpro2020.azurecr.io/nginx:2 
Nachdem der Push-Vorgang abgeschlossen ist, öffnen Sie die Adresse https://dotnetproacrwebhook.azurewebsites.net/api /listinvocations im Browser und betrachten die daraus resultierenden Ergebnisse.Existierende Webhooks können Sie über das Azure CLI löschen. Um den zuvor erstellten Webhook wieder zu entfernen, führen Sie das folgende Kommando aus:
az acr webhook delete --name dotnetprowebhook --registry 
  dotnetpro2020 
Bei ACR-Webhooks sollten Sie beachten, dass je nach gewählter ACR-Edition nur eine bestimmte Anzahl von Webhooks zur Verfügung steht.

ACR-Metriken in Azure Monitor

Eines der neueren Features ist die Integration von Diagnose- und Zugriffslogs in Azure Log Analytics und somit Azure Monitor [4]. Das Feature befand sich November 2019 noch im Preview-Status, kann allerdings auf jeder ACR-Instanz (unabhängig von der gewählten Edition) konfiguriert werden. Mit der Integration in Azure Monitor erhalten Sie essenzielle Einblicke in die Verwendung der ACR an zentraler Stelle.Um die Integration zu konfigurieren, benötigen Sie einen Log Analytics Workspace. Sollten Sie noch keinen Workspace haben, können Sie einen neuen Workspace mit dem folgenden Kommando erstellen:
Invoke-WebRequest -Uri 
  https://raw.githubusercontent.com/
  ThorstenHans/acr-samples/master/azure-
  monitor-integration/log-analytics-workspace-
  definition.json -OutFile 
  dotnetproworkspace.json 
az group deployment create --resource-group 
  dotnetpro --template-file 
  dotnetproworkspace.json 
Im ersten Schritt wird das Deployment-Manifest von GitHub durch das PowerShell-Cmdlet Invoke-WebRequest heruntergeladen, anschließend wird das Deployment für den Log Analytics Workspace über das Azure CLI angestoßen.Die Integration zwischen ACR und dem Log Analytics Workspace lässt sich natürlich auch über das Azure CLI konfigurieren. Zur einfacheren Veranschaulichung wird die Definition der Diagnoseeinstellungen hier allerdings über das Azure Portal vorgenommen.Navigieren Sie hierzu im Azure Portal zu Ihrer ACR-Instanz und rufen Sie die Registerkarte Monitoring | Diagnostic settings auf (Bild 2). Hier können Sie über die Schaltfläche Add diagnostic setting die Integration konfigurieren.
ACR Diagnostic Settingsangeben(Bild 2) © Autor
Sobald entsprechende Ereignisse mindestens einmalig aufgetreten sind, stellt die ACR die folgenden Metriken bereit:
  • ContainerRegistryLoginEvents (Metriken über Authentifizierung an der ACR)
  • ContainerRegistryRepositoryEvents (Operationsmetriken wie Push und Pull von Images)
  • AzureMetrics (Aggregierte Metriken der ACR wie ACR-Task-Laufzeiten und andere)
Sie können diese Metriken in Azure Monitor durch eine ­einfache Abfrage einsehen. Bild 3 zeigt einige Metriken aus der im Laufe des Artikels verwendeten ACR-Instanz direkt in Azure Monitor.
ACR-Logsder verwendeten ACR-Instanz in Azure Monitor(Bild 3) © Autor

Fazit

Mit der Azure Container Registry bietet Microsoft einen einfachen, jedoch sehr wichtigen zentralen Dienst für containerbasierte Szenarien an.Bereits seit dem initialen Release der ACR hat Microsoft kontinuierlich neue Features in der Azure Container Regis­try hinzugefügt, um den täglichen Workflow für Softwareentwickler einfacher und effizienter zu gestalten.Im direkten Vergleich zu anderen Implementierungen des Docker-Registry-2.0-Standards besticht die ACR durch ebendiese zusätzlichen Features und darüber hinaus durch die einfache Administration mittels Azure CLI, dem Azure Power­Shell Module und dem Azure Portal. Außerdem ist die Integration in andere Azure-Dienste wie AKS oder Azure App Services problemlos möglich.
Projektdateien herunterladen

Fussnoten

  1. Azure Container Registry pricing, http://www.dotnetpro.de/SL2005ACR1
  2. Docker-Installationsanleitung, http://www.dotnetpro.de/SL2005ACR2
  3. Quellcode der Azure Functions, http://www.dotnetpro.de/SL2005ACR3
  4. Azure Monitor, http://www.dotnetpro.de/SL2005ACR4
  5. MSI Installer für Azure CLI, http://www.dotnetpro.de/SL2005ACR5

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige