Blog

Installer votre dépot privé Docker

Petit à petit chez Code-Troopers, nous migrons tous nos développements pour utiliser Docker. Cela fait quelque temps que nous l’utilisons pour des projets “public”, auquel cas le registry public Docker est largement suffisant (et immédiat à utiliser).

En revanche, nous commençons à migrer nos applications de production également vers Docker, et nous ne pouvons pas utiliser le mode public du registry public. Nous nous sommes donc mis à déployer un dépôt privé, authentifié par utilisateur / mot de passe.

La procédure n’est pas très complexe, mais cette opération reste une bonne opportunité d’écrire un article à ce sujet (les articles en français n’étant pas légion).

Step by step

Il faut créer une entrée DNS pour votre service.

Puis nous allons utiliser l’image Docker avec nginx pour l’authentification docker-nginx-registry-proxy.

Informations d’identification

Pour les étapes suivantes, placez vous dans le répertoire de votre choix pour stocker les fichiers (dans ce cas nous sommes dans /srv/registry-config)

Génération du certificat

Pensez à bien renseigner le FQDN DNS lors de la demande de Common Name pour le certificat.

openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
openssl genrsa -out ia.key 4096
openssl req -new -key key.pem -out ia.csr #this is where you need to fill your FQDN
openssl x509 -req -days 730 -in ia.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out cert.pem

Génération des mots de passes basic auth

En utilisant un container docker qui embarque htpasswd vous pourrez générer facilement le fichier nécessaire :

docker run --rm -ti -v $(pwd):/tmp dgageot/htpasswd -c /tmp/docker-registry.htpasswd $MONUSER

Démarrage du registry

Les images seront stockées dans le répertoire /srv/registry

mkdir /srv/registry
docker run -d --restart=always --name registry -v /srv/docker-registry:/registry -e "SETTINGS_FLAVOR=local" -e "STORAGE_PATH=/registry" registry
docker run -d --restart=always -p 443:443 -v /srv/registry-config:/etc/nginx/external --link registry:registry --name nginx-registry-proxy marvambass/nginx-registry-proxy

Configuration d’une machine cliente

Importer le certificat racine

Il faut importer le certificat racine dans la liste des certificats reconnus

sudo -s
mkdir -p /etc/docker/certs.d/$FQDN
cp ca.crt /etc/docker/certs.d/$FQDN/

mkdir -p /usr/local/share/ca-certificates/docker-ct
cp ca.crt /usr/local/share/ca-certificates/docker-ct/
update-ca-certificates-

Pour vérifier que tout fonctionne comme attendu, vous pouvez voir si votre certificat ressort bien dans la commande suivante :

awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt | grep $(VOTRE IDENTIFIANT)

Vous serez également certainement amené à redémarrer vos daemon docker (de chacune des machines)

systemctl stop docker
systemctl start docker

Identification sur le dépot

Une fois que toutes ces étapes sont effectuées, normalement votre dépot est prêt à être utilisé.

Il vous faut cependant en première étape vous identifier à l’aide du couple utilisateur / mot de passe créé lors de l’installation :

docker login https://mondepotdocker.tld

Ceci aura pour effet de créer un fichier ~/.dockercfg vous permettant d’accéder aux commandes suivantes sans avoir besoin de retaper vos identifiants.

Utilisation du dépôt

Une fois la machine cliente configurée, vous pouvez simplement utiliser le dépot en préfixant les noms de vos images par l’URL du dépôt. Par exemple, pour push/pull l’image de monapplication la commande suivante fera l’affaire :

docker push mondepotdocker.tld/monapplication:v1.0.0
docker pull mondepotdocker.tld/monapplication:v1.0.0

Utilisation avec docker-compose

Si vous utilisez docker-compose, il se peut que vous ayiez des soucis avec le certificat autosigné et/ou avec l’authentification.

Pour contourner la vérification du certificat, vous pouvez simplement lancer docker-compose avec le flag --allow-insecure-ssl.

Pour ce qui est de l’authentification, une astuce simple pour contourner les problèmes de ce genre est de faire un docker pull manuellement au préalable (le scripter depuis le fichier compose.yml n’est pas trop difficile).

comments powered by Disqus

Contact

legos

Code-Troopers

26 bis rue Abraham Bosse
37000 Tours - Fr

contact@code-troopers.com

07 82 28 72 16

Suivez nos actualités