Installer Docker compose :
apt install apache2-utils
On va créer une Registry délivrée via un serveur nginx.
Création des répertoire requis :
mkdir -p /mnt/registry/{nginx,auth}
cd registry/
mkdir -p nginx/{conf.d,ssl}
Aller dans :
cd nginx/conf.d/
Créer du fichier de configuration de la registry :
vim registry.conf
Insérer le contenu suivant :
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.local;
return 301 https://registry.local$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.local;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# Log files for Debug
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location / {
# Do not allow connections from docker 1.5 and earlier
# docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
return 404;
}
proxy_pass http://docker-registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
Créer le fichier :
vim additional.conf
Ajouter le paramètre permettant à nginx de prendre en charge des fichiers jusqu'à 2Go
client_max_body_size 2G;
Créer le certificat SSL de notre registry :
cd /mnt/registry/nginx/ssl
openssl genrsa -out privkey.pem 2048
openssl req -new -sha256 -key /mnt/registry/nginx/ssl/privkey.pem -out ${HOME}/request.csr -subj "/C=FR/ST=Paris/L=Paris/O=Company/OU=IT Department/CN=registry.local"
openssl x509 -req -days 365 -in ${HOME}/request.csr -signkey /mnt/registry/nginx/ssl/privkey.pem -out /mnt/registry/nginx/ssl/fullchain.pem
Pour retreindre l'accès à la registry, nous allons créer un compte utilisateur :
cd /mnt/registry/auth/ htpasswd -Bc registry.passwd benoit
Créer un fichier Docker compose :
vim /mnt/registry/docker-compose.yml
Avec le contenu suivant :
version: '3'
services:
#Registry
registry:
image: registry:2
restart: always
ports:
- "5000:5000"
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- registrydata:/data
- ./auth:/auth
networks:
- mynet
#Nginx Service
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
networks:
- mynet
#Docker Networks
networks:
mynet:
driver: bridge
#Volumes
volumes:
registrydata:
driver: local
Quelques explications de la configuration :
registry:2 du Docker Hub.Lancer les conteneurs de registry :
cd /mnt/registry docker compose up -d
Pour vérifier le fonctionnement :
docker ps docker compose ps
A CORRIGER
Il faut autoriser le client à utiliser une registry avec un certificat non valide.
Récupérer l'IP du conteneur et l'enregistrement registry.local au fichier /etc/hosts :
REGIP=$(docker inspect -f {{.NetworkSettings.Networks.registry_mynet.IPAddress}} nginx)
echo "${REGIP} registry.local" >> /etc/hosts
Editer le fichier suivant :
vim /etc/docker/daemon.json
Et ajouter les lignes suivantes :
{
"insecure-registries" : ["registry.local:443"]
}
Relancer le service Docker :
systemctl restart docker
Pour se connecter à la Registry :
docker login https://127.0.0.1/
Séquence et résultat :
Username: benoit Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
Avant de pousser une image, il faut la retagguer avec l'adresse de la registry 127.0.0.1 par exemple :
docker image tag httpd:latest 127.0.0.1/myhttpd:v1
Ensuite on peut la pousser
docker push 127.0.0.1/myhttpd:v1
Vérification :
curl -u benoit --insecure https://127.0.0.1/v2/_catalog
Résultat attendu :
Enter host password for user 'benoit':
{"repositories":["myhttpd"]}
ou
curl -u benoit --insecure https://127.0.0.1/v2/myhttpd/tags/list
Pour utiliser une image de notre Registry :
docker run -d 127.0.0.1/myhttpd:v1