Aujourd’hui, j’essayais de générer une image Docker à partir d’un projet Node.js et je voulais la déployer sur mon swarm de test local.
Malheureusement, quand on construit une image Docker en local, elle n’est stockée et accessible que sur le nœud où elle a été créée, et les autres nœuds du swarm n’y ont pas accès.
Pour régler ça, il faut pousser l’image vers un registre Docker où tous les nœuds du swarm pourront la récupérer.
Création du registre
Pour instancier un service de registre dans le swarm, lancez :
docker service create —name registry —publish 5000:5000 registry:latest
Cela va créer le service de registre et l’exécuter dans le swarm, le rendant accessible à tous les nœuds du swarm.
Pousser une image vers le registre
Pour pousser une image vers le registre, il y a deux choses à faire : taguer l’image, puis la pousser.
Voici un exemple pour construire et taguer l’image en une seule fois :
docker build . -t localhost.localdomain:5000/
Et comment la pousser vers le registre :
docker push localhost.localdomain:5000/
Pour utiliser l’image dans un service ou un conteneur, on indique le chemin complet vu plus haut, c’est-à-dire localhost.localdomain:5000/<image-name>:latest.
Les nœuds du swarm auront accès à l’image et pourront la récupérer et l’exécuter.
Remarque importante sur l’adresse du registre
Dans la plupart des tutoriels en ligne, l’URL du registre est donnée sous la forme localhost:5000. Malheureusement, ça ne fonctionne pas et on obtient généralement un timeout quand on essaie de l’utiliser. Si on la remplace par localhost.localdomain, ça marche !
Je ne sais pas pourquoi ça se passe ainsi, alors que localhost et localhost.localdomain se résolvent tous les deux en 127.0.0.1.