Aller au contenu
Développement medium

Registre Docker privé avec Nexus

8 min de lecture

Logo Nexus

Stocker ses images de conteneurs sur un registre public n'est pas toujours souhaitable : confidentialité, quotas de tirage, dépendance à un tiers. Nexus héberge un registre Docker privé au même endroit que vos autres artefacts. La particularité, souvent source d'erreurs, est que Docker exige un connecteur sur un port dédié, distinct du port de l'interface Nexus. Ce guide crée un dépôt docker (hosted), expose son connecteur, et pousse une image. Public visé : intermédiaire. Validé sur Nexus 3.77.1.

  • Créer un dépôt docker (hosted) dans Nexus.
  • Comprendre pourquoi Docker exige un connecteur sur un port dédié.
  • Connecter le démon Docker au registre.
  • Pousser et tirer une image.
  • Une instance Nexus en marche, voir Installer Nexus.
  • Docker sur votre poste, et le mot de passe admin Nexus.

Un point déroute souvent : contrairement aux dépôts Maven ou PyPI qui passent par le port 8081 de Nexus, un dépôt Docker exige son propre connecteur HTTP sur un port distinct (par exemple 8082). C'est le protocole du registre Docker qui l'impose. Ce port doit être unique par connecteur et publié par le conteneur Nexus.

Concrètement, on ajoute la publication du port au service Nexus :

compose.yaml (extrait)
services:
nexus:
image: sonatype/nexus3:3.77.1
ports:
- "8081:8081"
- "8082:8082" # connecteur du registre Docker

Dans l'interface, Administration, Repositories, Create repository, docker (hosted). Donnez un nom, activez le connecteur HTTP sur le port 8082, et laissez Force basic authentication activé. En API, la création tient en une requête :

Fenêtre de terminal
curl -u admin:VOTRE_MDP -X POST \
http://localhost:8081/service/rest/v1/repositories/docker/hosted \
-H 'Content-Type: application/json' -d '{
"name": "docker-hosted",
"online": true,
"storage": {"blobStoreName": "default", "strictContentTypeValidation": true, "writePolicy": "ALLOW"},
"docker": {"v1Enabled": false, "forceBasicAuth": true, "httpPort": 8082}
}'

Dans l'interface, la section Repository Connectors du dépôt matérialise ce réglage : le connecteur HTTP est activé sur un port dédié, distinct de l'URL de service http://localhost:8081/repository/docker-hosted/.

Configuration du dépôt docker-hosted dans Nexus : le connecteur HTTP activé sur un port dédié

Une réponse 201 confirme la création. Vérifiez que le dépôt existe :

Fenêtre de terminal
curl -s -u admin:VOTRE_MDP http://localhost:8081/service/rest/v1/repositories \
| jq -r '.[] | select(.format=="docker") | "\(.type)\t\(.name)"'
hosted docker-hosted

Le registre Nexus est servi en HTTP (sans TLS) sur localhost:8082. Docker refuse par défaut les registres HTTP distants, mais fait une exception pour localhost : en local, aucune configuration insecure-registries n'est nécessaire. On s'authentifie avec un compte Nexus :

Fenêtre de terminal
docker login localhost:8082 -u admin
Password:
Login Succeeded

On tague une image avec l'adresse du registre, on la pousse, et on vérifie qu'elle est stockée. L'adresse d'image devient localhost:8082/<nom>:<tag>.

  1. Taguer une image existante vers le registre Nexus :

    Fenêtre de terminal
    docker pull alpine:3.20
    docker tag alpine:3.20 localhost:8082/alpine:3.20
  2. Pousser l'image :

    Fenêtre de terminal
    docker push localhost:8082/alpine:3.20
    The push refers to repository [localhost:8082/alpine]
    3.20: digest: sha256:c64c687cbea9300178b30c95835354e34c4e4febc4badfe27102879de0483b5e size: 1023
  3. Vérifier côté Nexus que l'image est référencée, via l'API du catalogue Docker :

    Fenêtre de terminal
    curl -s -u admin:VOTRE_MDP http://localhost:8082/v2/_catalog
    {"repositories":["alpine"]}

Dans l'interface Nexus, la vue Browse du dépôt confirme visuellement que l'image est stockée : sous v2, le composant alpine apparaît à côté des blobs.

Vue Browse du dépôt docker-hosted dans Nexus : l'image alpine poussée apparaît sous v2

N'importe quelle machine autorisée peut désormais tirer l'image depuis votre registre privé : docker pull localhost:8082/alpine:3.20.

SymptômeCause probableSolution
Port must be unique à la créationPort déjà pris par un autre dépôt DockerChoisir un autre port ou passer par un group
docker login échoue en HTTPRegistre non localhost sans TLSExposer via un reverse proxy HTTPS
docker push renvoie 401Droits insuffisantsUtiliser un compte avec le privilège d'écriture sur le dépôt
Le port 8082 ne répond pasConnecteur non publiéAjouter - "8082:8082" au conteneur et le recréer
  • Un dépôt docker (hosted) transforme Nexus en registre Docker privé.
  • Docker exige un connecteur sur un port dédié (ex. 8082), distinct du port 8081 de l'interface.
  • Chaque connecteur occupe un port unique ; un dépôt group en mutualise un seul pour plusieurs dépôts.
  • Docker tolère le HTTP pour localhost ; ailleurs, il faut HTTPS.
  • On pousse avec l'adresse localhost:8082/<image>:<tag> après un docker login.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn