Con docker podemos gestionar el almacenamiento y distribución de imagenes de forma privada utilizando la imagen registry
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
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;
}
}
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