Comment mettre en place un miroir Docker Hub avec Nexus Repository : tutoriel complet

La mise en place d’un miroir Docker privé avec Nexus Repository permet d’améliorer la sécurité, la fiabilité et les performances de vos builds Docker en entreprise. Cet article explique étape par étape comment déployer et configurer Nexus en tant que proxy Docker Registry fonctionnel sur Kubernetes.


🟢 Pourquoi créer un miroir Docker privé avec Nexus ?

Docker Hub limite les requêtes anonymes et impose des restrictions sur le trafic entrant. Avoir un proxy local Docker Hub via Nexus permet de :

  • Réduire la consommation de bande passante vers Docker Hub.
  • Accélérer les téléchargements d’images Docker grâce au cache local.
  • Augmenter la fiabilité en cas d’indisponibilité temporaire de Docker Hub.
  • Simplifier la gestion des images Docker dans un environnement sécurisé.

🚀 Prérequis

  • Un cluster Kubernetes opérationnel.
  • Une instance Nexus OSS (Open Source) installée sur Kubernetes.
  • Ingress Controller configuré (par exemple, Nginx Ingress).
  • cert-manager pour la gestion automatique des certificats SSL.

🛠️ Étape 1 : Déployer Nexus sur Kubernetes

Créez d’abord un déploiement Nexus stable et persistant avec ce manifeste YAML minimaliste :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nexus
  namespace: devtools
spec:
  selector:
    matchLabels:
      app: nexus
  template:
    metadata:
      labels:
        app: nexus
    spec:
      containers:
      - name: nexus
        image: sonatype/nexus3:latest
        resources:
          requests:
            memory: 3Gi
            cpu: 500m
        volumeMounts:
        - mountPath: /nexus-data
          name: nexus-data
      volumes:
      - name: nexus-data
        persistentVolumeClaim:
          claimName: nexus-data
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nexus-data
  namespace: devtools
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: managed-nfs-storage
  resources:
    requests:
      storage: 20Gi

📡 Étape 2 : Créer les Services Kubernetes nécessaires

Créez deux Services distincts, un pour l’interface web Nexus classique (port 8081) et un autre pour Docker Registry (port 5000) :

apiVersion: v1
kind: Service
metadata:
  name: nexus-web
  namespace: devtools
spec:
  ports:
    - port: 8081
      targetPort: 8081
  selector:
    app: nexus
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  name: nexus-docker
  namespace: devtools
spec:
  ports:
    - port: 5000
      targetPort: 5000
  selector:
    app: nexus
  type: ClusterIP

🌐 Étape 3 : Configurer l’Ingress avec deux domaines distincts

Docker Registry impose un domaine dédié. Utilisez un domaine distinct pour Nexus Web et Docker Registry :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nexus-ingress
  namespace: devtools
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 1024m
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
    - hosts:
      - nexus.example.com
      - docker-hub.example.com
      secretName: nexus-tls
  rules:
    - host: nexus.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nexus-web
                port:
                  number: 8081

    - host: docker-hub.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nexus-docker
                port:
                  number: 5000

Remplacez nexus.example.com et docker-hub.example.com par vos domaines.


⚙️ Étape 4 : Configurer Nexus comme proxy Docker Hub

Connectez-vous à l’interface Web de Nexus (https://nexus.example.com) :

  1. Allez dans :
    Administration → Repositories → Create Repository → Docker (proxy).
  2. Configurez les champs suivants :
    • Name : docker-hub-proxy
    • Remote Storage : https://registry-1.docker.io
    • HTTP Connector : port 5000 activé
    • Allow anonymous docker pull : activé pour faciliter l’usage
    • URL externe : https://docker-hub.example.com

Sauvegardez cette configuration.


🐳 Étape 5 : Configurer les clients Docker pour utiliser Nexus

Vous avez deux possibilités :

Option 1 : Configuration globale via daemon.json

Éditez /etc/docker/daemon.json sur vos clients Docker :

{
  "registry-mirrors": ["https://docker-hub.example.com"]
}

Puis relancez Docker :

sudo systemctl restart docker

Désormais, toute requête vers Docker Hub utilisera votre miroir Nexus.

Option 2 : Utiliser explicitement votre miroir Nexus

Sans configuration globale :

docker pull docker-hub.example.com/library/nginx

🚦 Étape 6 : Test et vérification

Effectuez un test simple :

docker pull docker-hub.example.com/library/hello-world

Votre image Docker devrait être téléchargée via Nexus. Vérifiez dans l’interface Nexus (docker-hub-proxy) que l’image apparaît bien en cache.


📌 Bonnes pratiques et recommandations supplémentaires

  • Activez les certificats SSL avec Let’s Encrypt (cf. annotations cert-manager dans l’Ingress) pour garantir une sécurité optimale.
  • Activez l’authentification dans Nexus pour mieux contrôler les accès Docker si besoin.

Conclusion

Vous venez de déployer un proxy Docker Hub fonctionnel grâce à Nexus Repository sur Kubernetes. Ce miroir Docker privé améliore significativement vos flux Docker en entreprise tout en optimisant vos performances réseau.

En suivant précisément ce guide détaillé, vous obtenez une installation propre, efficace et sécurisée.

N’hésitez pas à explorer d’autres fonctionnalités Nexus pour enrichir votre stratégie DevOps !


Mots clés SEO : Nexus, Docker Hub, proxy Docker, Docker Registry, Kubernetes, Nexus OSS, docker registry mirror, Ingress, cert-manager, configuration docker daemon.