Objetivos

Al finalizar el tutorial el estudiante estará en capacidad de:

Requisitos para desarrollar el tutorial

En particular se utilizarán los siguientes recursos:

  1. Servicio de Docker y Docker compose, si no cuenta con ellos, puede referirse a los tutoriales de la semana 1 y 2 donde se explica más a detalle dicha instalación.
  2. gcloud SDK para acceder a los servicios del proveedor Google Cloud Platform a partir de la consola. En caso de no tenerla instalada puede consultar el siguiente manual de instalación:https://cloud.google.com/sdk/docs/install

Container Registry es un registro de contenedores / grupo de repositorios donde se almacenan y gestionan imágenes para posteriormente ser desplegadas con un entorno de contenedores como, por ejemplo, Docker o Kubernetes.

Google Artifact Registry es un registro de contenedores privado que permite a la organización administrar imágenes de contenedor y paquetes de lenguajes (como Maven y npm) en un solo lugar. Está completamente integrado a las herramientas y entornos de ejecución de Google Cloud y viene con compatibilidad para protocolos de artefactos nativos. Esto facilita la integración a las herramientas de CI/CD para configurar canalizaciones automatizadas.

Artifact Registry ofrece las siguientes características:

Para este tutorial manejaremos el repositorio de calculadora-numeros usado en los tutoriales pasados, en caso de no tenerlo clonado aún, puede consultarlo en el siguiente enlace. Trabajaremos sobre la rama feature/kubernetes-sum, para ello cambie la rama del repositorio actual a la respectiva rama, para hacerlo ejecute en su terminal:

user@192 ~ % git checkout feature/kubernetes-sum

Selección del proyecto

Debe verificar que el proyecto objetivo se encuentra seleccionado tanto en la consola de google cloud como en la consola local de su computador.

Para ello ingrese a la consola en google cloud (console.cloud.google.com) y verifique el ID del proyecto en el que se encuentra.

En el la terminal ejecute el siguiente comando para verificar que el ID de proyecto corresponde con el de la consola de google cloud:

gcloud config get-value project

En el caso que no esté configurado el proyecto en su ambiente local, ejecute.

gcloud config set project <ID-PROYECTO>

Regrese a la consola de Google Cloud Platform y habilite la siguiente API: Artifact Registry API. Para ello, busque Artifact Registry API en la barra de búsqueda de Google Cloud, allí obtendrá el siguiente resultado:

De click en habilitar.

Ya con el API activo, ingrese al servicio de Artifact Registry mediante el menú de servicios y seleccione la opción Artifact Registry > Repositorios. Tan pronto ingrese al servicio se listarán todos los repositorios existentes en el proyecto.

Seguidamente crea un nuevo repositorio haciendo clic en el icono Agregar (+).

Configure un nombre para el repositorio, en nuestro caso será uniandes-misw-native-calculadora-app y seleccione como formato Docker. Con respecto a la región donde se creará el repositorio, seleccione la opción us-central1. Para culminar haga clic en el botón Crear.

Con el repositorio creado, nuestro siguiente paso será autenticarnos para poder subir las imágenes de nuestros contenedores en él. Para ello abra su terminal local y autentíquese empleando el SDK gcloud de la siguiente manera.

gcloud auth configure-docker <REGION>-docker.pkg.dev

Dado a que la región en la cual creamos nuestro repositorio es la us-central1, el comando que debemos ejecutar será (Recuerde ejecutarlo dentro de la carpeta del proyecto calculadora-numeros):

user@192 ~ % gcloud auth configure-docker us-central1-docker.pkg.dev

Allí podrá obtener lo siguiente:

user@192 calculadora-numeros % gcloud auth configure-docker us-central1-docker.pkg.dev
Adding credentials for: us-central1-docker.pkg.dev
After update, the following will be written to your Docker config file located
at [/Users/andres.baron/.docker/config.json]:
 {
  "credHelpers": {
    "us-central1-docker.pkg.dev": "gcloud"
  }
}

Do you want to continue (Y/n)?  y

Docker configuration file updated.

De nuevo en GCP acceda al repositorio haciendo clic sobre su nombre.

Observe que no hay imágenes aún publicadas. Haciendo clic sobre el icono Copiar (justo al final del nombre del repositorio), vamos a copiar en nuestro portapapeles el identificador de acceso del repositorio.

Para subir nuestra imagen al repositorio es necesario construirla con la URI del repositorio donde se va a publicar. La URI se construye de la siguiente manera [3].

<REGION>-docker.pkg.dev/<ID-PROYECTO>/<NOMBRE-REPOSITORIO>/<IMAGEN>:<TAG>

Por lo tanto, debemos construir una nueva imagen usando el nombre suma y como tag 1.0 (puede usar otro nombre y tag si así lo desea). Recuerde que el ID del proyecto es único y que debe reemplazar este valor con el ID de su proyecto. A continuación, encontrará un ejemplo de la definición completa de la URI de la imagen:

us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0

Acceda al repositorio en su terminal y cree la imagen ejecutando el siguiente comando en la ruta donde está ubicado el archivo Dockerfile.

user@192 ~ % cd suma
user@192 ~ % docker build -t <URI> .

Para el caso del ejemplo quedaría de la siguiente forma:

user@192 ~ % docker build -t us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0 .

Podrá observar lo siguiente:

user@192 ~ % docker build -t us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0 .
[+] Building 1.3s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 843B                                       0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/python:3.8-alpine       1.1s
 => [internal] load build context                                          0.1s
 => => transferring context: 52.72kB                                       0.1s
 => [1/5] FROM docker.io/library/python:3.8-alpine@sha256:41ea2b8caa7fa37  0.0s
 => CACHED [2/5] COPY ./requirements.txt /app/requirements.txt             0.0s
 => CACHED [3/5] WORKDIR /app                                              0.0s
 => CACHED [4/5] RUN pip install -r requirements.txt                       0.0s
 => [5/5] COPY . /app                                                      0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:6b20677e1818afb7baacaf838458e493db2bd3e3abfc75fe330f1c607a9719ab                                                                                0.0s
 => => naming to us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0

Tan pronto finalice el proceso de creación de la imagen del repositorio podremos publicarla en el repositorio que hemos configurado. Para ello emplee la siguiente instrucción. El tiempo de subida de la imagen dependerá de su velocidad de conexión a internet. El comando general es:

user@192 ~ % docker push <URI>

Para el caso del ejemplo corresponde a:

user@192 ~ % docker push us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0

Para culminar, ingrese nuevamente al repositorio de contenedores en la interfaz web de Google Cloud y podrá observar una nueva entrada correspondiente a la imagen que acabamos de publicar. Si ingresa al detalle de esta imagen podrá observar también las versiones disponibles, cada una con su respectivo hash.

Al hacer click en la imagen para ver el resumen:

Ahora verifique que la aplicación de suma corre correctamente si la ejecute en su máquina. Para ello ejecute:

user@192 ~ % docker run -p 4000:4000 <URI>

El ejemplo siguiendo nuestra configuración sería el siguiente

user@192 ~ % docker run -p 4000:4000 us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0

El resultado en su terminal sería algo parecido al siguiente

user@192 ~ % docker run -p 4000:4000 us-central1-docker.pkg.dev/uandes-native/uniandes-misw-native-calculadora-app/suma:1.0
 * Serving Flask app 'view'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:4000
 * Running on http://172.17.0.2:4000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 509-245-028

Pruebe la ejecución de la aplicación, abriendo otro terminal y ejecutando:

user@192 ~ % curl --location --request POST 'http://localhost:4000/suma' \
--header 'Content-Type: application/json' \
--data-raw '{
    "num_1" : 2,
    "num_2": 3
}'

El resultado será:

{
  "message": "Estudiante la suma de los dos numeros es: 5",
  "result": 5
}

Listo, con ello hemos culminado este tutorial. En los siguientes tutoriales de esta semana, vamos a desplegar esta aplicación con servicios de orquestación de contenedores como Kubernetes.

¡Éxitos en el desarrollo del tutorial y nos vemos en una próxima oportunidad!

[1] «¿Qué es un registro de contenedores?» [Online]. Disponible en:https://www.redhat.com/es/topics/cloud-native-apps/what-is-a-container-registry.

[2] «Artifact Registry | Artifact Registry», Google Cloud. [Online]. Disponible en:https://cloud.google.com/artifact-registry?hl=es-419.

[3] «Guía de inicio rápido para Docker | Documentación de Artifact Registry | Google Cloud». [Online]. Disponible en:https://cloud.google.com/artifact-registry/docs/docker/quickstart?hl=es-419.