Hoy intentaba generar una imagen de Docker a partir de un proyecto de Node.js y quería desplegarla en mi swarm local de pruebas.
Por desgracia, si se construye una imagen de Docker local, esta se almacena y es accesible solo en el nodo donde fue creada, y los demás nodos del swarm no pueden acceder a ella.
La forma de solucionarlo es subir la imagen a un registro de Docker (Docker registry) desde el cual todos los nodos del swarm puedan descargarla.
Creando el registro
Para instanciar un servicio de registro en el swarm, ejecuten:
docker service create —name registry —publish 5000:5000 registry:latest
Esto creará el servicio de registro y lo ejecutará en el swarm, haciéndolo accesible para todos los nodos del swarm.
Subiendo una imagen al registro
Para subir una imagen al registro hay que hacer dos cosas: etiquetar la imagen y luego subirla.
Aquí tienen un ejemplo de cómo construir y etiquetar la imagen de una sola vez:
docker build . -t localhost.localdomain:5000/
Y así se sube al registro:
docker push localhost.localdomain:5000/
Para usar la imagen en un servicio o un contenedor, se especifica la ruta completa de arriba, es decir, localhost.localdomain:5000/<image-name>:latest.
Los nodos del swarm tendrán acceso a la imagen y podrán descargarla y ejecutarla.
Nota importante sobre la dirección del registro
En la mayoría de los tutoriales en línea, la URL del registro aparece como localhost:5000. Por desgracia, esto no funciona y normalmente se agota el tiempo de espera al intentar usarla. ¡Si la cambiamos por localhost.localdomain, funcionará!
No sé por qué ocurre esto, si tanto localhost como localhost.localdomain se resuelven a 127.0.0.1.