Cerramos la Parte IV con uno de los temas más importantes de la informática moderna: los contenedores. Antes de ver cómo AWS los gestiona (ECR, ECS, EKS en los siguientes subcapítulos), necesitas entender qué es Docker y los contenedores. Si ya los conoces, este será un repaso rápido; si no, aquí tienes lo esencial.

El problema: «en mi máquina funciona»

Seguro que has oído (o vivido) esta frase clásica: un programa funciona perfectamente en el ordenador del desarrollador, pero al llevarlo al servidor... falla. ¿Por qué? Porque el servidor tiene una versión distinta del lenguaje, le falta una librería, el sistema operativo es diferente, una configuración no coincide... Las diferencias de entorno rompen las aplicaciones.

Ordenador del desarrollador          Servidor de producción
  Python 3.11                          Python 3.8        ← ¡diferente!
  Librería X versión 2                 Librería X versión 1  ← ¡diferente!
  Funciona ✓                           Falla ✗

La solución: los contenedores

Un contenedor empaqueta tu aplicación junto con todo lo que necesita para funcionar: el código, las librerías, las dependencias, la configuración... todo en un único paquete. Ese paquete funciona igual en cualquier sitio: en tu portátil, en el servidor, en la nube. Se acabó el «en mi máquina funciona».

   ┌─── Contenedor ───┐
   │  Tu aplicación    │
   │  + sus librerías  │   ← todo junto, autocontenido
   │  + dependencias   │
   │  + configuración  │
   └───────────────────┘
   Funciona igual en CUALQUIER sitio

Analogía: un contenedor es como un contenedor de mercancías (esos de los barcos y camiones). Da igual lo que lleve dentro (ropa, electrónica, comida): el contenedor tiene un tamaño y forma estándar, así que cualquier barco, grúa o camión del mundo puede transportarlo sin saber qué hay dentro. Igual con el software: el contenedor es estándar, y cualquier sistema que «sepa» de contenedores puede ejecutarlo.

Qué es Docker

Docker es la tecnología más popular para crear y ejecutar contenedores. Se ha vuelto un estándar de la industria. Maneja tres conceptos clave que debes distinguir bien:

  1. Imagen (image)

Una imagen es la plantilla del contenedor: el paquete «congelado» con tu aplicación y todo lo necesario. Es como una receta o un molde. No se ejecuta por sí misma; es la definición de lo que habrá dentro.

  1. Contenedor (container)

Un contenedor es una imagen en ejecución: una instancia viva de la imagen, funcionando. De una misma imagen puedes arrancar muchos contenedores idénticos.

Imagen (plantilla)  ──arrancar──►  Contenedor 1 (en ejecución)
                    ──arrancar──►  Contenedor 2 (en ejecución)
                    ──arrancar──►  Contenedor 3 (en ejecución)

Analogía: la imagen es como el molde de una galleta (o un plano); el contenedor es cada galleta que sale del molde. Un molde, muchas galletas idénticas.

  1. Dockerfile

Un Dockerfile es un archivo de texto con las instrucciones para construir la imagen. Describe paso a paso qué lleva: de qué sistema base parte, qué se instala, qué código se copia, cómo se arranca. Es la receta escrita.

# Ejemplo simplificado de Dockerfile
FROM python:3.11              # parte de una imagen base con Python
COPY . /app                  # copia tu código
RUN pip install -r requirements.txt   # instala dependencias
CMD ["python", "app.py"]     # cómo arrancar la aplicación

A partir de este Dockerfile, Docker construye la imagen, que luego puedes ejecutar como contenedores donde quieras.

El flujo completo de Docker

Juntando los tres conceptos, el ciclo es:

1. Escribes un Dockerfile  (la receta)
        │ docker build
        ▼
2. Construyes una Imagen   (el paquete listo)
        │ docker run
        ▼
3. Arrancas Contenedores   (la aplicación en marcha)

Contenedores vs máquinas virtuales

Te puede surgir la duda: ¿en qué se diferencia un contenedor de una instancia EC2 (máquina virtual)? La clave es que los contenedores son más ligeros:

Máquina virtual (EC2) Contenedor
Incluye Un sistema operativo completo Solo la app y sus dependencias
Tamaño Grande (GB) Ligero (MB normalmente)
Arranque Lento (minutos) Rápido (segundos)
Densidad Pocas por servidor Muchos por servidor

Los contenedores comparten el sistema operativo del servidor anfitrión, en vez de llevar uno entero cada uno. Por eso son tan ligeros y rápidos: puedes ejecutar muchos contenedores en una misma máquina.

Por qué importa esto en AWS: los contenedores son ideales para la nube. Arrancan rápido (genial para escalar, Capítulo 13), son portables y aprovechan bien los recursos. Por eso AWS tiene servicios dedicados a ejecutarlos, que veremos en los siguientes subcapítulos: ECR (para guardar imágenes), ECS y EKS (para ejecutar contenedores).

Lo que debes recordar

  • Un contenedor empaqueta tu aplicación con todo lo que necesita (código, librerías, dependencias, configuración), y funciona igual en cualquier sitio. Acaba con el «en mi máquina funciona». Como un contenedor de mercancías estándar.
  • Docker es la tecnología estándar de contenedores, con tres conceptos: imagen (la plantilla/molde), contenedor (la imagen en ejecución/la galleta) y Dockerfile (la receta escrita para construir la imagen).
  • El flujo: DockerfilebuildImagenrunContenedores.
  • Frente a las máquinas virtuales, los contenedores son más ligeros y rápidos porque comparten el sistema operativo del anfitrión; caben muchos por servidor.
  • AWS ofrece servicios dedicados a contenedores: ECR, ECS y EKS (siguientes subcapítulos).

En el siguiente subcapítulo veremos dónde guardar tus imágenes de forma privada y segura: el registro ECR.

Cloud, AWS & Terraform — De cero a experto

Capítulo 1 · Qué es el cloud computing

Capítulo 2 · El mercado cloud y los grandes proveedores

Capítulo 3 · Regiones, zonas de disponibilidad y edge

Capítulo 4 · Cómputo: EC2

Capítulo 5 · Almacenamiento: S3

Capítulo 6 · Redes: VPC

Capítulo 7 · Identidad y acceso: IAM

Capítulo 8 · Bases de datos gestionadas

Capítulo 9 · Por qué Infraestructura como Código

Capítulo 10 · HCL: el lenguaje de Terraform

Capítulo 11 · Providers y estado

Capítulo 12 · Tu primera infraestructura real en Terraform

Capítulo 13 · Balanceo de carga y autoescalado

Capítulo 14 · Serverless con Lambda

Capítulo 15 · Mensajería y eventos

Capítulo 16 · Entrega de contenido y DNS

Capítulo 17 · Contenedores en AWS

Capítulo 18 · Módulos: reutilización y composición

Capítulo 19 · Workspaces y gestión de entornos

Capítulo 20 · Backends remotos y locking

Capítulo 21 · Testing de infraestructura

Capítulo 22 · Terraform en CI/CD

Capítulo 23 · Seguridad en profundidad

Capítulo 24 · Observabilidad: logs, métricas y trazas

Capítulo 25 · Optimización de costes

Capítulo 26 · Alta disponibilidad y disaster recovery

Capítulo 27 · Well-Architected Framework de AWS

Capítulo 28 · Arquitecturas serverless a escala

Capítulo 29 · Plataformas de datos en AWS

Capítulo 30 · Multi-cuenta y landing zones

Capítulo 31 · Platform Engineering e Internal Developer Platform

Capítulo 32 · Certificaciones AWS relevantes

Capítulo 33 · Proyectos para consolidar lo aprendido

Capítulo 34 · Recursos y comunidad

© Copyright 2024. Todos los derechos reservados