Docker Registry
est un service permettant de stocker et de distribuer des images Docker, facilitant leur partage et leur gestion dans des environnements de développement et de production.
Mise en place
Une méthode simple consiste à installer la Docker Registry
en tant que conteneur via docker-compose
.
Prérequis
: avant d’installer le service, il faut définir l’endroit où la registry
enregistrera les données. Dans mon cas, je choisis d’utiliser un point de montage data
sur mon nas
afin d’assurer la persistance des éléments.
Fichier docker-compose.yaml
:
version: '3'
services:
registry:
image: registry:2
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /Data
volumes:
- /Data:/Data
Une fois défini, il faut exécuter la commande suivante :
docker compose up -f docker-compose.yaml -d
Mettre en place l’authentification
Prérequis : configuration de reverse proxy comme nginx
.
Exemple :
server {
listen 80;
server_name docker-registry.home www.docker-registry.home;
location / {
proxy_pass http://docker-registry:5000;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Les headers
sont nécessaires pour l’authentification auprès de la registry
.
Utiliser htpasswd
du paquet apache2-utils
pour créer un fichier d’authentification :
sudo apt install apache2-utils -y
Une fois installé, on peut créer un utilisateur dans un répertoire dédié, ici on va créer un répertoire auth
qui sera monté comme volume sur le conteneur :
mkdir ~/docker-registry/auth # Créer le répertoire qui contient les richiers d'auth
cd ~/docker-registry/auth
sudo htpasswd -B registry.password [username]
Il faut aussi modifier le docker-compose.yaml
:
version: '3'
services:
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /Data
volumes:
- ./auth:/auth
- /Data:/Data
Tester une registry via http
docker login
utilise par défaut https
, donc si nginx
ne sert que du http
il faut créer une exception.
Pour cela, il faut ajouter la regitry
au fait fichier /etc/docker/daemon.json
:
{
"insecure-registries": ["<registry>:<port>"]
}
Remarque : sous Windows (pour docker desktop) le fichier se trouve sous %userprofile%\.docker\daemon.json
.
Via docker desktop
:
![[docker-desktop-daemong-config.png]]
Ensuite,; il faut adapter la commande docker-login
pour utiliser le port 80
:
docker login docker-registry.home:80
Insecure registry
sur Kubernetes
Ajouter dans /etc/default/docker.json
:
{
"insecure-registries": ["<regsitry>:<port>"]
}
Ensuite, il faut créer un secret
qui contiendra les éléments pour s’authentifier à la registry :
kubectl create secret docker-registry docker-cred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=your-username \
--docker-password=your-password
Utiliser la registry
Se connecter à Docker Registry
docker login [registry_url]
Les informations seront stockées dans ~/.docker/config.json
.
Pousser une image sur la registry
Avant de pousser une image vers un registre, il faut la tagger avec l’URL du registre.
La structure de la commande sera la suivante :
docker tag [nom_image_locale] [url_du_registry]/[nom_utilisateur]/[nom_image]:[tag]
Exemple :
docker tag my-app myregistry.example.com/myuser/my-app:latest
Enfin, on peut pousser l’image avec la commande push
:
docker push <url_du_registry>/<nom_utilisateur>/<nom_image>:<tag>
Remarque : si l’authentification est nécessaire, il faut ajouter le mot de passe via la variable auth
dans ~/.docker/config.json
:
{
"auth": "mdp"
}
Erreur liée : push access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials
Récupérer une image depuis la registry
docker pull <url_du_registry>/<nom_utilisateur>/<nom_image>:<tag>
docker pull docker-registry.home:80/guillaume/hello-world-api:v1
Lister les images (repositories) disponibles sur la registry
curl -X GET https://myregistry:5000/v2/_catalog
Exemple si authentification nécessaire :
curl -X GET -u guillaume:<password> http://docker-registry.home:80/v2/_cata
log
Pour lister les tags d’une image :
curl -X GET https://myregistry:5000/v2/ubuntu/tags/list