Registre privé Docker-Registry
Présentation de Harbor
Harbor est un serveur de registre Docker destiné aux entreprises pour le stockage et la distribution d'images.
- Projet GitLab officiel : https://github.com/goharbor/harbor
- Projet open source permettant la signature et le balayage des contenus.
Fonctionnalités clés de Harbor :
Contrôle d'accès basé sur les rôles : Organisation des utilisateurs et des dépôts d'images via des projets, avec gestion fine des permissions.
- Réplication des images : Synchronisation entre plusieurs instances de registre, idéal pour les architectures HA, hybrides ou multi-cloud.
- Interface graphique : Gestion des projets et dépôts via navigateur.
- Intégration LDAP/AD : Authentification centralisée avec audit complet.
- Internationalisation : Disponible en anglais, chinois, allemand, japonais et russe.
- API RESTful : Intégration simplifiée avec d'autres outils.
Déploiement d'un registre privé avec Harbor
Architecture
Principe : Configuration maître-esclave pour assurer la haute disponibilité. L'utilisation d'un registre interne évite la saturation du bande passante externe lors de l'import/export massif d'images.
Création d'une image
- Étiqeutage
- Envoi via docker push
Démarrage du registre
docker run -d -p 5000:5000 --restart=always --name registry -v /data/registry:/var/lib/registry registry
Étiquetage d'images
docker tag nginx:latest 192.168.1.100:5000/mon-nginx:latest
docker tag centos7_nginx:v2 192.168.1.100:5000/centos7-nginx:v2
Attention :
Par défaut, HTTPS est requis. Pour utiliser HTTP, modifier la configuration Docker :
cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["192.168.1.100:5000"] } EOF systemctl restart docker
Envoi des images
docker push 192.168.1.100:5000/mon-nginx:latest
Configuration du miroir
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["192.168.1.100:5000"]
}
systemctl restart docker
docker push 192.168.1.100:5000/mon-nginx:latest
docker push 192.168.1.100:5000/centos7-nginx:v2
Gestion du registre privé
Liste des images : http://192.168.1.100:5000/v2/_catalog
Versions disponibles : http://192.168.1.100:5000/v2/alpine/tags/list
Récupération d'images
docker pull 192.168.1.100:5000/mon-nginx:latest
docker pull 192.168.1.100:5000/centos7-nginx:v2
Multi-nœuds :
docker swarm - Orchestration kubernetes - Orchestration
Environnement d'exécution : runc
Dépôt vers registre privé
Création d'un compte et validation email
docker tag centos7_nginx:v2 utilisateur/centos7-nginx:v2
docker login
user:
passwd:
docker push utilisateur/centos7-nginx:v2
docker pull utilisateur/centos7-nginx:v2
Suppression d'images
- Accès au conteneur
docker exec -it registry /bin/sh
- Suppression des données
rm -fr /var/lib/registry/docker/registry/v2/repositories/alpine
- Nettoyage
registry garbage-collect /etc/docker/registry/config.yml
Sécurité
- Génération du mot de passe
yum install httpd-tools -y
mkdir /auth/registry -p
htpasswd -Bbn utilisateur password > /auth/registry/htpasswd
- Démarrage sécurisé
docker rm -f $(docker ps -aq)
docker run -d -p 5000:5000 -v /auth/registry:/auth/ -v /data/registry:/var/lib/registry --name secure-registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Secure Registry" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
- Authentification requise
docker login 192.168.1.100:5000
Username: utilisateur
Password:
Registre d'entreprise Harbor
docker-compose
Téléchargement
wget http://192.168.15.253/harbor-offline-installer-v2.1.0.tgz
Décompression
tar xf harbor-offline-installer-v2.1.0.tgz
Dépendances :
docker-ce17.06.0 +docker-compose1.18.0+
yum install docker-ce docker-compose -y
Configuration
cp /opt/harbor/harbor.yml.tmpl /opt/harbor/harbor.yml
vim /opt/harbor/harbor.yml
hostname: 192.168.1.11
...
harbor_admin_password: 123456
Installation
/root/harbor/install.sh
Gestion via docker-compose :
cd /opt/harbor
docker-compose stop
docker-compose start
Configuration finale :
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["192.168.1.11"]
}
EOF
systemctl restart docker
Connexion :
docker login 192.168.1.11
Étiquetage :
docker tag alpine:3.9 192.168.1.11/library/alpine:3.9
Envoi :
docker push 192.168.1.11/library/alpine:3.9
Configuration HTTPS
Préparation
mkdir cert
cd cert/
wget http://192.168.15.253/blog.example.com.zip
yum install docker-compose -y
Décompression
unzip blog.example.com.zip
Configuration
hostname: blog.example.com
certificate: /certs/nginx/1_blog.example.com_bundle.crt
private_key: /certs/nginx/2_blog.example.com.key
Pour les certificats auto-signés :
mkdir -p /etc/docker/certs.d
Optimisation :
sed -ni 's/docker load/#&/p' /root/harbor/install.sh
Exécution :
/root/harbor/install.sh
Désactivation HTTP :
cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
systemctl restart docker
Résolution DNS :
echo "192.168.1.11 blog.example.com" >> /etc/hosts
Connexion :
docker login blog.example.com
Échanges :
docker tag nginx:latest blog.example.com/library/nginx:latest
docker pull blog.example.com/library/alpine:3.9
Exemple Zabbix :
docker tag zabbix/zabbix-server-mysql:latest blog.example.com/zabbix/zabbix-server-mysql:latest
docker login blog.example.com
docker push blog.example.com/zabbix/zabbix-server-mysql:latest
docker pull blog.example.com/zabbix/zabbix-server-mysql:latest