Estuve luchando por unas horas para obtener una configuración de un Docker Registry que funcionara. Esta es la solución que me terminó funcionando.

Motivación

Actualmente estoy trabajando en un proyecto que planea usar Docker Swarm y para hacer que las imágenes de Docker estén disponibles para todos los nodos tiene mucho sentido configurar un registro local.
La configuración recomendada es que tu registro utilice TLS pero se me pueden ocurrir varios casos de uso en los cuales tu registro no está expuesto públicamente y querés que tus instancias se conecten con él usando simplemente HTTP.

RTFM

Docker ofrece una manera muy simple de levantar un repositorio local en la documentación del Hub.

1
$ docker run -d -p 5000:5000 --restart always --name registry registry:2

Ese es literalmente el único comando que tenes que ejecutar para tener tu registro funcionando, lo cual es genial. Aunque todo tiene una trampa, cierto? Esto te va a permitir subir, bajar o buscar imágenes refiriendote a localhost pero si querés acceder al registro desde otro host no vas a poder hacerlo.

Los clientes del Docker Engine están pensados para que por defecto fuerzen TLS como medio de comunicación con los registros, por lo que deberás agregar un registro inseguro (“insecure registry”). Incluso hay una página de la documentación dónde explican cómo hacerlo pero parece no aplicar a sistemas operativos que utilicen systemd. Justo dá la casualidad de que estoy usando Ubuntu 16.04 en mis instancias.

Después de estar un rato googleando encontré un issue de Kamil Tamiola, el héroe de esta historia, que efectivamente funcionó cómo solución.

Agregando al archivo que se encuentra en /etc/docker/daemon.json:

1
2
3
{
"insecure-registries": ["IPdeTuRegistro:5000"]
}

y reiniciando docker después (sudo service docker restart) funcionó cómo una maravilla.

Deberías poder confirmar que efectivamente se agregó el registro inseguro ejecutando docker info.