Crear un docker registry proxy

Hace poco el registry oficial de docker (desde donde se descargan las imagenes por defecto) ha sido limitado a algunos 20 pulls al día. Una forma de no verse afectado por esta restricción es crear un docker registry proxy para que se descargue las imágenes desde tu docker registry y no desde el oficial.

¿Cómo funciona?

Cuando intentas descargar una imagen desde el docker registry proxy lo primero que hace el docker registry proxy es ver si tiene la imagen descargada:

  • Si la tiene descargada: se la entrega al cliente que hace la petición
  • Si no la tiene en local: La descarga y luego la entrega

Por lo que siempre estamos nos influye el limite si vamos a descargar 20 imágenes el mismo día y no hemos descargado ninguna de ellas nunca desde nuestro docker registry proxy.

Si ya las hemos descargado, por ejemplo tenemos un entorno de CI/CD siempre haciendo pruebas usando las mismas imágenes de base o cosas similares, utilizaremos la imagen descargada en nuestro servidor y evitaremos el limite.

¿Cómo creamos un docker registry proxy?

Crear un docker registry proxy es una tarea muy sencilla. Rresumiendo un poco las tareas sería lo siguiente:

  1. Montar un contenedor con la imagen de docker registry con parametros para hacer de proxy
  2. Configurar el fichero daemon.json para que nuestro daemon de docker use el registry recien creado
  3. Probar que funcione

Creando el contenedor de docker registry

Lo primero que debemos hacer es crear los directorios donde se crearan los certificados. Estos directorios se montarán en el contenedor:

mkdir -p /virt/docker/dockerregistry-cache/certs/

Después creamos el certificado respondiendo a las preguntas que nos haga OpenSSL sobre nosotros y nuestra organización (¡Ojo! es un certificado autofirmado)

##Docker Registry Cache
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /virt/docker/dockerregistry-cache/certs/registry.key -out /virt/docker/dockerregistry-cache/certs/registry.crt

Las preguntas que hará OpenSSL son las siguientes:

# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /virt/docker/dockerregistry-cache/certs/registry.key -out /virt/docker/dockerregistry-cache/certs/registry.crt
Generating a RSA private key
....................................+++++
......................................................+++++
writing new private key to '/virt/docker/dockerregistry-cache/certs/registry.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:MADRID
Locality Name (eg, city) []:MADRID
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyORG
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:MyOrg.org
Email Address []:mycorreo@mail.local

Finalmente levantamos el contenedor con los certificados que hemos creado

docker run -it -d --restart always  --hostname registry-proxy  --name registry-proxy \
  -v /virt/docker/dockerregistry-cache/_data/:/var/lib/registry/  \
  -v /virt/docker/dockerregistry-cache/certs:/certs  \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt\
  -e REGISTRY_HTTP_TLS_KEY=/certs/registry.key  \
  -e REGISTRY_PROXY_REMOTEURL="https://registry-1.docker.io" \
  -p 0.0.0.0:443:443 registry:2


Ultimo paso: Configurar docker para que use el docker registry proxy

Por ultimo tenemos que incluir la IP o el host donde tenemos corriendo el servicio del docker registry proxy. Como la IP de mi host es 192.168.1.23 es la que incluiré en el fichero. También he incluido algunas variaciones con el puerto porque en algunas versiones de docker da problemas:

# cat /etc/docker/daemon.json
{
"insecure-registries": [
"192.168.1.23",
"192.168.1.23:443",
"https://192.168.1.23",
"https://192.168.1.23:443"
],
"registry-mirrors": [
"https://192.168.1.23",
"https://192.168.1.23:443"
]
}

#

Ya configurado esto debes reiniciar el servicio de docker, en la mayoria de distribuciones Linux, teniendo systemd instalado se haría ejecutando:

systemctl restart docker

 

Se puede encontrar más información en:

https://docs.docker.com/registry/recipes/mirror/

https://docs.docker.com/registry/configuration/

Deja una respuesta