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/:latest

Et comment la pousser vers le registre :

docker push localhost.localdomain:5000/:latestUtiliser l’image dans un service/conteneur/etc.

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.