Dentro del [[homelab]] estoy usando mi propio registro de docker de forma privada. Esto nació como idea cuando migre de Github a [[forgejo]] e implemente el proceso de [[ci/cd]]. Dentro de ese proceso estoy creando imágenes de las páginas web completas, que tienen el código y un servidor web ([[httpd]] de Apache). Esas imágenes no quería publicarlas de forma publica, no por que tengan cosas privadas, pero me interesaba mas poder resolver el problema de forma mas local posible.
Ahí es cuando me puse a probar Docker Registry. Es un proyecto publico y open source, que básicamente define una especificación sobre como se debe distribuir un container. En este caso es el mismo proyecto que utiliza el Hub de docker.
Para correrlo estoy utilizando esta🡭 imagen y estoy usando [[docker-compose]]. Junto con este servicio, estoy corriendo este🡭 otro llamado Docker Registry Browser, que nos expone una interfaz muy simple para poder ver que imágenes están publicadas, tags, cuanto espacio ocupan y también nos da la posibilidad de poder eliminar tags de forma manual.
Justo los registros de docker son un poco complejos, en su funcionamiento y en su administración. Si no tenemos el suficiente cuidado y tenemos muchas imágenes es posible que nos empiece a ocupar mucho lugar en disco, para esto es necesario definir una estrategia de limpieza, hay herramientas como crane🡭 que nos puede ayudar en esta tarea, pero es necesario hacer algunas configuraciones para que funcione dentro de un container. La ventaja de este registry es que ya viene listo para funcionar y no necesita mucha configuración, pero no esta preparado para estar expuesto a internet de forma default, hay que agregarle algunas capaz de seguridad.
Para un uso privado, dentro de una red “cerrada” y para una cantidad de proyectos chicos, alcanza y sobra. Resuelve mucho.
Ejemplo docker-compose.yml
services:
registry:
image: registry:2
container_name: registry
restart: always
volumes:
- ./data/registry:/registry_data
- ./data/auth:/auth
environment:
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry_data
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
- REGISTRY_STORAGE_DELETE_ENABLED=true # configuración necesaria para poder eliminar tags desde la ui
networks:
- proxy
- monitoring
registry-ui:
image: klausmeyer/docker-registry-browser:latest
restart: unless-stopped
container_name: registry-ui
environment:
- DOCKER_REGISTRY_URL=https://reg.example.net
- NO_SSL_VERIFICATION=true
- TOKEN_AUTH_USER=********
- TOKEN_AUTH_PASSWORD=***********
- SECRET_KEY_BASE=*******
- ENABLE_DELETE_IMAGES=true # habilita la opción para eliminar tags desde la ui, necesita REGISTRY_STORAGE_DELETE_ENABLED en el registry
networks:
- proxy
- monitoring
# Las redes son personales y no son obligatorias
networks:
proxy:
name: proxy_net
external: true
monitoring:
name: monitoring_net
external: true
Mejoras
- Agregar algún proceso para limpiar los tags y las imágenes viejas que ya no se usan mas.
- https://distribution.github.io/distribution/about/garbage-collection/🡭
- Estoy probando https://github.com/WhySoBad/abwart/🡭 pero no lo tengo funcionando aún.
- Mejorar la seguridad, por el momento usa basic auth, esto no esta público pero igual estaría bueno agregarle algo mejor.