DevOps · 01

Cómo encajan Docker, Kubernetes y Terraform

No compiten: cada una resuelve una capa distinta. Docker empaqueta tu app, Kubernetes la corre y la escala, Terraform crea la infraestructura donde todo eso vive.

Términos de esta página

Un resumen de cada pieza. Cada tecnología tiene su propia colección de hojas con el detalle.

DevOps
Una forma de trabajar que une desarrollo (Dev) y operación (Ops): automatizar cómo se construye, se publica y se mantiene funcionando una app.
Imagen y contenedor
Docker empaqueta la app en una imagen; un contenedor es esa imagen corriendo.
Registry
Un servidor donde se guardan imágenes para que otras máquinas las descarguen (Docker Hub, GitHub Container Registry).
Cluster
Un grupo de máquinas que Kubernetes administra como si fuera una sola.
Pod / Deployment / Service
En Kubernetes: el Pod envuelve contenedores, el Deployment mantiene N copias de un Pod, el Service les da un nombre fijo.
Infraestructura
Lo que la app necesita alrededor: redes, servidores, clusters, bases de datos, dominios. Terraform la crea desde archivos.
Producción
El entorno donde la app atiende a los usuarios reales (en contraste con desarrollo, en tu PC).
Declarativo
Las tres herramientas funcionan así: describís cómo tiene que quedar todo y la herramienta calcula qué hacer.
Despliegue (deploy)
Publicar una versión de la app en un entorno, por ejemplo en el cluster.
1

Las capas, una dentro de otra

De afuera hacia adentro: infraestructura → cluster → Pods → contenedores → tu código.

Terraform crea la infraestructura terraform apply Kubernetes corre y escala los contenedores kubectl apply Pod Docker: contenedor chanchito:1.0.0 app.js tu código Pod contenedor chanchito:1.0.0 réplica 2 Pod contenedor mongo:7 datos en un PVC Red · VPC · subredes aws_vpc, azurerm_vnet… Cluster gestionado EKS · AKS · GKE DNS · certificados · DB lo que no vive en el cluster (en local: Docker Desktop)
Docker: imagen y contenedor Kubernetes: Pods, réplicas, red interna Terraform: infraestructura y plataforma
2

Del código a producción

El recorrido de un cambio. Terraform actúa una vez (o cuando cambia la infra); Docker y kubectl, en cada versión.

Código git push Imagen chanchito:1.1.0 Registry Docker Hub · GHCR Cluster Kubernetes Deployment chanchito rolling update a 1.1.0 build push apply docker build / push kubectl apply / set image terraform apply crea el cluster, la red, la DB… En cada versión: build → push → apply Solo cuando cambia la infraestructura: terraform apply
i

En local no hay registry ni nube: la imagen queda en tu Docker, el “cluster” es el Kubernetes de Docker Desktop y Terraform crea recursos dentro de ese cluster. Así está armado el proyecto completo.

3

Cuándo usar cada una

Y cuándo no hace falta.

Docker

Empaquetar y correr

  • Siempre que tu app vaya en contenedores: es el punto de partida.
  • Compose alcanza para desarrollo local y apps chicas en un solo servidor.
  • No reparte carga entre máquinas ni hace rolling updates.
Kubernetes

Correr en serio

  • Varias réplicas, autocuración, actualizaciones sin corte, varias máquinas.
  • Muchos servicios que se hablan entre sí.
  • Para una sola app chica suele ser demasiado: un PaaS o Compose alcanzan.
Terraform

Infraestructura reproducible

  • Crear redes, clusters, bases gestionadas, DNS, buckets, permisos… desde código.
  • Repetir el mismo entorno (dev, qa, prod) sin clics.
  • No construye imágenes ni reemplaza a kubectl para el día a día de la app.
4

Diccionario unificado

La misma idea con el nombre que tiene en cada herramienta.

Concepto por concepto

ConceptoDockerKubernetesTerraform
Archivo de definiciónDockerfile, compose.ymlManifiestos *.yamlArchivos *.tf
Unidad básicaContenedorPodResource
Aplicar cambiosdocker compose up -dkubectl apply -fterraform apply
Ver antes de aplicar—kubectl diff -fterraform plan
Ver qué haydocker pskubectl get podsterraform state list
Detalledocker inspectkubectl describeterraform state show
Logsdocker logs -fkubectl logs -fTF_LOG=DEBUG
Entrardocker exec -it … shkubectl exec -it … -- shterraform console
Borrar tododocker compose downkubectl delete -fterraform destroy
Configuraciónenvironment: / .envConfigMapvariable / *.tfvars
Secretos.env fuera de gitSecretsensitive + TF_VAR_*
Datos persistentesVolumenPersistentVolumeClaimDisco / DB como resource
Encontrar otro servicioNombre del servicioNombre del Service (DNS)Referencias tipo.nombre.attr
Dónde guarda “lo que hay”El propio Dockeretcd del clusterterraform.tfstate
Paquetes reutilizablesImágenes en un registryCharts de HelmMódulos del Registry
5

Los archivos de cada una

Lo mínimo que vas a ver en un repo que usa las tres.

Docker
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "app.js"]

Dockerfile + .dockerignore + docker-compose.yml para desarrollo.

Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
  name: chanchito
spec:
  replicas: 2
  # selector + template…

Carpeta k8s/ con Deployments, Services, ConfigMaps…

Terraform
resource "kubernetes_namespace_v1" "app" {
  metadata {
    name = "chanchito"
  }
}

Carpeta infra/ con *.tf, lock file y estado remoto.