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?
- Instalar dependencias
- Instala Docker y Docker-compose
- Configurar el Registro Privado de Docker
- 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.
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 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
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
– 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.
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.
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
– 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
– 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.
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
Y finalmente, la instalación y configuración del Registro Privado Docker con Nginx y Autenticación Básica se ha completado con éxito.