Docker para Novatos: La Guía Definitiva que Necesitabas (2025)

Robot punk estudiando Docker con entusiasmo documentación contenedores para principiantes 2025

Docker para Novatos: La Guía Definitiva que Necesitabas (2025)

Tiempo de lectura: 18 minutos

Si eres desarrollador, sysadmin, o simplemente alguien curioso que quiere entender qué carajos es Docker y por qué todo el mundo habla de ello, estás en el lugar correcto.

Esta no es otra guía técnica aburrida. Aquí vamos a explicarte Docker como si tuvieras 10 años, pero sin tratarte como idiota. Porque Docker es poderoso, pero no tiene por qué ser complicado.

🎯 Lo que aprenderás en esta guía:
• Qué es Docker y por qué existe
• Cómo funciona por dentro (sin tecnicismos innecesarios)
• Cuándo usar Docker y cuándo NO usarlo
• Conceptos clave explicados con analogías del mundo real
• Casos prácticos que puedes aplicar HOY


📋 Índice

  1. El problema que Docker resuelve
  2. ¿Qué demonios es Docker?
  3. Cómo funciona Docker por dentro
  4. Los 6 conceptos que DEBES entender
  5. Cuándo usar Docker (y cuándo NO)
  6. Docker vs Máquinas Virtuales vs Bare Metal
  7. Tus primeros pasos con Docker
  8. Casos de uso del mundo real
  9. Errores que cometen todos los novatos
  10. Qué aprender después de esta guía

1. El problema que Docker resuelve

Empecemos por el principio. ¿Por qué existe Docker?

La pesadilla del «funciona en mi máquina»

Imagina esta situación (que probablemente has vivido):

Desarrollas una aplicación en tu portátil. Todo funciona perfecto. Luego intentas desplegarla en el servidor de producción y… BOOM. No funciona.

¿Por qué?

  • Tu portátil tiene Python 3.11, el servidor tiene Python 3.8
  • Instalaste una librería con pip, pero el servidor tiene otra versión
  • Tu app necesita PostgreSQL 15, el servidor tiene 13
  • En tu máquina la librería X funciona, en el servidor da error porque falta una dependencia del sistema

Este infierno se llama «dependency hell» (el infierno de las dependencias).

Las soluciones antiguas (que no funcionaban bien)

Opción 1: Documentar todo
«Instala esto, luego esto otro, configura aquí, cambia este archivo…»
Problema: Nadie lee la documentación completa, y siempre se olvida algo.

Opción 2: Scripts de instalación
Crear scripts que instalen todo automáticamente.
Problema: Funcionan en Ubuntu 20.04, pero en Ubuntu 22.04 se rompen. Y en CentOS, olvídalo.

Opción 3: Máquinas virtuales
Empaquetar TODO el sistema operativo con la app.
Problema: Una VM pesa gigabytes, tarda minutos en arrancar, y consume un montón de recursos.

La solución: Docker

Docker dice: «¿Y si empaquetamos SOLO lo necesario para que funcione la app, pero de forma que sea portable entre sistemas?»

Y así nació la revolución de los contenedores.


2. ¿Qué demonios es Docker?

La explicación simple

Docker es una plataforma para empaquetar aplicaciones con todas sus dependencias en «contenedores» que se pueden ejecutar en cualquier sistema que tenga Docker instalado.

La analogía del container de shipping

Piensa en los contenedores de barcos (esos cubos gigantes de metal).

Antes de los contenedores: Cada barco cargaba cosas diferentes de formas diferentes. Cajas, sacos, barriles… Un caos. Cargar y descargar era lentísimo.

Después de los contenedores: Todo va en contenedores estándar. No importa qué lleves dentro (coches, bananas, electrónica). El contenedor siempre mide lo mismo, se carga igual, se transporta igual.

Docker hace exactamente eso con software:

  • Tu app de Node.js va en un contenedor
  • Tu base de datos PostgreSQL va en otro contenedor
  • Tu servidor Redis va en otro contenedor

Todos son contenedores estándar. Todos se «cargan» y «ejecutan» de la misma forma, sin importar qué llevan dentro.

¿Qué NO es Docker?

Es importante aclarar esto:

  • NO es una máquina virtual. No emula hardware.
  • NO es un sistema operativo. Usa el kernel del sistema host.
  • NO es magia. Usa tecnologías de Linux que existen hace años (namespaces, cgroups).
  • NO reemplaza a Kubernetes. Kubernetes ORQUESTA contenedores Docker (entre otros).

3. Cómo funciona Docker por dentro

Arquitectura básica

Docker tiene tres componentes principales:

1. Docker Engine (el motor)

Es el programa que corre en tu sistema. Tiene dos partes:

  • Docker Daemon (dockerd): El proceso que corre en segundo plano y hace el trabajo pesado
  • Docker CLI (docker): El comando que usas en la terminal para hablar con el daemon

Cuando ejecutas docker run nginx, el CLI le dice al daemon «oye, ejecuta nginx», y el daemon lo hace.

2. Docker Images (las imágenes)

Son las «plantillas» o «recetas» para crear contenedores.

Analogía: Si un contenedor es una casa, la imagen es el plano de la casa.

Las imágenes son de solo lectura. No cambian. Se almacenan en registros como Docker Hub (el GitHub de las imágenes).

3. Docker Containers (los contenedores)

Son instancias EN EJECUCIÓN de una imagen.

Puedes crear 100 contenedores de la misma imagen (como construir 100 casas con el mismo plano).

El truco: Namespaces y cgroups

Docker no inventa nada nuevo. Usa características de Linux que existen hace años:

Namespaces: Aíslan procesos. Cada contenedor «cree» que está solo en el sistema.

  • PID namespace: Cada contenedor ve sus propios procesos
  • Network namespace: Cada contenedor tiene su propia red
  • Mount namespace: Cada contenedor ve su propio sistema de archivos

Cgroups (Control Groups): Limitan recursos. Le dices «este contenedor puede usar máximo 2GB de RAM y 1 CPU».

Union File Systems: Permite que las imágenes se construyan en capas. Es como un pastel de capas: cada capa añade algo nuevo sin modificar las anteriores.

¿Por qué es más rápido que una VM?

Porque NO virtualiza hardware. Comparte el kernel del sistema host.

Máquina Virtual Contenedor Docker
Arranca en 1-2 minutos Arranca en milisegundos
Pesa GBs (incluye SO completo) Pesa MBs (solo la app)
Usa mucha RAM (cada VM reserva memoria) Usa poca RAM (comparte kernel)
Aislamiento total Aislamiento a nivel de proceso

4. Los 6 conceptos que DEBES entender

1. Imagen (Image)

Qué es: Un archivo (o conjunto de archivos) que contiene todo lo necesario para ejecutar una aplicación.

Analogía: Una imagen de Docker es como una ISO de un CD. Puedes «quemar» esa ISO en múltiples CDs (crear múltiples contenedores).

Ejemplo:

docker pull nginx:latest

Esto descarga la imagen de Nginx desde Docker Hub.

2. Contenedor (Container)

Qué es: Una instancia en ejecución de una imagen.

Analogía: Si la imagen es el ejecutable de un programa, el contenedor es el programa corriendo en memoria.

Ejemplo:

docker run -d --name mi-nginx nginx:latest

Esto crea y arranca un contenedor llamado «mi-nginx» a partir de la imagen nginx.

3. Dockerfile

Qué es: Un archivo de texto con instrucciones para construir una imagen.

Analogía: Es la receta de cocina. Dice paso a paso cómo construir tu imagen.

Ejemplo simple:

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Línea por línea:

  • FROM: Empezamos con Python 3.11 como base
  • WORKDIR: Nos movemos al directorio /app
  • COPY: Copiamos requirements.txt al contenedor
  • RUN: Ejecutamos pip install
  • COPY: Copiamos todo el código
  • CMD: Definimos qué comando ejecutar al arrancar

4. Docker Hub (el registro)

Qué es: Un repositorio público de imágenes Docker. Como GitHub pero para imágenes.

Ahí encuentras imágenes oficiales de:

  • Sistemas operativos: ubuntu, alpine, debian
  • Lenguajes: python, node, golang, rust
  • Bases de datos: postgres, mysql, mongodb, redis
  • Servidores web: nginx, apache, caddy
  • Y miles más…

5. Volúmenes (Volumes)

Qué es: Una forma de persistir datos fuera del contenedor.

El problema: Si borras un contenedor, todo lo que esté dentro se pierde. Incluso tu base de datos.

La solución: Volúmenes. Guardas datos en el host, no en el contenedor.

Ejemplo:

docker run -v /home/user/data:/var/lib/postgresql/data postgres:15

Los datos de PostgreSQL se guardan en /home/user/data de tu sistema, no en el contenedor. Si borras el contenedor, los datos sobreviven.

6. Docker Compose

Qué es: Una herramienta para definir y ejecutar aplicaciones multi-contenedor.

El problema: Tu app necesita 5 contenedores (app, base de datos, cache, queue, proxy). Escribir 5 comandos docker run es un coñazo.

La solución: Un archivo YAML que define todo.

Ejemplo de docker-compose.yml:

version: '3.8'
services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secreto
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

Y luego solo haces docker compose up y TODO arranca.


5. Cuándo usar Docker (y cuándo NO)

✅ CUÁNDO SÍ usar Docker

1. Desarrollo en equipo

Todo el equipo usa exactamente el mismo entorno. Sin sorpresas.

2. Microservicios

Cada servicio en su propio contenedor. Escalas independientemente.

3. CI/CD

Tests, builds, deploys… todo en contenedores reproducibles.

4. Aplicaciones legacy

Necesitas ejecutar una app antigua con PHP 5.6 sin tocar tu sistema moderno.

5. Laboratorios y pruebas

Probar software sin ensuciar tu sistema. Borras el contenedor y listo.

6. Despliegues consistentes

Lo que funciona en dev, funciona en producción. SIN EXCUSAS.

❌ CUÁNDO NO usar Docker

1. Aplicaciones GUI complejas

Docker está pensado para servicios, no para apps de escritorio. Es posible, pero es un dolor.

2. Aplicaciones que necesitan acceso directo al hardware

Drivers de GPU, dispositivos USB específicos, etc. Posible, pero complicado.

3. Cuando la simplicidad importa más

Un script PHP simple en un hosting compartido no necesita Docker. Estás sobre-complicando.

4. Aplicaciones de alto rendimiento extremo

Si cada milisegundo cuenta (trading de alta frecuencia, por ejemplo), la capa extra de abstracción puede importar.

5. Cuando no entiendes qué estás haciendo

Usar Docker sin entenderlo es como usar un martillo neumático para colgar un cuadro. Funciona, pero es overkill.


6. Docker vs Máquinas Virtuales vs Bare Metal

Comparación honesta

Criterio Bare Metal Máquinas Virtuales Docker
Rendimiento 🟢 Máximo 🟡 Bueno (-10-20%) 🟢 Casi nativo (-5%)
Velocidad de arranque 🟢 Instantáneo 🔴 Lento (minutos) 🟢 Rápido (segundos)
Aislamiento 🔴 Ninguno 🟢 Total 🟡 Bueno (compartido kernel)
Portabilidad 🔴 Nula 🟡 Media 🟢 Total
Uso de recursos 🟢 Mínimo 🔴 Alto 🟢 Bajo
Seguridad 🟡 Depende 🟢 Alta 🟡 Media-Alta
Complejidad 🟢 Baja 🟡 Media 🟡 Media

¿Cuándo usar cada uno?

Bare Metal:

  • Aplicación monolítica simple
  • Máximo rendimiento crítico
  • Hosting compartido/económico

Máquinas Virtuales:

  • Necesitas múltiples OS diferentes
  • Aislamiento total es crítico (seguridad)
  • Apps Windows en host Linux (o viceversa)

Docker:

  • Microservicios
  • Desarrollo moderno
  • CI/CD
  • Apps cloud-native

7. Tus primeros pasos con Docker

Instalación

Si aún no tienes Docker instalado, tenemos una guía completa:

👉 Instala Docker sin miedo: solo copia y pega

Comandos esenciales para empezar

1. Ejecutar tu primer contenedor

docker run hello-world

Esto descarga una imagen pequeña y ejecuta un contenedor que imprime un mensaje de bienvenida.

2. Ejecutar un servidor web

docker run -d -p 8080:80 --name web nginx
  • -d: Modo detached (segundo plano)
  • -p 8080:80: Mapea puerto 80 del contenedor al 8080 de tu sistema
  • --name web: Nombre del contenedor

Abre http://localhost:8080 y verás Nginx funcionando.

3. Ver contenedores corriendo

docker ps

4. Ver todos los contenedores (incluso parados)

docker ps -a

5. Detener un contenedor

docker stop web

6. Eliminar un contenedor

docker rm web

7. Ver imágenes descargadas

docker images

8. Eliminar una imagen

docker rmi nginx

9. Ver logs de un contenedor

docker logs web

10. Ejecutar comando dentro de un contenedor

docker exec -it web bash

Esto te mete dentro del contenedor como si fuera una máquina separada.

Tu primer Dockerfile

Crea un archivo llamado Dockerfile:

FROM node:18-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

Construye la imagen:

docker build -t mi-app:1.0 .

Ejecuta un contenedor:

docker run -p 3000:3000 mi-app:1.0

8. Casos de uso del mundo real

Caso 1: Entorno de desarrollo para un equipo

Problema: 10 desarrolladores con diferentes OS y versiones de software.

Solución Docker:

version: '3.8'
services:
  app:
    build: .
    volumes:
      - .:/app
    ports:
      - "3000:3000"
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: dev
  redis:
    image: redis:alpine

Cada dev hace docker compose up y tiene exactamente el mismo entorno. Sin excusas.

Caso 2: Testing automatizado

En tu pipeline CI/CD:

docker run --rm -v $(pwd):/app python:3.11 pytest /app/tests

Ejecuta tests en un contenedor limpio. Si pasa, deployeas con confianza.

Caso 3: Múltiples versiones de una herramienta

Necesitas Node 16 para un proyecto y Node 18 para otro:

# Proyecto A (Node 16)
docker run -v $(pwd):/app node:16 npm install

# Proyecto B (Node 18)
docker run -v $(pwd):/app node:18 npm install

Sin conflictos. Sin problemas.

Caso 4: Servicios self-hosted

Quieres montar tu propio n8n para automatizaciones:

docker run -d --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  n8nio/n8n

👉 Más detalles: Guía completa de n8n

Caso 5: Bases de datos temporales

Necesitas una base de datos para hacer pruebas:

docker run --name postgres-test \
  -e POSTGRES_PASSWORD=test123 \
  -p 5432:5432 \
  postgres:15

Pruebas terminadas:

docker stop postgres-test && docker rm postgres-test

Tu sistema queda limpio.


9. Errores que cometen todos los novatos

Error 1: No usar volúmenes para datos persistentes

Síntoma: Borras el contenedor y pierdes TODA la base de datos.

Solución: SIEMPRE usa volúmenes para datos importantes:

docker run -v datos:/var/lib/postgresql/data postgres:15

Error 2: Ejecutar todo como root dentro del contenedor

Problema: Si alguien explota tu contenedor, tiene acceso root.

Solución: Crea un usuario no-root en tu Dockerfile:

FROM python:3.11
RUN useradd -m appuser
USER appuser
WORKDIR /home/appuser/app

Error 3: Imágenes gigantes

Problema: Tu imagen pesa 2GB cuando podría pesar 50MB.

Solución: Usa imágenes alpine:

# Mal
FROM python:3.11

# Bien
FROM python:3.11-alpine

Error 4: No limpiar recursos viejos

Problema: Después de meses, Docker ocupa 50GB de tu disco.

Solución: Limpia regularmente:

docker system prune -a

Error 5: Mapear puertos incorrectamente

Problema: -p 80:3000 vs -p 3000:80

Regla: -p HOST:CONTAINER

  • -p 8080:80: Puerto 80 del contenedor → puerto 8080 de tu máquina

Error 6: No entender la diferencia entre imagen y contenedor

Imagen: Plantilla estática, solo lectura
Contenedor: Instancia ejecutándose de esa imagen

Puedes tener 10 contenedores de la misma imagen.

Error 7: Usar latest en producción

Problema: nginx:latest hoy puede ser diferente a mañana.

Solución: Usa versiones específicas en producción:

# Desarrollo: OK
FROM nginx:latest

# Producción: Mejor
FROM nginx:1.25.3-alpine

10. Qué aprender después de esta guía

Nivel intermedio

  1. Docker Compose avanzado
    • Redes personalizadas
    • Healthchecks
    • Variables de entorno
    • Múltiples archivos compose
  2. Networking en Docker
    • Bridge networks
    • Host networking
    • Overlay networks
  3. Multi-stage builds
    • Reducir tamaño de imágenes
    • Separar build y runtime
  4. Docker registry privado
    • Montar tu propio Docker Hub
    • GitLab Container Registry
    • GitHub Container Registry

Nivel avanzado

  1. Kubernetes
    • Orquestación de contenedores a escala
    • Auto-scaling
    • Load balancing
  2. Docker Swarm
    • Alternativa más simple a Kubernetes
    • Clustering nativo de Docker
  3. Seguridad avanzada
    • Escaneo de vulnerabilidades
    • Secrets management
    • SELinux/AppArmor
  4. Monitoring y logging
    • Prometheus + Grafana
    • ELK Stack
    • Loki

Recursos recomendados

Documentación oficial:

Práctica interactiva:

Artículos relacionados en El Diario IA:


🎯 Conclusión

Docker no es magia. Es una herramienta que resuelve problemas reales:

  • ✅ Entornos reproducibles
  • ✅ Portabilidad total
  • ✅ Eficiencia de recursos
  • ✅ Aislamiento de aplicaciones
  • ✅ Despliegues consistentes

¿Es Docker para ti?

Si eres desarrollador, DevOps, o sysadmin, . Docker es una skill fundamental en 2025.

Si solo quieres alojar un blog en WordPress, probablemente no lo necesitas (pero podrías usarlo si quisieras).

El siguiente paso es tuyo:

  1. Instala Docker si no lo tienes
  2. Ejecuta docker run hello-world
  3. Prueba con un servidor web
  4. Crea tu primer Dockerfile
  5. Experimenta con Compose

No aprendes Docker leyendo. Aprendes Docker USANDO Docker.

Así que deja de leer y empieza a jugar con contenedores. Rompe cosas. Arregla cosas. Aprende.

¡Bienvenido al mundo de los contenedores! 🐳


Última actualización: Octubre 2025

Por ziru

El Diario IA
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.