Si vous n’avez pas de compte payant sur docker hub mais que vous ne voulez pas publier publiquement une image docker il va falloir trouver des solutions pour pouvoir héberger vos images docker. Par exemple en montant un registry docker privé pour héberger vos images docker.
Dans cet article nous allons voir comment monter un registry docker et comment y accéder en HTTPs sans avoir à déployer de certificat.
Pour cet exemple je vais utiliser un petit serveur START1-S chez scaleway à moins de 2 euros par mois.
Je préfère avoir de toutes petites instances de serveurs, plutôt que tout avoir sur la même machine. Si jamais une des machines se fait pirater, ou si elle a une panne matérielle, il n’y aura qu’un de mes projets perso qui sera hors ligne.
Installer docker
Dans un premier temps il va falloir installer docker sur la machine. Pour cette étape le mieux est de suivre le tuto présent sur la documentation officielle en fonction de votre OS.
Mettre en place une connexion https
Plusieurs méthodes sont possibles, de la plus simple à la plus complexe. Vous pourrez trouver des tutos pour le faire via du let’s encrypt mais je suis parti sur quelque chose de plus simple. Comme je gère mes DNS avec cloudflare je vais utiliser le SSL flexible.
Ce n’est pas un SSL de bout en bout mais c’est suffisant pour ce que je fais sur domaine lahaxe.fr. Il n’y a en effet aucune donnée critique qui transite dessus.
Créer un sous domaine
Dans le menu DNS il va falloir ajouter une entrée, par exemple dans mon cas « registry.lahaxe.fr« , et la faire pointer vers votre serveur.
Activer le SSL flexible dans cloudflare
Dans le menu Crypto il y a une section SSL. Dans le menu déroulant il faut sélectionner Flexible.
Encore une fois, c’est satisfaisant pour un projet perso, mais ça ne l’est pas pour de la vraie production.
Lancer le registry
Il existe une image officielle pour monter son propre registry. Elle est très sobrement nommé registry.
L’image expose le port 5000 mais on va le mapper sur le port 80 afin de profiter du SSL flexible de Cloudflare.
docker run -d -p 80:5000
--restart=always
--name registry
-v /opt/docker-registry:/var/lib/registry
registry:2
Vous pouvez vérifier le bon fonctionnement en consultant l’url https://registry.lahaxe.fr/v2/_catalog (dans mon cas).
A partir de ce moment vous avez un registry fonctionnel mais public. N’importe qui peut pousser et télécharger une image dessus. Nous verrons dans la section « sécuriser le registry » comment mettre en place la sécurité sur le registry.
Uploader une image
Maintenant que nous avons notre registry de disponible nous allons pouvoir lui pousser une image pour nous assurer que tout est bien configuré.
# pull d'une image sur le hub
docker pull alpine
# on re-tag l'image
docker image tag alpine registry.lahaxe.fr/alpine
# push de l'image sur notre registry
docker push registry.lahaxe.fr/alpine
Sécuriser le registry
Avoir un registry ouvert est une très mauvaise pratique. Afin de le sécuriser un minimum nous pouvons mettre en place deux sécurités de base.
Filtre par IP
L’idée est de donner les accès seulement à vos serveurs et aux personnes qui doivent interagir avec. Il va donc falloir sécuriser le port 80 de serveur (ou le 443 si vous faites du SSL de bout en bout).
De mon côté je vais utiliser les security policies de scaleway pour bloquer le port. Attention: Il faut bien penser à redémarrer le serveur après avoir changé les règles de firewall scaleway. Mais sinon vous pouvez mettre en place un filtrage via iptable ou via shorewall.
Mettre en place de l’authentification
Dans un premier temps il va falloir générer un fichier htpasswd avec le ou les logins et mots de passes.
mkdir auth
docker run
--entrypoint htpasswd
registry:2 -Bbn username MySuperP4ssw0rd123 > auth/htpasswd
Il suffit de dire à l’image docker de prendre ce fichier et d’activer l’authentification basique. Il est absolument nécessaire d’être en HTTPS pour cette authentification sinon le mot de passe passera en clair dans les trames HTTP.
# si vous avez un container qui tourne déjà
docker rm -f registry
docker run -d -p 80:5000
--restart=always
--name registry
-v `pwd`/auth:/auth
-e "REGISTRY_AUTH=htpasswd"
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
-v /opt/docker-registry:/var/lib/registry
registry:2
Sur les pc « clients », votre desktop par exemple, il faudra faire un docker login pour pouvoir utiliser le registry.
docker login registry.lahaxe.fr
Je ne mets pas en place de system de backup sur le registry car je n’en ai pas spécialement le besoin. Je préfère stocker l’ensemble de mes dockerfiles afin de pouvoir les reconstruire en cas de besoin.