Como instalar y usar Docker Distribution (Registry)

Docker Distribution, anteriormente conocido como Docker Registry, nos permite almacenar, entregar y distribuir contenido, específicamente relacionado con imágenes de Docker y contenedores, por lo que en este simple tutorial te mostrare como implementar un Docker Distribution en CentOS 7 para mantener el control y registro de tus imágenes para Docker.

Lo primero es que deberiamos tener instalado y corriendo Docker Engine, el servidor de pruebas tiene instalado CentOS 7 por lo que aca te dejo un enlace que te mostrara como instalarlo en esta distribucion GNU/Linux.

Primero, para poder habilitar nuestro Docker Distribution, deberemos crear nuestro certificado SSL, por lo que utilizaremos la herramienta del proyecto letsencrypt para crearla, primero deberemos clonar la herramienta desde github, ejecutando lo siguiente:

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Realizado lo anterior ingresaremos al directorio recien clonado y ejecutaremos la herramienta de letsencrypt, pero antes deberemos asegurarnos que los puertos 80 y 443 se ecuentran disponibles y que alguna otra aplicacion no se este ejcutando en estos puertos, y que se encuentra autorizado y filtrado en las reglas de NetFilter/IPTables. Ejecutamos:

$cd /opt/letsencrypt
$./letsencrypt-auto certonly --standalone -d registry.yourdomain.com

Al iniciar esta herramienta, se nos pedira una serie de requisitos como correo electronico y el dominio para el cual se va a generar el certificado.

Generadas exitosamente las llaves y certificados, copiaremos a todas ellas, hacia el directorio ubicado en /etc/docker/certs

$mkdir -p /etc/docker/certs
cp /etc/letsencrypt/archive/registry.yourdomain.com/* /etc/docker/certs

Es importante mencionar que tratemos de tener instaladas las ultimas versiones para Docker Engine tanto en el servidor de pruebas como en el equipo que usaremos para crear nuestras imágenes y contenedores.

Segundo, deberemos ubicar un directorio donde almacenaremos toda nuestra data, en mi caso he elegido usar la siguiente ruta: /opt/distribution/ , dentro estaría conformado por dos directorios uno llamado docker para almacenar la data de las imagenes y el otro llamado auth para almacenar el usuario y password con el que nos autenticaremos contra Docker Distribution.

tree /opt/distribution 
/opt/distribution
├── auth
│   └── htpasswd
└── docker

4 directories, 1 file

Creado lo anterior, ejecutaremos un contenedor para generar el usuario y el password que usaremos en el sistema de autenticación para Docker Distribution:

$ cd /opt/distribution
$ docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd

Solamente deberemos cambiar testuser por el usuario a utilizar y testpassword el password que le asignaras a ese usuario.

Ahora crearemos el contenedor para Docker Distribution y le setearemos los siguientes parametros:

$ cd /opt/distribution
$ docker create -it -p 80:5000 -p443:5000 -m="512m" --restart=always --name registry -h registry \
   -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" \
   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
   -v `pwd`/certs:/certs \
   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/cert1.pem \
   -e REGISTRY_HTTP_TLS_KEY=/certs/privkey1.pem \
   -v `pwd`/docker:/var/lib/registry \
   registry:2

Los parametros que he seteado son los siguientes:

-p 80:5000 : Le estoy diciendo que el puerto de escucha en nuestra IP publica es el 80.

-m="512m" : Estoy seteando que limite la RAM a 512M , esto luego se puede actualizar, aca te dejo un enlace al tutorial.

-v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" : Seteamos que monte como volumen, el directorio donde se encuentra el archivo con el password previamente generado.

-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd : Seteamos como variable de entorno para Docker Distribution la ruta donde se encuentra el password previamente generado.

-v `pwd`/docker:/var/lib/registry : Este parámetro es muy importante ya que le indicamos donde se almacenara la data de Docker Distribution y nos servirá a futuro si queremos mover el contenedor a otro servidor, podremos volver a crear el contenedor indicándole que use este directorio con nuestra data existente.

Iniciamos nuestro contenedor y verificamos:

$ docker ps | grep registry
e96ff8bf8a06        registry:2    "/entrypoint.sh /etc/"   16 minutes ago      Up 16 minutes   0.0.0.0:80->5000/tcp     registry​

Deberemos agregar lo siguiente en nuestro Docker Engine del equipo donde vamos a construir nuestras imágenes y demás contenedores, deberemos editar, para mi caso que estoy usando Fedora 24, el archivo /etc/sysconfig/docker e indicar la IP o dominio con lo siguiente:

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--insecure-registry registry.yourdomain.com'

Era necesario agregarlo por que Docker Engine , en mi equipo no cuenta con la CA de letsencrypt . Al final mi configuración tal cual como esta es:

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--bip=172.17.42.1/24 --dns 8.8.8.8 --dns 8.8.4.4 --dns=172.17.42.1 --insecure-registry 172.16.100.110:5000 --insecure-registry registry.yourdomain.com'

Luego de lo anterior reiniciamos el servicio para Docker Engine: systemctl restart docker .

Para verificar que esta funcionando correctamente el contenedor con Docker Distribution, ejecutamos lo siguiente:

$ curl -k https://USERNAME:[email protected]/v2/
$ { }

Y luego nos autenticamos utilizando el Docker Engine de nuestro computador:

$ docker login --username=USERNAME --password=PASSWORD https://registry.yourdomain.com/v2/
Login Succeeded

Bien, ahora vamos a descargar una imagen desde Docker Hub y luego colocarla en nuestro Docker Distribution, primero ejecutamos: docker pull zokeber/centos:latest y luego lo enviamos a nuestro Docker Engine

$ docker tag zokeber/centos registry.yourdomain.com/centos:latest
$ docker push registry.yourdomain.com/centos:latest

También podemos nuevamente hacer pull pero desde nuestro Docker Distribution:

$ docker pull registry.yourdomain.com/centos:latest

Tambien es posible crear imagenes a partir de nuestros contenedores que se encuentran creados y corriendo, en este ejemplo voy a crear un contenedor instalar algunos paquetes necesarios y luego enviarlo a nuestro Docker Distribution:

$ docker create -it --name centos-steroids -h centos-steroids registry.yourdomain.com/centos

Luego iniciamos el contenedor y para posterior instalarle algunos paquetes necesarios:

$ docker start centos-steroids && docker exec -it centos-steroids /bin/bash
[[email protected] ~]# yum install git net-tools vim -y

Comiteamos los cambios y los enviamos a nuestro Docker Distribution,

$ docker commit centos-steroids zokeber/centos-steroids:1.0.1
$ docker tag zokeber/centos-steroids:1.0.1 registry.yourdomain.com/centos-steroids:1.0.1
$ docker push registry.yourdomain.com/centos-steroids:1.0.1

Hasta aqui con esta receta. Cualquier duda que tengas, dejala en la caja de comentarios.