Cómo configurar un registro Docker privado en Ubuntu 22.04

Docker Registry o ‘Registro’ es una aplicación del lado del servidor de código abierto y altamente escalable que puede utilizarse para almacenar y distribuir imágenes Docker. Se trata de una aplicación del lado del servidor detrás del Docker Hub. En la mayoría de los casos de uso, un Registro Docker es una gran solución si quieres implementar el sistema CI/CD en el desarrollo de tu aplicación. El Registro Docker Privado proporciona más prestaciones para el ciclo de desarrollo y producción al centralizar todas tus imágenes Docker personalizadas de la aplicación en un único lugar.

En este tutorial, vamos a mostrarte cómo instalar y configurar un Registro Privado Docker en un servidor Ubuntu 22.04. Utilizaremos un servidor web Nginx y protegeremos el Registro con un nombre de usuario y una contraseña (autenticación básica).

Requisitos previos

  • Servidor Ubuntu 22.04
  • Privilegios de root

¿Qué vamos a hacer?

  1. Instalar dependencias
  2. Instala Docker y Docker-compose
  3. Configurar el Registro Privado de Docker
  4. Probar

Paso 1 – Instalar dependencias de paquetes

En primer lugar, vamos a instalar algunas dependencias de paquetes para desplegar el Registro Privado Docker.

Instala las dependencias de los paquetes utilizando el siguiente comando.

sudo apt install -y gnupg2 pass apache2-utils httpie

Los paquetes gnupg2 y pass se utilizarán para almacenar la contraseña de autenticación en el registro Docker. Y los paquetes apache2-utils se utilizarán para generar la autenticación básica, y httpie se utilizará para las pruebas.

Paso 2 – Instalar Docker y Docker-compose

Ahora vamos a instalar Docker y Docker-compose desde el repositorio oficial de Ubuntu.

Instala Docker y Docker-compose ejecutando el siguiente comando.

sudo apt install -y docker.io docker-compose -y

Una vez finalizada la instalación, inicia el servicio docker y añádelo al tiempo de arranque.

sudo systemctl start docker
sudo systemctl enable docker

Docker está en marcha y Docker-compose se ha instalado. Compruébalo utilizando el siguiente comando.

docker version
docker-compose version

Y se te mostrará la versión de Docker y Docker-compose instalada en tu sistema.

Instalar Docker

Paso 3 – Configurar el Registro Privado de Docker

En este paso, vamos a configurar el entorno del Registro Docker creando algunos directorios del entorno, y crear algunas configuraciones incluyendo el docker-compose.yml, el host virtual nginx y la configuración adicional, etc.

– Crear directorios del proyecto

Crea un nuevo directorio para el proyecto llamado ‘registry’ y crea dentro los directorios ‘nginx’ y ‘auth’.

mkdir -p registry/{nginx,auth}

Después, ve al directorio ‘registry’ y vuelve a crear nuevos directorios dentro de ‘nginx’.

cd registry/
mkdir -p nginx/{conf.d/,ssl}

Y como resultado, los directorios del proyecto tendrán el aspecto de la siguiente imagen.

tree

Crear directorios para el Registro Docker

– Crear Script Docker-compose

Ahora queremos crear un nuevo script docker-compose.yml para desplegar el Registro Docker.

Ve al directorio ‘registry’ y crea un nuevo archivo de configuración ‘docker-compose.yml’.

cd registry/
vim docker-compose.yml

En primer lugar, define la versión de compose que quieres utilizar y el servicio.

version: '3'
services:

Después, añade el primer servicio llamado ‘registry’. El servicio Docker Registry utilizará la imagen docker proporcionada por el equipo docker ‘registry:2’. Montará el volumen docker ‘registrydata’ y el directorio local llamado ‘auth’ que contiene el archivo de autenticación básica ‘registry.passwd’. Y por último, se ejecutará en la imagen docker personalizada denominada ‘mynet’ y expondrá el puerto 5000 tanto en el contenedor como en el host.

#Registry
  registry:
    image: registry:2
    restart: always
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registrydata:/data
      - ./auth:/auth
    networks:
      - mynet

A continuación, la configuración del servicio ‘nginx’ que ejecutará los puertos HTTP y HTTPS y montará el directorio local ‘conf.d’ para la configuración del host virtual, y el ‘ssl’ para los certificados ssl.

#Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

Y por último, define la red personalizada ‘mynet’ con el controlador bridge y el ‘registrydata’ con un controlador local.

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  registrydata:
    driver: local

Guarda y cierra la configuración.

A continuación se muestra la configuración completa:

version: '3'
services:

#Registry
  registry:
    image: registry:2
    restart: always
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registrydata:/data
      - ./auth:/auth
    networks:
      - mynet

#Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  registrydata:
    driver: local

– Configurar el host virtual Nginx

Tras crear el script docker-compose, crearemos el host virtual y la configuración adicional para el servicio nginx.

Ve al directorio ‘nginx/conf.d/’ y crea un nuevo archivo de host virtual llamado ‘registry.conf’.

cd nginx/conf.d/
vim registry.conf

Pega la siguiente configuración.

upstream docker-registry {
    server registry:5000;
}

server {
    listen 80;
    server_name registry.hakase-labs.io;
    return 301 https://registry.hakase-labs.io$request_uri;
}

server {
    listen 443 ssl http2;
    server_name registry.hakase-labs.io;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
        # Do not allow connections from docker 1.5 and earlier
        # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
        if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" )  {
            return 404;
        }

        proxy_pass                          http://docker-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;
    }

}

Guárdalo y ciérralo.

A continuación, crea una configuración adicional para aumentar el max_body_size en nginx. Esto te permitirá subir imágenes docker con un tamaño máximo de 2GB.

vim additional.conf

Pega la configuración siguiente.

client_max_body_size 2G;

Guarda y cierra.

– Configurar el certificado SSL y la autenticación básica

Copia los archivos del certificado SSL de tu dominio en el directorio ‘ssl’.

cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/

Ahora ve al directorio ‘auth’ y genera el nuevo archivo de contraseña ‘registry.passwd’.

cd auth/

Genera una nueva contraseña para el usuario hakase.

htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORD

Proteger el registro con contraseña

Y la configuración del entorno para desplegar el Registro Docker Privado se ha completado.

A continuación se muestra la captura de pantalla de los archivos y directorios de nuestro entorno.

tree

Lista del directorio

– Ejecutar el Registro Docker

Ejecuta el Registro Docker utilizando el siguiente comando docker-compose.

docker-compose up -d

Y obtendrás el resultado que se muestra a continuación.

Iniciar el Registro Docker

Después, asegúrate de que el registro y el servicio nginx están en funcionamiento. Compruébalo utilizando el siguiente comando.

docker-compose ps
netstat -plntu

Y se te mostrará que el servicio ‘registry’ se está ejecutando en el puerto ‘5000’, y el servicio ‘nginx’ expondrá los puertos HTTP y HTTPS como se indica a continuación.

Comprueba el servicio Nginx

Paso 4 – Probando

Antes de probar nuestro Registro Privado Docker, necesitamos añadir el certificado de CA Raíz al propio docker y al sistema.

Si estás utilizando el certificado del archivo pem, expórtalo al archivo .crt utilizando el comando OpenSSL.

openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt

Ahora crea un nuevo directorio para el certificado docker y copia en él el certificado de la CA Raíz.

mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/

A continuación, crea un nuevo directorio ‘/usr/share/ca-certificate/extra’ y copia en él el certificado de la CA Raíz.

mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/

Después, reconfigura el paquete ‘ca-certificate’ y reinicia el servicio Docker.

dpkg-reconfigure ca-certificates
systemctl restart docker

Crear certificado SSL

– Descarga la imagen Docker

Descarga la nueva imagen Docker utilizando el siguiente comando.

docker pull ubuntu:16.04

Cuando esté completa, etiqueta la imagen para el registro privado con el siguiente comando.

docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16

Comprueba de nuevo la lista de imágenes Docker del sistema y obtendrás nuevas imágenes como las que se muestran a continuación.

docker images

Descargar imagen Docker

– Empujar la imagen al registro local privado

Accede al Registro Privado Docker utilizando el siguiente comando.

docker login https://registry.hakase-labs.io/v2/

Escribe el nombre de usuario y la contraseña basados en el archivo ‘registry.htpasswd’.

Ahora comprueba la disponibilidad de la imagen docker en el Registro.

http -a hakase https://registry.hakase-labs.io/v2/_catalog

Y no hay ninguna imagen Docker en el Registro.

Empujar imagen a registro local privado

Ahora empuja nuestra imagen personalizada al Registro Docker Privado.

docker push registry.hakase-labs.io/ubuntu16

Comprueba de nuevo y asegúrate de que tienes la imagen docker ‘ubuntu16’ en el Repositorio Privado.

http -a hakase https://registry.hakase-labs.io/v2/_catalog

Registro Push

Y finalmente, la instalación y configuración del Registro Privado Docker con Nginx y Autenticación Básica se ha completado con éxito.

Referencia

Scroll al inicio