Docker Registry Guide
Core Registry Commands
# Login to Docker Hub
docker login
docker login -u myuser -p mypassword
# Login to private registry
docker login registry.example.com
# Pull image
docker pull nginx:1.25-alpine
docker pull registry.example.com/myapp:v1.2.3
# Tag image
docker tag myapp:latest registry.example.com/team/myapp:v1.2.3
docker tag myapp:latest registry.example.com/team/myapp:latest
# Push image
docker push registry.example.com/team/myapp:v1.2.3
docker push registry.example.com/team/myapp:latest
# Inspect remote image metadata (no pull)
docker manifest inspect registry.example.com/myapp:v1.2.3
# Logout
docker logout registry.example.com
AWS ECR
# Authenticate to ECR (token valid 12h)
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.us-east-1.amazonaws.com
# Create repository
aws ecr create-repository \
--repository-name my-app \
--image-scanning-configuration scanOnPush=true \
--encryption-configuration encryptionType=AES256
# Tag and push
docker tag my-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app:latest
# Set lifecycle policy (keep last 10 images)
aws ecr put-lifecycle-policy \
--repository-name my-app \
--lifecycle-policy-text '{"rules":[{"rulePriority":1,"description":"Keep last 10","selection":{"tagStatus":"any","countType":"imageCountMoreThan","countNumber":10},"action":{"type":"expire"}}]}'
GCP Artifact Registry & GCR
# Configure Docker to use gcloud credentials
gcloud auth configure-docker us-central1-docker.pkg.dev
# Create Artifact Registry repository
gcloud artifacts repositories create my-repo \
--repository-format=docker \
--location=us-central1 \
--description="My Docker images"
# Tag and push to Artifact Registry
docker tag my-app:latest us-central1-docker.pkg.dev/my-project/my-repo/my-app:v1.0
docker push us-central1-docker.pkg.dev/my-project/my-repo/my-app:v1.0
# Legacy GCR (still works)
gcloud auth configure-docker gcr.io
docker tag my-app:latest gcr.io/my-project/my-app:v1.0
docker push gcr.io/my-project/my-app:v1.0
Azure Container Registry (ACR)
# Create ACR
az acr create \
--name myregistry \
--resource-group myRG \
--sku Basic \
--admin-enabled true
# Login to ACR
az acr login --name myregistry
# Build and push directly in ACR (no local Docker needed)
az acr build \
--registry myregistry \
--image myapp:v1.0 \
--file Dockerfile .
# Import image from Docker Hub
az acr import \
--name myregistry \
--source docker.io/library/nginx:latest \
--image nginx:latest
# List images
az acr repository list --name myregistry --output table
az acr repository show-tags --name myregistry --repository myapp
Image Tagging Strategies
| Strategy | Example Tags | Use Case |
|---|---|---|
| Semantic versioning | v1.2.3, v1.2, v1, latest | Stable releases |
| Git SHA | abc1234, git-abc1234ef56 | Immutable, traceable |
| Build number | build-1234, 1234 | CI systems |
| Branch+SHA | main-abc1234, feature-xyz-def456 | Pre-release testing |
| Date | 20240115, 2024.01.15 | Nightly builds |
Multi-Architecture Images
# Create and push multi-arch manifest
docker buildx create --use
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag registry.example.com/myapp:v1.0 \
--push .
# Inspect manifest list
docker manifest inspect registry.example.com/myapp:v1.0
# Pull for specific platform
docker pull --platform linux/arm64 registry.example.com/myapp:v1.0