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