
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.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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.
Prérequis
Section intitulée « Prérequis »- Une instance Nexus en marche, voir Installer Nexus.
- Docker sur votre poste, et le mot de passe admin Nexus.
Le connecteur : la clé du registre Docker
Section intitulée « Le connecteur : la clé du registre Docker »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 :
services: nexus: image: sonatype/nexus3:3.77.1 ports: - "8081:8081" - "8082:8082" # connecteur du registre DockerCréer le dépôt docker (hosted)
Section intitulée « Créer le dépôt docker (hosted) »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 :
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/.

Une réponse 201 confirme la création. Vérifiez que le dépôt existe :
curl -s -u admin:VOTRE_MDP http://localhost:8081/service/rest/v1/repositories \ | jq -r '.[] | select(.format=="docker") | "\(.type)\t\(.name)"'hosted docker-hostedConnecter le démon Docker
Section intitulée « Connecter le démon Docker »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 :
docker login localhost:8082 -u adminPassword:Login SucceededPousser et tirer une image
Section intitulée « Pousser et tirer une image »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>.
-
Taguer une image existante vers le registre Nexus :
Fenêtre de terminal docker pull alpine:3.20docker tag alpine:3.20 localhost:8082/alpine:3.20 -
Pousser l'image :
Fenêtre de terminal docker push localhost:8082/alpine:3.20The push refers to repository [localhost:8082/alpine]3.20: digest: sha256:c64c687cbea9300178b30c95835354e34c4e4febc4badfe27102879de0483b5e size: 1023 -
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.

N'importe quelle machine autorisée peut désormais tirer l'image depuis votre registre privé : docker pull localhost:8082/alpine:3.20.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Port must be unique à la création | Port déjà pris par un autre dépôt Docker | Choisir un autre port ou passer par un group |
docker login échoue en HTTP | Registre non localhost sans TLS | Exposer via un reverse proxy HTTPS |
docker push renvoie 401 | Droits insuffisants | Utiliser un compte avec le privilège d'écriture sur le dépôt |
| Le port 8082 ne répond pas | Connecteur non publié | Ajouter - "8082:8082" au conteneur et le recréer |
À retenir
Section intitulée « À retenir »- 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 undocker login.