Docker Registry o 'Registry' es una aplicación del lado del servidor de código abierto y altamente escalable que se puede usar para almacenar y distribuir imágenes de Docker. Era una aplicación del lado del servidor detrás de Docker Hub. En la mayoría de los casos de uso, Docker Registry es una excelente solución si desea implementar el sistema CI/CD en el desarrollo de su aplicación. El registro privado de Docker brinda más rendimiento para el ciclo de desarrollo y producción al centralizar todas sus imágenes personalizadas de aplicación de Docker en un solo lugar.
En este tutorial, le mostraremos cómo instalar y configurar un registro privado de Docker en un servidor Ubuntu 18.04. Usaremos 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 18.04
- Privilegios de raíz
¿Qué haremos?
- Instalar dependencias
- Instalar Docker y Docker-compose
- Configurar registro privado de Docker
- Pruebas
Paso 1:Instalar las dependencias del paquete
En primer lugar, vamos a instalar algunas dependencias de paquetes para implementar el registro privado de Docker.
Instale las dependencias de los paquetes usando el siguiente comando.
sudo apt install -y gnupg2 pass apache2-utils httpie
Los paquetes gnupg2 y pass se utilizarán para almacenar la autenticación de contraseña en el registro de Docker. Y apache2-utils se usará para generar la autenticación básica, y httpie se usará para la prueba.
Paso 2:instalar Docker y Docker-compose
Ahora vamos a instalar docker y docker-compose desde el repositorio oficial de Ubuntu.
Instale Docker y Docker-compose ejecutando el siguiente comando.
sudo apt install -y docker.io docker-compose -y
Una vez finalizada la instalación, inicie el servicio docker y agréguelo al tiempo de arranque.
sudo systemctl start docker
sudo systemctl enable docker
El Docker está en funcionamiento y se ha instalado Docker-compose. Compruébalo usando el siguiente comando.
docker version
docker-compose version
Y se le mostrará la versión de Docker y Docker-compose instalada en su sistema.
Paso 3:configurar el registro privado de Docker
En este paso, vamos a configurar el entorno de registro de Docker mediante la creación de un entorno de directorios y crearemos alguna configuración que incluya docker-compose.yml, host virtual nginx y configuración adicional, etc.
- Crear directorios de proyectos
Cree un nuevo directorio para el proyecto llamado 'registro' y cree los directorios 'nginx' y 'auth' dentro.
mkdir -p registry/{nginx,auth}
Después de eso, vaya al directorio 'registro' y cree nuevos directorios nuevamente dentro de 'nginx'.
cd registry/
mkdir -p nginx/{conf.d/,ssl}
Y como resultado, los directorios del proyecto se ven como la siguiente imagen.
tree
- Crear secuencia de comandos compuesta por Docker
Ahora queremos crear un nuevo script docker-compose.yml para implementar Docker Registry.
Vaya al directorio 'registro' y cree un nuevo archivo de configuración 'docker-compose.yml'.
cd registry/
vim docker-compose.yml
En primer lugar, defina la versión de redacción que desea utilizar y el servicio.
version: '3'
services:
Después de eso, agregue el primer servicio llamado 'registro'. El servicio de registro de Docker utilizará la imagen de Docker proporcionada por el equipo de Docker 'registry:2. Montará el volumen acoplable 'registrydata' y el directorio local llamado 'auth' que contiene el archivo de autenticación básico 'registry.passwd'. Y por último, se ejecutará en la imagen acoplable 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 '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, defina la red personalizada 'mynet' con un controlador de puente y 'registrydata' con un controlador local.
#Docker Networks networks: mynet: driver: bridge #Volumes volumes: registrydata: driver: local
Guarde y cierre 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 host virtual Nginx
Después de crear el script docker-compose, crearemos el host virtual y la configuración adicional para el servicio nginx.
Vaya al directorio 'nginx/conf.d/' y cree un nuevo archivo de host virtual llamado 'registry.conf'.
cd nginx/conf.d/
vim registry.conf
Pegue 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; } }
Guardar y cerrar.
A continuación, cree una configuración adicional para aumentar max_body_size en nginx. Esto le permitirá cargar imágenes acoplables con un tamaño máximo de 2 GB.
vim additional.conf
Pegue la configuración a continuación.
client_max_body_size 2G;
Guardar y cerrar.
- Configurar certificado SSL y autenticación básica
Copie los archivos de certificado SSL de su dominio en el directorio 'ssl'.
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
Ahora vaya al directorio 'auth' y genere el nuevo archivo de contraseña 'registry.passwd'.
cd auth/
Genere una nueva contraseña para el usuario hakase.
htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORD
Y se ha completado la configuración del entorno para implementar Private Docker Registry.
A continuación se muestra la captura de pantalla de los archivos y directorios de nuestro entorno.
tree
- Ejecutar el registro de Docker
Ejecute Docker Registry con el siguiente comando docker-compose.
docker-compose up -d
Y obtendrá el resultado como se muestra a continuación.
Después de eso, asegúrese de que el servicio de registro y nginx esté en funcionamiento. Verifique usando el siguiente comando.
docker-compose ps
netstat -plntu
Y se le mostrará que el servicio de 'registro' se está ejecutando en el puerto '5000', y el servicio 'nginx' expondrá los puertos HTTP y HTTPS como se muestra a continuación.
Paso 4 - Prueba
Antes de probar nuestro Registro privado de Docker, debemos agregar el certificado de CA raíz a la ventana acoplable y al sistema.
Si está utilizando el certificado de archivo pem, expórtelo al archivo .crt mediante el comando OpenSSL.
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
Ahora cree un nuevo directorio para el certificado de la ventana acoplable y copie el certificado de CA raíz en él.
mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/
Y luego cree un nuevo directorio '/usr/share/ca-certificate/extra' y copie el certificado raíz CA en él.
mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
Después de eso, vuelva a configurar el paquete 'ca-certificate' y reinicie el servicio Docker.
dpkg-reconfigure ca-certificates
systemctl restart docker
- Descargar imagen de Docker
Descargue la nueva imagen de Docker con el siguiente comando.
docker pull ubuntu:16.04
Cuando esté completo, etiquete la imagen para el registro privado con el siguiente comando.
docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16
Verifique nuevamente la lista de imágenes de Docker en el sistema y obtendrá nuevas imágenes como se muestra a continuación.
docker images
- Enviar imagen a un registro local privado
Inicie sesión en el Registro privado de Docker con el siguiente comando.
docker login https://registry.hakase-labs.io/v2/
Escriba el nombre de usuario y la contraseña según el archivo 'registry.htpasswd'.
Ahora verifique la imagen disponible de la ventana acoplable en el Registro.
http -a hakase https://registry.hakase-labs.io/v2/_catalog
Y no hay una imagen acoplable en el Registro.
Ahora inserte nuestra imagen personalizada en el Registro privado de Docker.
docker push registry.hakase-labs.io/ubuntu16
Verifique nuevamente y asegúrese de obtener la imagen acoplable 'ubuntu16' en el repositorio privado.
http -a hakase https://registry.hakase-labs.io/v2/_catalog
Y finalmente, la instalación y configuración de Private Docker Registry con Nginx y Basic Authentication se ha completado con éxito.