From c11d57ff10ca014c3afab67ab27c2b90300fc038 Mon Sep 17 00:00:00 2001 From: Jaime Salas Date: Sun, 15 Mar 2026 21:24:50 +0100 Subject: [PATCH] ejercicios contenedores y K8s --- 01-contenedores/ejercicios/readme.md | 71 +++++++++++++++++++++++++ 02-kubernetes/ejercicios/readme.md | 77 ++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 01-contenedores/ejercicios/readme.md create mode 100644 02-kubernetes/ejercicios/readme.md diff --git a/01-contenedores/ejercicios/readme.md b/01-contenedores/ejercicios/readme.md new file mode 100644 index 0000000..23e552d --- /dev/null +++ b/01-contenedores/ejercicios/readme.md @@ -0,0 +1,71 @@ +# Ejercicios + +## 1. Creando imágenes + +- Ejecuta un contenedor de `ubuntu`, instala `curl` dentro del mismo. +- ¿Con qué comando podrías preservar el cambio? +- Crea un `Dockerfile` que haga lo mismo. Ejecuta la nueva imagen y verifica que puedes usar `curl` +- ¿Cómo podrías ver las distaintas capas del contenedor? + +Para instalar `curl` en `ubuntu` puedes usar: + +```bash +apt-get install curl +``` + +## 2. Limpiando imágenes + +Construye tres imágenes distintas: + +1. Parte de la imagen base de `alpine` o `ubuntu`. Crea un `Dockerfile` y construye la imagen. +2. En una nueva iteración, instala `curl` y construye la imagen. +3. En la siguiente iteración, instala `wget` y construye la imagen. + +- Inspecciona tus imágenes locales ¿Qué ocurre? +- ¿Cómo podemos limpiar el sistema? + +## 3. Volumenes persistentes + +Ejecuta un contenedor de `postgres` con un volumen manejado por Docker y que monte en `/var/lib/postgresql/data`. Conectate a la base de datos y crea una tabla `items`, que tenga doos campos `id` y `name`, siendo `id` primary key. Inserta un registro en la tabla items. + +- Para y elimina el contenedor que has creado. +- Vuelve a ejecutar un nuevo contenedor de `postgres` montando el volumen anterior, en el mismo *path*. Verifica que los datos persisten. + +## 4. Bind mounts + +Crea un fichero `index.html` en tu máquina local. Ejecuta un contenedor de `nginx` mapeando el puerto 80 a un puerto en tu local, y enlace tu fichero `index.html` local con `/usr/share/nginx/html/index.html`. + +- ¿Qué ocurre si editas el fichero local `index.html`? + +## 5. Auditando volumenes + +- ¿Qué comando deberías usar para averiguar dónde alamacena Docker los datos de un volumen dado? +- Si estás usando Docker Desktop en Windows o macOS que diferencia habría con un Linux en el contexto de dónde están alamacenados los datos. + +## 6. Creando redes privadas + +- Crea una red tipo `bridge` llamada `my-net`. Eejcuta dos conetenedores de tipo `ubuntu`, asegura que `ping` está disponible, ambos deben correr en la red `my-net`. +- Comprueba que puedes usar `ping` en ambos y se alcazan entre si. + +## 7. Red `none` + +- ¿Cuáles serían los casos de uso de la red `none`? + +## 8. Multi-network + +Crea dos redes de tipo bridge `secure-zone` y `public-zone`. Arranca un contenedor en `public-zone`. + +- ¿Puedes añadir tu contenedor a `secure-zone`? ¿Qué comado deberías utilizar? +- ¿Cómo puedes verificar en que red se encuentra un contenedor? + +## 9. Docker Compose - Compartiendo Volumenes + +- Crea un manifiesto para Docker Compose con dos servicios que comparten un mismo volumen. +- Nombra al primer servicio como `writer`, este debe montar el volumen en `/app/logs` y añadir un `timestamp` a un fichero cada 30 segundos. +- Nombra al sergundo servicion como `reader`, debe montar el volumen como solo para lectura, y redireccionar su conetnido a `stdout`. + +## 10. Docker Compose - Profiles + +- Crea un manifiesto para docker compose con `postgres` y `pgadmin` +- `Pgadmin` debe conectar con `Postgres`. Crea los mecanismo adecuados para aegurar que la comunicación entre ambos servicios es posible. +- Crea dos perfiles, uno para levantar ambos servicios y otro para levanatr sólo `Postgres` \ No newline at end of file diff --git a/02-kubernetes/ejercicios/readme.md b/02-kubernetes/ejercicios/readme.md new file mode 100644 index 0000000..b6c3fe1 --- /dev/null +++ b/02-kubernetes/ejercicios/readme.md @@ -0,0 +1,77 @@ +# Ejercicios + +## 1. Naked Pod + +- Levanta un Pod desde consola, su imagen debe ser `nginx:alpine`. +- Verfica que el Pod se está ejecutando +- Borra el Pod. + +## 2. Self-Healing Deployment + +- Crea un Deployment con 3 replicas desde consola cuya imagen sea `httpd:alpine`. +- Verifica que las 3 replicas están corriendo. +- Elimina una de la réplicas. ¿Qué ocurre pasado un tiempo? +- ¿Qué comando deberías usar para ver cómo aparacen las replicas en tiempo real? + +## 3. Zero-downtime Rollouts + +- Crea un Deployment usando la imagen `nginx:1.19`. +- Actualiza la imagen a `nginx:1.21` ¿Qué opciones tienes para actualizar la imagen sin eliminar el Depolyment? +- ¿Qué comando puedes usar para verificar el estado del *rollout*? + +## 4. PVC + +- Crea un `PersistentVolumClaim` solicitando 1Gi de alamacenamiento. +- Monta el PVC en un POd y crea un fichero en el path `/temp`. +- Elmina el Pod, crea un nuevo que monte el PVC anterior, verifica que el fichero sigue existiendo. + +## 5. StorageClass + +- Verifica si en tu cluster existe una `StorageClass default`. +- Crea un volumen a través de la `StorageClass default`. +- Verifica que el volumen se ha creado. + +## 6. Networking - ClusterIP + +- Crea un Deployment con la imagen `nginx`, expón el Deployment a través de un servicio ClusterIP. +- Verifica que eres capaz de interactuar con `nginx` a través del servicio que has creado. Para ello usa una imagen `busybox`. +- Si el Pod de `busybox` se hallará en otro `namespace` que FQN deberíamos usar. +- ¿Cómo podemos aislar `namespaces` completamente en K8s? + +## 7. Networking - NodePort + +- Convierte el servicio anterior a NodePort. +- Verifica `nginx` sigue siendo accesible. + +## 8. Networking - Ingress Controller + +Crea dos Deployments en `yaml` y exponlo a través de un servicio, también en `yaml`. Usa la imagen `hashicorp/http-echo`. Esta imagen permite pasar como argumento un 'echo'. Aquí tienes un ejemplo, usando un Pod: + +```yml +kind: Pod +apiVersion: v1 +metadata: + name: apple-app + labels: + app: apple +spec: + containers: + - name: apple-app + image: hashicorp/http-echo + args: + - "-text=apple" +``` + +- El primer Deployment dará como echo la palabra *red* +- El segundo Deployment dará como echo la palabra *yellow* +- Crea un Ingress que exponga el primer Deployment en `example.com/red`, y el segundo en `example.com/yellow`. +- Comprueba que funciona usando `curl -H "Host: example.com" ...` +- Refactoriza el Ingress para que existan un Virtual Host por cada uno de los Deloyments. + +## 9. Networking - Gateway API + +Si quisieramos utilizar la [Gateway API](https://gateway-api.sigs.k8s.io/) en vez del Ingress del ejercicio anetrior, ¿qué consideraciones deberíamos tomar? + +## 10. Canary Deployment + +- Explica que es un Canary Deployment y los pasos para ejecutarlo en K8s. \ No newline at end of file