1. Docker Hub & Registres

Un registre Docker (registry) est un service de stockage et distribution d'images. Docker Hub est le registre public par défaut — il héberge des millions d'images officielles et communautaires.

# Images officielles (Docker Inc.)
docker pull nginx            # = docker.io/library/nginx:latest
docker pull node:18-alpine   # = docker.io/library/node:18-alpine

# Images verified publishers
docker pull bitnami/postgresql:15

# Images utilisateur
docker pull monuser/monapp:v1.0

# Registre alternatif (GitHub Container Registry)
docker pull ghcr.io/owner/repo:tag

2. Push & Pull

# 1. Se connecter à Docker Hub
docker login                    # Demande user/password
docker login -u monuser        # Avec username

# 2. Tagger l'image avec le chemin complet
docker tag monapp:latest monuser/monapp:latest
docker tag monapp:latest monuser/monapp:1.0.0

# 3. Pousser vers Docker Hub
docker push monuser/monapp:latest
docker push monuser/monapp:1.0.0

# 4. Tirer l'image depuis Docker Hub
docker pull monuser/monapp:1.0.0

# Se déconnecter
docker logout

3. Tags & Stratégie de versionnage

# Convention de tags
monapp:latest      # Dernière version (mise à jour automatiquement)
monapp:1.0.0       # SemVer exact — immuable
monapp:1.0         # Version mineure
monapp:1           # Version majeure
monapp:stable      # Alias sémantique
monapp:dev         # Branche de développement
monapp:sha-a1b2c3d # Hash de commit Git

# Workflow CI/CD type
docker build -t monuser/monapp:${GIT_SHA} -t monuser/monapp:latest .
docker push --all-tags monuser/monapp

4. Registre privé

# Lancer un registre local (pour tests)
docker run -d \
  -p 5000:5000 \
  --name registry \
  --restart always \
  -v registry-data:/var/lib/registry \
  registry:2

# Pousser vers le registre local
docker tag  monapp:latest localhost:5000/monapp:latest
docker push localhost:5000/monapp:latest

# Lister les images dans le registre local
curl http://localhost:5000/v2/_catalog

# Tirer depuis le registre local
docker pull localhost:5000/monapp:latest

5. Multi-architecture avec buildx

# Créer un builder multi-arch
docker buildx create --name multiarch --use

# Builder pour linux/amd64 et linux/arm64 (Apple Silicon)
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t monuser/monapp:latest \
  --push \
  .

# Inspecter les architectures supportées
docker buildx imagetools inspect monuser/monapp:latest

6. GHCR & Alternatives

# GitHub Container Registry (ghcr.io)
docker login ghcr.io -u USERNAME -p $GITHUB_TOKEN
docker tag   monapp ghcr.io/myorg/monapp:latest
docker push  ghcr.io/myorg/monapp:latest

# Amazon ECR
aws ecr get-login-password | docker login \
  --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com
docker push 123456789.dkr.ecr.eu-west-1.amazonaws.com/monapp:latest

# Google Artifact Registry
gcloud auth configure-docker europe-docker.pkg.dev
docker push europe-docker.pkg.dev/project/repo/monapp:latest