Container-Images brauchen Speicher? Azure Container Registry erstellen, ein Image pushen und einen Pull prüfen

Eine Container-Registry speichert Images, damit andere Rechner und Bereitstellungsdienste sie herunterladen können. Ein Image enthält die Anwendung und ihre Abhängigkeiten; ein Container ist eine laufende Instanz dieses Images. Azure Container Registry (ACR) speichert Images – deine Anwendung wird dort nicht ausgeführt.

Stell dir vor, du entwickelst eine Anwendung auf deinem Laptop und möchtest sie auf AKS bereitstellen. Durch einen Push in die Registry kann der Cluster das Image von dort abrufen. Dieses Lab verwendet ein vorhandenes Nginx-Image. Anwendungscode oder ein Dockerfile brauchst du nicht.

Öffentliches Nginx-Image → lokales Docker → Push in deine ACR
Deine ACR → Pull in lokales Docker → Container starten

Verwende dein lokales Docker Desktop und die Azure CLI. Prüfe zunächst docker info und az version im Terminal deines Computers. Docker muss laufen und beide Befehle müssen funktionieren. Führe die folgenden Befehle im selben lokalen Bash- oder zsh-Terminal aus, nicht in Cloud Shell. Es werden keine lokalen Projektdateien erstellt.

Registry erstellen

Öffne im Azure-Portal Container registries → Create:

Subscription: CloudTrips TEST
Resource group: rg-cloudtrips-containers-test-neu (neu)
Registry name: acrctcontainersneu (muss weltweit eindeutig sein)
Location: North Europe
Pricing plan: Basic
Role assignment permissions mode: RBAC Registry Permissions
Domain name label scope: Tenant Reuse (falls angezeigt)

Falls der Name vergeben ist, wähle einen eindeutigen Namen nur aus Buchstaben und Zahlen. Lass den öffentlichen Netzwerkzugriff für das Lab aktiviert und Admin user deaktiviert. Wir melden uns mit deiner Entra-Identität an. Ein öffentlicher Netzwerkendpunkt macht die gespeicherten Images nicht anonym lesbar.

Basic reicht für dieses Push/Pull-Lab aus. Die Registry verursacht Kosten, solange sie existiert, auch ohne laufenden Container. Prüfe vor dem Erstellen den angezeigten Preis.

Wähle Review + create → Create → Go to resource. Notiere unter Overview den Login server. Dieser kann einen generierten Zusatz enthalten. Setze ihn deshalb nicht einfach aus dem Registry-Namen und .azurecr.io zusammen.

Übersicht der Azure Container Registry mit Name, Region North Europe, Tarif Basic und Login-Server.

Deinem Benutzer Image-Zugriff geben

Im gewählten Modus RBAC Registry Permissions erlaubt AcrPush sowohl Push als auch Pull. Weise unter Access control (IAM) → Add role assignment der Registry die Rolle AcrPush dem Benutzer zu, mit dem du dich in der Azure CLI anmeldest, falls er nicht bereits gleichwertigen Zugriff hat. Zum Zuweisen von Rollen brauchst du beispielsweise Owner oder Role Based Access Control Administrator im passenden Gültigkeitsbereich.

Prüfe im Zweifel Properties → Role assignment permissions mode. Falls du RBAC Registry + ABAC Repository Permissions gewählt hast, wird AcrPush nicht berücksichtigt: Verwende Container Registry Repository Writer für Push/Pull sowie Container Registry Repository Catalog Lister für die Repository-Liste, für dieses kleine Lab ohne Bedingungen. Das Registry-Administratorkonto brauchst du nicht zu aktivieren.

Auf deinem Computer anmelden

Führe Folgendes aus. Ersetze acrctcontainersneu durch deinen tatsächlichen Registry-Ressourcennamen:

az login
az account set --subscription "CloudTrips TEST"
az account show --query '{subscription:name,tenant:tenantId}' -o table

ACR_NAME="acrctcontainersneu"
ACR_SERVER=$(az acr show --name "$ACR_NAME" --query loginServer -o tsv)
printf 'Registry server: %s\n' "$ACR_SERVER"
az acr login --name "$ACR_NAME"

Wähle bei der Anmeldung das richtige Konto und den richtigen Mandanten. Der letzte Befehl sollte Login Succeeded ausgeben. az login meldet dich bei Azure an; az acr login authentifiziert Docker bei der Registry. Dafür wird der Ressourcenname benötigt, nicht der Login-Server-Hostname.

Lass dieses Terminal geöffnet: ACR_NAME und ACR_SERVER werden auch in den nächsten Befehlen verwendet. Stoppe, falls der Serverwert leer bleibt oder ein Befehl fehlschlägt. Neue Rollenzuweisungen können einige Minuten benötigen; führe anschließend az acr login erneut aus.

Image taggen und pushen

docker pull nginx:stable-alpine
docker tag nginx:stable-alpine "$ACR_SERVER/cloudtrips/nginx:v1"
docker push "$ACR_SERVER/cloudtrips/nginx:v1"

Die Befehle laden Nginx herunter, geben dem Image einen weiteren lokalen Namen mit deiner Registry-Adresse und laden es hoch. Taggen allein lädt nichts hoch und baut das Image nicht neu.

Teil der Image-Referenz Bedeutung
$ACR_SERVER Exakter Login-Server-Hostname deiner Registry
cloudtrips/nginx Repository: eine benannte Sammlung von Images
v1 Tag: eine lesbare Bezeichnung dieser Image-Version

Warte, bis docker push erfolgreich beendet ist und einen sha256-Digest ausgibt. Der Digest identifiziert den Inhalt des hochgeladenen Manifests; ein Tag kann später auf ein anderes Image zeigen. Dieses Lab kopiert die von Docker für deinen Computer geladene Plattformvariante, nicht alle Architekturen des öffentlichen Images. Auf Apple Silicon wird normalerweise arm64 gewählt, auf einem x86-64-Rechner amd64. Spätere Bereitstellungen brauchen eine dazu passende Image-Architektur.

Öffne im Portal deine Registry → Services → Repositories (oder Repositories) → cloudtrips/nginx. Prüfe, ob v1 erscheint, und öffne es, um den Digest zu sehen. Aktualisiere bei Bedarf. Das Repository entsteht beim ersten Push und muss nicht vorher manuell angelegt werden.

Repository cloudtrips/nginx in ACR mit dem Tag v1 und dem Image-Digest.

Pull prüfen und Image starten

Entferne nur die lokale ACR-Image-Referenz und lade das Image erneut:

docker image rm "$ACR_SERVER/cloudtrips/nginx:v1"
docker pull "$ACR_SERVER/cloudtrips/nginx:v1"
docker image inspect "$ACR_SERVER/cloudtrips/nginx:v1" \
  --format '{{json .RepoDigests}}'

Dadurch wird das Image nicht aus Azure gelöscht. Docker kann für Schichten Already exists melden, weil das ursprüngliche Nginx-Image dieselben Schichten verwendet. Das ist normal: Der explizite Pull kontaktiert trotzdem deine Registry, löst das entfernte Image auf und verwendet vorhandene Schichten wieder. Prüfe, dass der Pull erfolgreich endet und den Digest des Registry-Images ausgibt.

Starte das Image nun über seine ACR-Adresse:

docker run -d --name ct-acr-web \
  -p 127.0.0.1:8082:80 \
  "$ACR_SERVER/cloudtrips/nginx:v1"

curl -I --max-time 15 http://127.0.0.1:8082/

Erwartet wird HTTP 200 OK. Falls der Webserver noch startet, warte kurz und wiederhole curl. Du kannst auch http://127.0.0.1:8082/ im Browser öffnen und die Nginx-Startseite ansehen. Port 8082 vermeidet einen Konflikt mit Port 8080 aus dem Gateway-Lab. Der Container ist nur von deinem Computer aus erreichbar.

Terminal mit erfolgreichem Pull aus ACR und HTTP 200 vom lokalen Nginx-Container.

Damit hast du ein Image in Azure gespeichert, über die Registry abgerufen und daraus einen Container gestartet.

Wenn etwas fehlschlägt

  • Docker-Daemon nicht verfügbar: Starte Docker Desktop und warte auf die laufende Engine.
  • Push/Pull verweigert: Prüfe CLI-Benutzer, Abonnement, Berechtigungsmodus und passende Rolle. Warte auf die Übernahme neuer Rollen und führe az acr login erneut aus.
  • Registry nicht gefunden: Prüfe ACR_NAME und das ausgewählte Azure-Abonnement.
  • Hostname oder Image-Referenz fehlerhaft: Ermittle ACR_SERVER erneut und verwende den zurückgegebenen Login-Server einschließlich eines möglichen generierten Zusatzes.
  • Download-Limit des öffentlichen Images: Das erste Image kommt von Docker Hub. Melde dich bei Bedarf mit docker login an oder warte, bis das Limit zurückgesetzt wird.
  • Port oder Containername belegt: Prüfe docker ps -a. Entferne nur deinen vorherigen Lab-Container ct-acr-web oder wähle einen anderen freien Host-Port.

Abschließen

Entferne den lokalen Testcontainer:

docker rm -f ct-acr-web

Behalte die Registry und cloudtrips/nginx:v1, wenn du mit weiteren Container-Bereitstellungen fortfahren möchtest. Andernfalls lösche rg-cloudtrips-containers-test-neu, sobald du keine Ressourcen darin mehr benötigst. Das Entfernen lokaler Container oder Images löscht die Registry nicht und beendet ihre Kosten nicht.