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

Y así se sube al registro:

docker push localhost.localdomain:5000/:latestUsando la imagen en un servicio/contenedor/etc.

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.