Docker - Registry

Docker registry

Con docker podemos gestionar el almacenamiento y distribución de imagenes de forma privada utilizando la imagen registry

Configurar registry con docker compose

Fichero docker-compose.yml

services:
  custom_registry:
    container_name: custom_registry
    image: registry:2
    restart: unless-stopped
    environment:
        - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data
    ports:
        - "5000:5000"
    volumes:
        - ./data:/data

Lanzar y comprobar logs

docker compose up -d

Podemos acceder utilizando un navegador y las direcciones:

http://localhost/v2
http://localhost/v2/_catalog

Las imágenes que tengamos podemos enviarlas o recuperarlas del registro utilizando docker push y pull. Pero primero debe establecerse la referencia al registro correspondiente (indicando el host, puerto, namespace y tag si es necesario)

docker image tag custom_image localhost:5000/namespace/custom_image:tag
docker push localhost:5000/namespace/custom_image:tag
docker pull localhost:5000/namespace/custom_image:tag

Si el registro se encuentra en una máquina remota se debera cambiar el dominio, IP o puerto segun corresponda.

docker image tag custom_image dominio.com/namespace/custom_image:tag
docker push dominio.com/namespace/custom_image:tag
docker pull dominio.com/namespace/custom_image:tag

Configurar SSL

Por defecto la comunincación se utilizará como protolo HTTPS por lo que será necesario configurar por ejemplo un nginx con su certificado SSL.

upstream custom_registry {
    server 127.0.0.1:5000;
}

server {
    listen 443 ssl;
    server_name dominio.com;

    ssl_certificate dominio.com.crt;
    ssl_certificate_key dominio.com.key;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    access_log /var/log/nginx/custom_registry.access.log;
    error_log /var/log/nginx/custom_registry.error.log;

    location / {
        proxy_pass http://custom_registry;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 900;
    }
}

Restringir acceso mediante usuario y contraseña

Modificaremos el fichero docker-compose.yml

services:
  custom_registry:
    container_name: custom_registry
    image: registry:2
    restart: unless-stopped
    environment:
        - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data
        - REGISTRY_AUTH=htpasswd
        - REGISTRY_AUTH_HTPASSWD_REALM=Custom registry
        - REGISTRY_AUTH_HTPASSWD_PATH=/htpasswd
    ports:
        - "5000:5000"
    volumes:
        - ./data:/data
        - ./htpasswd:/htpasswd

Utilizaremos htpasswd para generar las credenciales necesarias en un fichero. Si fuera necesario instalarlo el comando es apt install apache2-utils.

htpasswd -Bc ./htpasswd usuario

A partir de este momento para hacer un push o pull deberemos autenticarnos.

docker login https://dominio.com

Las credenciales pueden quedar almacendas en un el fichero .docker/config.json en texto claro.

Cerrar la sesión

docker logout https://dominio.com

Habilitar borrador de imágenes. Es necesario añádir la variable de entorno.

environment:
    - REGISTRY_STORAGE_DELETE_ENABLED=true