Cómo implementar un registro de imagen de contenedor de Linux personal/privado simple para uso interno

Un registro de imágenes almacena y versiones de imágenes de contenedores para su distribución a motores de tiempo de ejecución de contenedores como Docker, Podman, Y de otros. Las imágenes generalmente se extraen y empujan usando los comandos respectivos del tiempo de ejecución. Otra ventaja es que los registros pueden centralizar la distribución de imágenes en un entorno. La mayoría de los tiempos de ejecución vienen con registros predeterminados para extraer y enviar, pero es posible que desee tener su propio registro personal/privado donde pueda controlar qué imágenes están disponibles para sus tiempos de ejecución.

Este artículo describe los pasos necesarios para implementar un registro privado como contenedor y almacenar imágenes en /opt/registry para uso interno. Podman es el motor contenedor y htpasswd proporciona autenticación.

Índice

    Instalar Podman y httpd-tools

    Instala el podman paquete para ejecutar el registro. el httpd-tools paquete proporciona el htpasswd utilidad de autenticación.

    # yum install -y podman httpd-tools

    Crear registros para el registro.

    El registro se almacenará en /opt/registry/ en el sistema host y los directorios respectivos se montan en el contenedor que ejecuta el registro.

    # mkdir -p /opt/registry/{auth,certs,data}
    • el Autenticación subdirectorio almacena el htpasswd archivo utilizado para la autenticación.
    • el Certificados El subdirectorio almacena los certificados utilizados por el registro para
    • autenticación.
    • el Datos El directorio almacena las imágenes reales almacenadas en el registro.

    Notar - La creación de directorios en almacenamiento extraíble hace que el registro sea portátil para redes desconectadas/restringidas.

    Generar credenciales para acceder al registro

    La autenticación es proporcionada por un simple htpasswd archivo, así como un par de claves SSL.

    htpasswd nombre de usuario y contraseña

    Utilizar el htpasswd utilidad para generar un archivo que contiene las credenciales para acceder al registro:

    # htpasswd -bBc /opt/registry/auth/htpasswd registryuser registryuserpassword
    • B proporciona la contraseña a través del comando.
    • B almacena la contraseña utilizando el cifrado Bcrypt.
    • contra crea el archivo.
    • nombre del usuario es el usuario del registro.
    • Contraseña es la contraseña para el usuario de registro.

    Un archivo Bcrypt Htpasswd llamado htpasswd se creará en el /opt/registry/auth/ directorio telefónico.

    Par de llaves TLS

    El registro está protegido con TLS mediante una clave y un certificado firmado por una autoridad de confianza (interna o externa) o por un simple certificado autofirmado. Para utilizar un certificado autofirmado:

    # openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/registry/certs/domain.key -x509 -days 365 -out /opt/registry/certs/domain.crt
    • requerimiento indica a OpenSSL que genere y procese solicitudes de certificados.
    • -nueva llave indica a OpenSSL que cree una nueva clave privada y una solicitud de certificado correspondiente.
    • rsa: 4096 le dice a OpenSSL que genere una clave RSA con 4096 bits.
    • -nodos le dice a OpenSSL que no hay requisitos de contraseña para la clave privada. La clave privada no se cifrará.
    • -sha256 le dice a OpenSSL que use sha256 para firmar la solicitud.
    • -keyout le dice a OpenSSL el nombre y la ubicación para almacenar la nueva clave.
    • -x509 le dice a OpenSSL que genere un certificado autofirmado.
    • -días le dice a OpenSSL la cantidad de días que el par de claves es válido.
    • -fuera de le dice a OpenSSL dónde almacenar el certificado.

    Ingrese las opciones respectivas para su certificado. el CN = value es el nombre de host de su host. El nombre de host del host debe poder resolverse mediante DNS o el /etc/hosts archivar.

    Notar: si el registro no está protegido mediante TLS, el parámetro no protegido en el /etc/Contenedores/registries.conf es posible que deba configurarse para el registro.

    El certificado también deberá ser aprobado por sus anfitriones y clientes:

    # cp /opt/registry/certs/domain.crt /etc/pki/ca-trust/source/anchors/
    # update-ca-trust
    # trust list | grep -i "<hostname>"

    Iniciar el registro

    El siguiente paso es ejecutar la imagen de registro con un puerto expuesto (5000) y volúmenes montados desde los respectivos directorios creados previamente.

    El comando para iniciar el registro:

    # podman run --name myregistry 
    -p 5000:5000 
    -v /opt/registry/data:/var/lib/registry:z 
    -v /opt/registry/auth:/auth:z 
    -e "REGISTRY_AUTH=htpasswd" 
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd 
    -v /opt/registry/certs:/certs:z 
    -e "REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt" 
    -e "REGISTRY_HTTP_TLS_KEY=/certs/domain.key" 
    -e REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED=true 
    -d 
    docker.io/library/registry:latest

    Los detalles de las opciones son:

    • - nombrar mi registro nombra el contenedor.
    • -p 5000: 5000 expone el puerto 5000 en el contenedor como puerto 5000 en el host.
    • -v/opt/registro/datos:/var/lib/registro:z marcos /opt/registry/data en el anfitrión como /var/lib/registry en el contenedor con el contexto SELinux correcto.
    • -v/opt/registro/auth:/auth:z marcos /opt/registry/auth en el anfitrión como /auth en el contenedor con el contexto SELinux correcto.
    • -v opt / registro / certificados: / certificados: z marcos /opt/registry/certs en anfitriones como /certs en el contenedor con el contexto SELinux correcto.
    • -e "REGISTRO_AUTH = htpasswd" usa un bcrypt cripta htpasswd archivo para la autenticación. Ubicación del archivo definida por la variable de entorno REGISTRY_AUTH_HTPASSWD_PATH del contenedor.
    • -e "REGISTRY_AUTH_HTPASSWD_REALM = Reino de registro" especifica el dominio a usar para htpasswd.
    • -e REGISTRY_AUTH_HTPASSWD_PATH = / auth / htpasswd usa bcrypt-encrypted /auth/htpasswd archivo en el contenedor.
    • -e "REGISTRO_HTTP_TLS_CERTIFICADO = /certificados/dominio.crt" define la ruta al archivo del certificado.
    • -e "REGISTRY_HTTP_TLS_KEY = /certificados/dominio.clave" define la ruta a la clave privada.
    • -e REGISTRO_COMPATIBILIDAD_ESQUEMA1_ENABLED = verdadero proporciona compatibilidad con versiones anteriores para los manifiestos schema1.
    • -d docker.io/library/registry:último es una aplicación de registro que permite el almacenamiento y distribución de imágenes.

    Notar: si se ejecuta un firewall en los hosts, será necesario permitir el puerto expuesto (5000).

    # firewall-cmd --add-port=5000/tcp --zone=internal --permanent
    # firewall-cmd --add-port=5000/tcp --zone=public --permanent
    # firewall-cmd --reload

    Consultar acceso al registro

    el curl El comando se puede utilizar para acceder al registro:

    # curl https://hostname:5000/v2/_catalog
    {"repositories":[]}

    El certificado se puede verificar usando:

    # openssl s_client -connect <servername>:5000 -servername <servername>

    Asegúrese de confiar en el certificado anterior o use curl -k alternar para ignorar la verificación del certificado.

    Trabajar con el registro

    El registro se puede ver y utilizar como cualquier otro registro, como registry.access.tipstecnologicos.es, registry.redhat.io, docker.io, y O quay.io.

    Iniciar sesión en el registro

    Utilizar el podman login comando para conectarse al registro:

    # podman login <hostname>:5000
    Enter Username:xxxxxxxx
    Enter Password:yyyyyyyy
    Login Succeeded!

    Sus credenciales estarán codificadas en Base64 en /run/user/0/Contenedores/auth.json por defecto.

    Cuando se trabaja con OpenShift y se usa un registro alternativo/espejo para entornos desconectados/inactivos, el contenido de este archivo se puede agregar a su archivo secreto de extracción. También puede agregar su archivo de extracción secreto como una opción de línea de comando para podman login y sus credenciales se agregarán al archivo al iniciar sesión.

    # podman login <hostname>:5000 --authfile <pull secret file>
    Enter Username:xxxxxxxx
    Enter Password:yyyyyyyy
    Login Succeeded!

    Salir del registro

    Usar podman logout para salir del registro:

    # podman logout <hostname>:5000
    Removed login credentials for registry.tkagn.io:5000

    Los identificadores serán eliminados de /run/user/0/Contenedores/auth.json o desde cualquier archivo que especifique a través del --authfile ajuste.

    Empujar/tirar imágenes al registro

    Para extraer imágenes del registro, agregue la ubicación del registro al nombre del repositorio/imagen.

    Ejemplo: tirar podman ://

    Para empujar al registro, use podman tag para marcar primero la imagen y la ubicación del registro, luego presione la imagen.

    Ejemplo: etiqueta podman