Skip to content

ejercicios contenedores y K8s#2

Open
JaimeSalas wants to merge 1 commit intomainfrom
feature/container-exercises
Open

ejercicios contenedores y K8s#2
JaimeSalas wants to merge 1 commit intomainfrom
feature/container-exercises

Conversation

@JaimeSalas
Copy link
Member

No description provided.

- 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?
Copy link
Member

@brauliodiez brauliodiez Mar 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo

Le acabo de pasar herramienta para poner ejercicios obligatorios y opcionales, instrucciones de uso etc...,si lo ves bien lo incorporas / modificas y palante, graacias

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjunto el .md por si fuera de ayuda
laboratorio_docker_completo.md

@brauliodiez
Copy link
Member

Tomando como base tu .md le he pedido a chat gpt que indique los pasos para arrancar, extienda explicación y ponga partes obligatorias y opcionales, dime que te parece:

Laboratorio Docker

Este laboratorio tiene como objetivo practicar los conceptos básicos de
Docker:

  • Imágenes
  • Contenedores
  • Capas
  • Volúmenes
  • Redes
  • Docker Compose

Entrega del laboratorio

Este laboratorio debe entregarse mediante un repositorio público en
GitHub
.

El repositorio debe contener un fichero:

README.md

En este fichero deberás documentar:

  • Los pasos que has realizado
  • Los comandos utilizados
  • Una breve explicación de cada paso
  • Las respuestas a las preguntas del laboratorio

El objetivo es que cualquier persona pueda seguir tu documentación y
reproducir el laboratorio
.

Ejemplo de entrega:

https://github.com/usuario/docker-lab

Criterios de evaluación

El laboratorio se divide en:

  • Parte obligatoria (necesaria para aprobar)
  • Parte opcional (para subir nota)

Parte obligatoria (mínimo para aprobar)

Debes completar correctamente los siguientes ejercicios:

  • Ejercicio 1 --- Creando imágenes
  • Ejercicio 3 --- Volúmenes persistentes
  • Ejercicio 4 --- Bind mounts
  • Ejercicio 6 --- Redes privadas
  • Ejercicio 9 --- Docker Compose

Si estos ejercicios no funcionan o no están documentados, el
laboratorio no se considerará aprobado.


Parte opcional (para subir nota)

Estos ejercicios son muy sencillos y sirven para mejorar la nota.

Puedes hacer uno o varios.

  • Ejercicio 2 --- Limpieza de imágenes
  • Ejercicio 5 --- Ver información de un volumen
  • Ejercicio 7 --- Investigar la red none
  • Ejercicio 8 --- Conectar un contenedor a dos redes

También puedes hacer una pequeña mejora en Docker Compose.

Bonus sencillo

Añade un servicio nginx a tu docker-compose.yml.

Debe:

  • usar la imagen nginx
  • exponer el puerto 8080
  • mostrar una página simple

Ejemplo index.html:

<h1>Laboratorio Docker funcionando</h1>

Si al abrir:

http://localhost:8080

aparece la página, el bonus estará completado.


1. Creando imágenes

Paso 1

Ejecuta un contenedor basado en la imagen:

ubuntu

Accede a la terminal del contenedor.

Instala curl:

apt-get update
apt-get install curl

Comprueba que funciona:

curl --version

Pregunta

¿Con qué comando podrías guardar los cambios del contenedor como una
nueva imagen
?


Paso 2 --- Dockerfile

Crea un Dockerfile que haga lo mismo automáticamente.

Ejemplo:

FROM ubuntu

RUN apt-get update && apt-get install -y curl

Construye la imagen y ejecuta un contenedor.

Comprueba que curl está instalado.


Pregunta

¿Qué comando permite ver las capas de una imagen Docker?


2. Limpiando imágenes (opcional)

Crea un Dockerfile basado en:

ubuntu

Construye la imagen.

Después modifica el Dockerfile para instalar:

  • curl
  • después wget

Construye la imagen en cada cambio.

Lista las imágenes:

docker images

Pregunta:

¿Qué ocurre con las imágenes anteriores?


3. Volúmenes persistentes

Ejecuta un contenedor de:

postgres

Usa un volumen Docker montado en:

/var/lib/postgresql/data

Crear tabla

Conéctate a la base de datos.

Crea la tabla:

CREATE TABLE items (
 id SERIAL PRIMARY KEY,
 name TEXT
);

Inserta un registro:

INSERT INTO items(name) VALUES ('item1');

Comprobación

  1. Para el contenedor
  2. Elimina el contenedor
  3. Crea un nuevo contenedor usando el mismo volumen

Comprueba que los datos siguen existiendo.


4. Bind mounts

Crea un archivo en tu máquina:

index.html

Ejemplo:

<h1>Hola Docker</h1>

Ejecuta un contenedor nginx:

  • mapea el puerto 80
  • monta el archivo en:
<!-- -->
/usr/share/nginx/html/index.html

Abre el navegador.


Pregunta:

¿Qué ocurre si modificas el archivo index.html en tu máquina?


5. Auditando volúmenes (opcional)

Investiga:

¿Qué comando permite ver dónde guarda Docker los datos de un
volumen
?


6. Creando redes privadas

Crea una red llamada:

my-net

Arranca dos contenedores ubuntu en esa red.

Instala ping si es necesario.

Desde un contenedor intenta hacer:

ping otro_contenedor

Pregunta

¿Los contenedores pueden comunicarse entre sí?


7. Red none (opcional)

Investiga:

¿Para qué serviría ejecutar un contenedor con red:

none

8. Multi-network (opcional)

Crea dos redes:

secure-zone
public-zone

Arranca un contenedor en public-zone.

Pregunta:

¿Puedes conectarlo también a secure-zone?

¿Qué comando usarías?


9. Docker Compose --- Compartiendo volúmenes

Crea un fichero:

docker-compose.yml

Con dos servicios.


writer

Debe:

  • montar un volumen en /app/logs
  • escribir un timestamp cada 30 segundos

reader

Debe:

  • montar el volumen en modo solo lectura
  • mostrar el contenido en consola

10. Docker Compose Profiles (opcional)

Crea un docker-compose.yml con:

  • postgres
  • pgadmin

Haz que pgadmin pueda conectarse a postgres.


Crea dos perfiles:

Perfil completo

Levanta:

  • postgres
  • pgadmin

Perfil base

Levanta solo:

  • postgres

Resumen evaluación

Nivel Requisitos


Aprobado Parte obligatoria completa
Notable Parte obligatoria + ejercicios opcionales
Sobresaliente Parte obligatoria + opcionales + bonus

@@ -0,0 +1,77 @@
# Ejercicios
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Para este, también le he pedido que añada un previo explicando, ¿Crees que tendrámos que poner la parte obligatoria con menos apartados? El objetivo es que sea fácil para los alumnos que quieran sacar el curso y para los que tengan más inquitudes que tengan más chicha.

Lo dejo, por aquí

Laboratorio Kubernetes

En este laboratorio practicarás conceptos fundamentales de Kubernetes:

  • Pods
  • Deployments
  • Rollouts
  • Persistencia de datos
  • Servicios
  • Networking
  • Ingress
  • Gateway API

Entrega del laboratorio

Este laboratorio debe entregarse mediante un repositorio público en
GitHub
.

El repositorio debe contener un fichero:

README.md

En este fichero deberás documentar:

  • Los pasos que has realizado
  • Los comandos utilizados
  • Una breve explicación de cada paso
  • Las respuestas a las preguntas del laboratorio

El objetivo es que cualquier persona pueda seguir tu documentación y
reproducir el laboratorio
.

Ejemplo de entrega:

https://github.com/usuario/kubernetes-lab

Criterios de evaluación

El laboratorio se divide en:

  • Parte obligatoria (necesaria para aprobar)
  • Parte opcional (para subir nota)

Parte obligatoria (mínimo para aprobar)

Debes completar correctamente los siguientes ejercicios:

  • Ejercicio 1 --- Naked Pod
  • Ejercicio 2 --- Self-Healing Deployment
  • Ejercicio 3 --- Zero-downtime Rollouts
  • Ejercicio 4 --- PersistentVolumeClaim
  • Ejercicio 6 --- Networking ClusterIP

Si estos ejercicios no funcionan o no están documentados, el
laboratorio no se considerará aprobado.


Parte opcional (para subir nota)

Puedes completar uno o varios de los siguientes ejercicios para mejorar
tu nota.

  • Ejercicio 5 --- StorageClass
  • Ejercicio 7 --- NodePort
  • Ejercicio 8 --- Ingress Controller
  • Ejercicio 9 --- Gateway API
  • Ejercicio 10 --- Canary Deployment

1. Naked Pod

Levanta un Pod desde consola utilizando la imagen:

nginx:alpine

Comprobación

Verifica que el Pod está ejecutándose correctamente.


Limpieza

Borra el Pod que has creado.


2. Self-Healing Deployment

Crea un Deployment con:

  • imagen httpd:alpine
  • 3 réplicas

Comprobación

Verifica que las 3 réplicas están corriendo.


Experimento

Elimina manualmente uno de los Pods del Deployment.

Pregunta:

¿Qué ocurre pasado un tiempo?


Observación en tiempo real

Pregunta:

¿Qué comando puedes usar para ver cómo aparecen las réplicas en tiempo
real?


3. Zero-downtime Rollouts

Crea un Deployment utilizando la imagen:

nginx:1.19

Actualiza la imagen del Deployment a:

nginx:1.21

Pregunta:

¿Qué opciones tienes para actualizar la imagen sin eliminar el
Deployment
?


Pregunta:

¿Qué comando puedes usar para verificar el estado del rollout?


4. PersistentVolumeClaim

Crea un:

PersistentVolumeClaim

solicitando:

1Gi

de almacenamiento.


Crea un Pod que monte el volumen.

Dentro del Pod crea un fichero en:

/temp

Comprobación

  1. Elimina el Pod
  2. Crea uno nuevo que monte el mismo PVC
  3. Comprueba que el fichero sigue existiendo

5. StorageClass (opcional)

Verifica si tu cluster tiene una:

StorageClass default

Crea un volumen usando esa StorageClass.


Comprueba que el volumen se ha creado correctamente.


6. Networking --- ClusterIP

Crea un Deployment con la imagen:

nginx

Expón el Deployment mediante un:

Service ClusterIP

Test de conectividad

Usa un Pod con imagen:

busybox

para conectarte al servicio.


Pregunta:

Si el Pod de busybox estuviera en otro namespace, ¿qué FQDN
deberíamos usar?


Pregunta:

¿Cómo podemos aislar completamente namespaces en Kubernetes?


7. Networking --- NodePort (opcional)

Convierte el servicio anterior a tipo:

NodePort

Comprueba que nginx sigue siendo accesible.


8. Networking --- Ingress Controller (opcional)

Crea dos Deployments usando YAML.

Usa la imagen:

hashicorp/http-echo

Ejemplo:

kind: Pod
apiVersion: v1
metadata:
  name: apple-app
  labels:
    app: apple
spec:
  containers:
    - name: apple-app
      image: hashicorp/http-echo
      args:
        - "-text=apple"

Requisitos:

  • Un Deployment devolverá red
  • Otro Deployment devolverá yellow

Expón ambos mediante servicios.


Crea un Ingress con las rutas:

example.com/red
example.com/yellow

Comprueba el funcionamiento usando:

curl -H "Host: example.com"

Refactoriza el Ingress para usar un Virtual Host por cada
Deployment
.


9. Gateway API (opcional)

Investiga:

Si quisiéramos utilizar Gateway API en lugar de Ingress:

¿Qué consideraciones deberíamos tener?


10. Canary Deployment (opcional)

Explica:

  • Qué es un Canary Deployment
  • Qué ventajas tiene
  • Qué pasos se podrían seguir para implementarlo en Kubernetes

Resumen de evaluación

Nivel Requisitos


Aprobado Parte obligatoria completa
Notable Parte obligatoria + ejercicios opcionales
Sobresaliente Parte obligatoria + opcionales

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjunto el .md por si fuera de ayuda

laboratorio_kubernetes_completo.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants