Introducción
Si desea garantizar un desarrollo de CI/CD fluido con la plataforma Docker, considere la posibilidad de configurar un registro privado de Docker. No solo acelera la entrega, sino que también es una forma práctica de distribuir recursos y compartir imágenes de Docker entre contenedores.
En este tutorial, aprenda a configurar un registro privado de Docker y configúrelo para accesibilidad externa.
Requisitos previos
- Acceso a una cuenta de usuario con sudo o raíz privilegios
- Un servidor cliente
- Un servidor para Docker Registry privado
- Docker y Docker–Compose en ambos servidores
- Nginx en el servidor Docker Registry privado
¿Qué es un registro privado de Docker
Registro de Docker es una aplicación del lado del servidor y parte del producto de plataforma como servicio de Docker. Le permite almacenar localmente todas sus imágenes de Docker en una ubicación centralizada.
Cuando configura un registro privado, asigna un servidor para comunicarse con Docker Hub a través de Internet. La función del servidor es extraer y enviar imágenes, almacenarlas localmente y compartirlas entre otros hosts de Docker.
Al ejecutar un registro accesible desde el exterior, puede ahorrar recursos valiosos y acelerar los procesos. El software le permite extraer imágenes sin tener que conectarse a Docker Hub, ahorrando ancho de banda y protegiendo el sistema de posibles amenazas en línea.
Los hosts de Docker pueden acceder al repositorio local a través de una conexión segura y copiar imágenes del registro local para crear sus propios contenedores.
Antes de empezar
Como se indica en la sección de requisitos previos, la guía asume que ya tiene Docker y Docker-Compose instalados en todos los servidores.
Para verificar que tiene el software requerido, puede verificar sus versiones de lanzamiento con los comandos:
docker version
docker-compose version
Otra cosa que querrá asegurarse es que el servicio Docker se haya iniciado y esté configurado para habilitarse en el momento del arranque:
sudo systemctl start docker
sudo systemctl enable docker
Instalar y configurar el registro privado de Docker
Paso 1:crear directorios de registro
Comience a configurar el servidor que alojará el registro privado. Primero desea crear un nuevo directorio que almacenará todos los archivos de configuración necesarios.
1. El siguiente comando crea un nuevo directorio de proyecto con la etiqueta registry
y dos subdirectorios - nginx
y auth
:
mkdir -p registry/{nginx, auth}
2. Mover a registry
y crea dos nuevos directorios dentro de nginx
:
cd registry/
mkdir -p nginx/{conf.d/,ssl}
3. Vea la jerarquía de los directorios recién creados escribiendo:
tree
Paso 2:Crear Docker-Compose Script y definir servicios
A continuación, debe crear y configurar un nuevo docker-compose.yml
texto. El script define la versión de Docker-Compose, así como los servicios que necesita para configurar un registro privado.
1. Cree un nuevo archivo, mientras está en el registry
directorio, con un editor de texto de su preferencia:
nano docker-compose.yml
2. Hay algunas cosas que debe definir en este archivo de configuración, así que siga de cerca y agregue cuidadosamente cada sección del contenido:
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
3. Guarde y cierre el archivo.
La configuración explicada:
En primer lugar, define la versión de Docker-Compose que desea utilizar. En este ejemplo, es version: '3'
. Luego pasa a definir todos los componentes del registro de Docker, comenzando con #Registry
servicio.
Docker Registry es esencialmente un contenedor que ejecuta la imagen de registro, por lo que la imagen se define como registry:2
.
Agregar el restart: always
line garantiza que inicie Docker Registry como un servicio tan pronto como inicie el sistema.
Determinación de los puertos 5000:5000
indica a Docker que el host y el contenedor en ejecución se comunican a través de los números de puerto definidos.
El servicio montará el volumen acoplable registrydata
y el directorio local auth
, junto con su archivo de autenticación registry.passwd
.
El siguiente elemento es el #Nginx Service
. La configuración describe que el servicio se ejecuta en los puertos 80:80
(HTTPS) y 443:443
(HTTPS). Montará el directorio local para la configuración virtual (conf.d
) y certificados SSL (ssl
).
Finalmente, configura mynet
con un controlador de puente y los registrydata
con un controlador local como parámetros para la red personalizada.
Paso 3:configurar el reenvío de puertos Nginx
El siguiente paso es configurar un host virtual Nginx y configurarlo para el servicio Nginx.
1. Vaya a nginx/conf.d/
directorio que creó en el paso anterior:
cd nginx/conf.d/
2. Cree un nuevo archivo de host virtual llamado registry.conf
:
nano registry.conf
3. Agregue el siguiente contenido:
upstream docker-registry {
server registry:5000;
}
server {
listen 80;
server_name registry.example-server.com;
return 301 https://registry.example-server.com$request_uri;
}
server {
listen 443 ssl http2;
server_name registry.example-server.com;
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;
}
}
4. Guarde el archivo y regrese al terminal.
Paso 4:Aumente el tamaño de carga del archivo Nginx
De forma predeterminada, Nginx limita el tamaño de carga del archivo a 1 MB. . Dado que muchas imágenes de Docker superan este número, la mejor práctica es aumentar el tamaño máximo de archivo en Nginx. Asegúrese de que puede cargar imágenes que tengan un tamaño de archivo más grande configurando max_body_size
a 2GB .
1. Cree un archivo de configuración adicional con:
nano additional.conf
2. Agregue la siguiente línea en el archivo:
client_max_body_size 2G;
3. Guarde y cierre el archivo.
Paso 5:configurar el certificado SSL y la autenticación básica
1. Los archivos de certificados SSL de su dominio deben copiarse en ssl
directorio. Para ello, ejecute los comandos:
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
2. Luego, vaya a auth
directorio:
cd auth
3. Y solicite un nuevo archivo de contraseña llamado registry.passwd
para su usuario:
htpasswd -Bc registry.passwd example
4. Escriba una contraseña segura y vuelva a escribirla para confirmar. Con esto, ha agregado una contraseña para su usuario.
Paso 6:agregue el certificado de CA raíz
Ahora debe agregar el certificado de CA raíz a Docker y al sistema en el que está trabajando.
1. Exporte el .crt
archivo con OpenSSL escribiendo:
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
2. Copie el certificado raíz en un nuevo directorio para certificados de Docker:
mkdir -p /etc/docker/certs.d/registry.example-server.com/
cp rootCA.crt /etc/docker/certs.d/example-server.com/
3. A continuación, copie el mismo certificado en otro directorio nuevo con el nombre /usr/share/ca-certificate/extra
:
mkdir -p .usr.share.ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
4. Vuelva a configurar el ca-certificate
recién creado paquete escribiendo:
dpkg-reconfigure ca-certificates
5. Finalmente, reinicie el servicio Docker:
systemctl restart docker
Paso 7:Ejecute el registro de Docker
Con todo configurado y listo, puede crear el contenedor Docker Registry utilizando Docker-Compose:
docker-compose up -d
Compruebe si el Registro y los servicios de Nginx se están ejecutando:
docker-compose ps
netstat -plntu
La salida debería mostrarle los servicios y sus puertos asignados.
Extraer imagen de Docker Hub a un registro privado
1. Para almacenar localmente una imagen de Docker Hub en su registro privado, utilice docker pull
comando:
docker pull [docker_image]
2. Agregue una etiqueta a la imagen para etiquetarla para el registro privado:
docker image tag [docker_image] registry.example-server.com/[new_image_name]
3. Puede verificar si la imagen de Docker está disponible localmente solicitando al sistema que enumere todas las imágenes almacenadas localmente:
docker images
Cómo enviar una imagen de Docker a un registro privado
1. Para enviar una imagen desde un host de Docker al servidor de registro privado de Docker, primero debe iniciar sesión en el registro con el comando:
docker login https://registry.example-server.com/v2/
2. Escriba el nombre de usuario y contraseña que definió para el host virtual.
3. Ahora puede enviar su imagen al registro privado con el comando:
docker push registry.example-server.com/[new_image_name]
4. Vea una lista de imágenes almacenadas en el registro privado de Docker:
http -a example https://registry.example-server.com/v2/_catalog