Skip to content

Tema:

Publicacion de imagenes en un registry.


Introducción

En esta guía aprenderemos que es un image registry, como funciona y como subir imagenes de nuestras aplicaciones al mismo


Objetivo

Objetivo General:

  • El objetivo de la practica es subir imagenes de aplicativos a un image registry.

Desarrollo del Tema

Un Image Registry es un sistema de almacenamiento y distribución de imágenes de contenedor. Su función es comparable a la de un “repositorio de código” pero aplicado a imágenes: en lugar de guardar archivos de texto, guarda imágenes construidas listas para ser ejecutadas.

En un flujo de trabajo con contenedores (Docker, Podman, Kubernetes, OpenShift, etc.), el registry es un punto clave dentro del ciclo de vida de las aplicaciones.

Estructura Básica de un Registry

  1. Registry → el servicio completo.
  2. Ejemplo: registry.gitlab.com, quay.io, harbor.miempresa.com.

  3. Repository → dentro del registry, cada aplicación o proyecto tiene un repositorio de imágenes.

  4. Ejemplo: quay.io/empresa/app-backend

  5. Tags → dentro del repositorio, cada versión de la imagen se identifica con un tag.

  6. Ejemplo:
    • app-backend:1.0
    • app-backend:1.1
    • app-backend:latest

El tag funciona como una etiqueta de referencia que apunta a una imagen específica. Aunque latest suele ser usado como valor por defecto, no es una versión fija y puede cambiar.

🔄 Flujo Principal: Push & Pull

  1. Construcción
  2. Se crea una imagen con docker build o equivalente.

  3. Tagging

  4. Antes de subirla, se asocia a un registry y un tag:

    docker tag app-backend:1.0 quay.io/empresa/app-backend:1.0
    

  5. Push

  6. Se “empuja” la imagen al registry:
    docker push quay.io/empresa/app-backend:1.0
    
  7. El registry guarda las capas de la imagen y la asocia al tag indicado.

  8. Pull

  9. Cuando alguien quiere usar esa imagen en otra máquina o en Kubernetes:
    ```bash docker pull quay.io/empresa/app-backend:1.0

Importancia de los Tags

  • Permiten versionar imágenes como si fueran releases de software.
  • Evitan dependencias ambiguas: usar :1.0.0 es más predecible que :latest.
  • Facilitan estrategias de despliegue:
  • :dev → imágenes de desarrollo.
  • :qa → imágenes para testing.
  • :stable o :prod → imágenes listas para producción.

Laboratorio para el Estudiante

Acceder al laboratorio.

  1. Ingresar al servidor de laboratorio con la llave proporcionada.

    export LAB=X
    ssh student@lab-${LAB}-aio 
    

  2. Cambiar al usuario root

    sudo -i
    

  3. Instalar buildah para poder publicar las imagenes.

    dnf -y install buildah
    

Creacion de Imagen.

  1. Acceda a la carpeta java-demo
    cd java-demo
    
  2. Revise el contenido del archivo Dockerfile.jvm en la carpeta src/main/docker

  3. Empaquete nuevamente la aplicación con el script build-package.sh desde Docker

    nerdctl run -it --rm -v $PWD:/usr/src/app \
    -e APP_PATH=/usr/src/app \
    -e MVN_ARGS='-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests' \
    maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh
    

  4. Construya una imagen con el tag harbor.x-x-x-x.nip.io/apis/api-demo:1.0

    buildah build -t harbor.x-x-x-x.nip.io/api-test/api-test:1.0 -f /src/main/docker/Dockerfile.jvm .
    

  5. Ingresaremos a nuestra url de harbor y nos vamos a autenticar como administrador.

  6. En la pantalla principal crearemos un nuevo proyecto con el nombre de api-test. Los demas valores los dejaremos por defecto.

  7. Luego de esto nos iremos al menu de administration al lado izquierdo y buscaremos la parte de Users. Le daremos en New User, llenaremos los campos de la siguiente manera.

  8. Username: pull-image
  9. Email: example@example.com
  10. First and last name: pull
  11. Password: Pull1234
  12. Confirm Password: Pull1234

  13. Una vez creado este usuario vamos a volver al proyectod de api-test y dentro del mismo vamos a buscar la parte de Members dentro de la cual vamos a agregar nuestro nuevo usuario como un Mantainer del mismo.

  14. Con esto tenemos nuestro proyecto en harbor y un usuario el cual puede subir imagenes al mismo. Vamos a volver a nuestra maquina virtual en la carpeta de publish-image.

  15. Vamos a loguearnos a nuestro registry con el usuario pull generado antes.

    buildah login --tls-verify=false harbor.x-x-x-x.nip.io
    

  16. Vamos a pushear la imagen recien creada

    buildah push --tls-verify=false harbor.x-x-x-x.nip.io/api-test/api-test:1.0
    

  17. Una vez finalize el push de la imagen podemos validar en el proyecto que exista nuestra nueva imagen.

  18. Vamos a editar el archivo dentro de src/main/resources/application.properties de la siguiente manera

    # External variables
    txt.msg=${TXT:null}
    db.url=${DB_URL:null}
    
    # Internal properties
    quarkus.http.port=8080
    quarkus.custom.welcome.message=VERSION 1.1
    quarkus.java.version="OpenJDK 17"
    

  19. Compilamos nuevamente el codigo

    nerdctl run -it --rm -v $PWD:/usr/src/app \
    -e APP_PATH=/usr/src/app \
    -e MVN_ARGS='-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests' \
    maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh
    

  20. Vamos a crear una nueva imagen con el tag 1.1 y la vamos a subir al registry.

    buildah build -t harbor.x-x-x-x.nip.io/api-test/api-test:1.1 -f /src/main/docker/Dockerfile.jvm .
    
    buildah push --tls-verify=false harbor.x-x-x-x.nip.io/api-test/api-test:1.1
    

Reto!

Considere la aplicación hecha con Angular y NodeJS de la carpeta angular-demo:

  1. Cree un Dockerfile que corresponda al servidor web que necesita la aplicación

Conclusión

En este tema, hemos aprendido a crear imagenes de contenedor y a subirlas a un image registry.