En esta primera lección descubrirás qué es Docker y por qué se ha convertido en una herramienta fundamental en el desarrollo de software moderno. Partimos desde cero: no necesitas ninguna experiencia previa. Entenderás el clásico problema de "en mi máquina funciona", qué significa la contenerización, en qué se diferencia un contenedor de una máquina virtual y cuáles son los conceptos básicos (imagen, contenedor y registro) que usarás durante todo el curso. Esta base conceptual es imprescindible: todo lo que aprendas después se apoya en las ideas de esta lección.
El Problema: "En Mi Máquina Funciona"
Imagina la siguiente situación, muy común en el desarrollo de software:
- Un programador escribe una aplicación en su ordenador. La prueba y funciona perfectamente.
- La envía a un compañero o al servidor de producción y, de repente, deja de funcionar.
- Aparece la frase mítica: "pues en mi máquina funciona".
¿Por qué ocurre esto? Porque una aplicación no vive aislada: depende de un montón de cosas a su alrededor que pueden ser distintas en cada ordenador.
- Versión del lenguaje o del runtime: el desarrollador usa Node.js 18, pero el servidor tiene Node.js 14.
- Librerías y dependencias: faltan paquetes, o están en versiones distintas.
- Variables de entorno y configuración: rutas, credenciales o puertos diferentes.
- Sistema operativo: el portátil es Windows, el servidor es Linux.
Tradicionalmente, resolver esto significaba escribir largos manuales de instalación, instalar manualmente las dependencias en cada máquina y rezar para que todo coincidiera. Es lento, propenso a errores y difícil de reproducir.
Docker resuelve este problema de raíz: empaqueta tu aplicación junto con todo lo que necesita para ejecutarse en una unidad estándar que funciona igual en cualquier sitio.
¿Qué es la Contenerización?
La contenerización (o containerization) es una forma de empaquetar una aplicación con todas sus dependencias —código, librerías, runtime, configuración— en un único paquete autocontenido llamado contenedor. Ese contenedor se ejecuta de forma aislada del resto del sistema y, lo más importante, se comporta exactamente igual sin importar dónde lo ejecutes.
La analogía clásica es la del contenedor de transporte marítimo. Antes de su invención, las mercancías se cargaban una a una, con formas y tamaños distintos, lo que hacía el transporte caótico. El contenedor estandarizado cambió todo: cualquier barco, grúa, camión o tren sabe manejar una caja del mismo tamaño, sin importar lo que lleve dentro. Docker hace lo mismo con el software: estandariza el "envoltorio" para que la infraestructura no tenga que preocuparse por lo que hay dentro.
Características clave de un contenedor:
- Portátil: se ejecuta igual en tu portátil, en el de un compañero o en un servidor en la nube.
- Aislado: no interfiere con otras aplicaciones del mismo host.
- Ligero: comparte el núcleo (kernel) del sistema operativo anfitrión, por lo que arranca en segundos y consume pocos recursos.
- Reproducible: se construye siempre a partir de una receta, de modo que el resultado es idéntico cada vez.
Contenedores vs. Máquinas Virtuales
Si ya conoces las máquinas virtuales (VM), puede que te preguntes en qué se diferencian de los contenedores. Ambos sirven para aislar aplicaciones, pero lo hacen de formas muy distintas.
Una máquina virtual incluye un sistema operativo completo (con su propio kernel) que se ejecuta sobre un hipervisor. Cada VM es, en la práctica, un ordenador entero simulado por software.
Un contenedor, en cambio, no incluye un sistema operativo completo: comparte el kernel del host y solo empaqueta la aplicación y sus dependencias. Por eso es mucho más ligero.
| Característica | Máquina Virtual (VM) | Contenedor |
|---|---|---|
| Aislamiento | A nivel de hardware (hipervisor) | A nivel de proceso (kernel del host) |
| Sistema operativo | Cada VM tiene su propio SO completo | Comparten el kernel del host |
| Tamaño | Grande (gigabytes) | Pequeño (megabytes) |
| Tiempo de arranque | Lento (minutos) | Rápido (segundos o menos) |
| Consumo de recursos | Alto | Bajo |
| Densidad (cuántos caben) | Pocos por servidor | Muchos por servidor |
| Portabilidad | Limitada | Muy alta |
La conclusión no es que los contenedores sean "mejores" en términos absolutos, sino que resuelven problemas distintos. Las VM ofrecen un aislamiento más fuerte y permiten ejecutar sistemas operativos completamente diferentes; los contenedores priorizan ligereza, velocidad y portabilidad. De hecho, es muy habitual ejecutar contenedores dentro de máquinas virtuales en la nube.
Casos de Uso de Docker
Docker es útil en muchísimos escenarios. Estos son los más frecuentes:
- Entornos de desarrollo consistentes: todo el equipo trabaja con la misma versión de la base de datos, el mismo runtime y las mismas dependencias, eliminando el "en mi máquina funciona".
- Microservicios: cada servicio de una arquitectura se empaqueta en su propio contenedor, lo que facilita escalar y desplegar cada parte de forma independiente.
- Integración y despliegue continuos (CI/CD): las canalizaciones automáticas construyen, prueban y despliegan aplicaciones en contenedores idénticos en cada fase.
- Modernización de aplicaciones: empaquetar una aplicación existente en un contenedor facilita moverla a la nube sin reescribirla.
- Pruebas aisladas: levantar una base de datos o un servicio temporal para una prueba y eliminarlo después sin dejar rastro en tu sistema.
- Despliegue reproducible: lo que pruebas en desarrollo es exactamente lo que se ejecuta en producción.
Conceptos Fundamentales: Imagen, Contenedor y Registro
Antes de instalar nada, conviene fijar tres conceptos que aparecerán constantemente. Por ahora los veremos a alto nivel; los profundizaremos en lecciones posteriores.
| Concepto | Qué es | Analogía |
|---|---|---|
| Imagen | Una plantilla de solo lectura con la aplicación y sus dependencias | La receta o el molde |
| Contenedor | Una instancia en ejecución creada a partir de una imagen | El plato cocinado a partir de la receta |
| Registro | Un almacén donde se publican y descargan imágenes | La biblioteca de recetas |
Imagen
Una imagen es un paquete inmutable (de solo lectura) que contiene todo lo necesario para ejecutar una aplicación: el código, el runtime, las librerías y la configuración. Es la "plantilla" a partir de la cual se crean los contenedores. Una misma imagen puede usarse para crear muchos contenedores idénticos.
Contenedor
Un contenedor es una imagen en ejecución. Es decir, cuando "arrancas" una imagen, Docker crea un contenedor: un proceso aislado que ejecuta tu aplicación. Puedes iniciarlo, detenerlo, eliminarlo y crear tantos como quieras a partir de la misma imagen, igual que cocinas varios platos con la misma receta.
Registro
Un registro (registry) es un repositorio centralizado donde se almacenan y comparten imágenes. El más conocido es Docker Hub, un registro público con miles de imágenes oficiales listas para usar (Nginx, PostgreSQL, Node.js, etc.). También existen registros privados para que las empresas guarden sus propias imágenes. Cuando descargas una imagen, la estás "bajando" de un registro a tu máquina.
El flujo básico, a vista de pájaro, es el siguiente:
Errores Comunes y Consejos
- Confundir imagen y contenedor: la imagen es la plantilla inmutable; el contenedor es la instancia en ejecución. Una imagen puede generar muchos contenedores.
- Pensar que un contenedor es una máquina virtual: no lo es. No incluye un sistema operativo completo y comparte el kernel del host. Esperar que funcione como una VM lleva a malentendidos.
- Creer que Docker "lo arregla todo": Docker estandariza el empaquetado y el despliegue, pero no corrige errores de tu código ni decisiones de arquitectura.
- Asumir aislamiento total de seguridad: los contenedores aíslan procesos, pero comparten kernel. Para escenarios con requisitos de seguridad muy estrictos, conviene combinarlos con otras medidas.
- Consejo: cuando dudes, recuerda la analogía: imagen = receta, contenedor = plato, registro = libro de recetas. Te ayudará a no perderte.
Ejercicios
Ejercicio 1
Explica con tus propias palabras por qué Docker ayuda a evitar el problema de "en mi máquina funciona". Menciona al menos dos diferencias de entorno que un contenedor consigue estandarizar.
Ejercicio 2
Completa la siguiente tabla indicando, para cada característica, si describe mejor a una máquina virtual o a un contenedor: (a) incluye su propio sistema operativo completo, (b) arranca en segundos, (c) comparte el kernel del host, (d) ocupa varios gigabytes.
Ejercicio 3
Relaciona cada concepto con su analogía: imagen, contenedor, registro → receta, plato cocinado, libro de recetas.
Soluciones
Solución 1
Docker empaqueta la aplicación junto con todas sus dependencias en un contenedor que se ejecuta igual en cualquier máquina. Así se eliminan las diferencias de entorno entre el ordenador del desarrollador y el servidor. Dos ejemplos de lo que estandariza: la versión del runtime o lenguaje (por ejemplo, asegurar que en todas partes se use Node.js 18) y las librerías y dependencias (que estén presentes y en la misma versión). También estandariza variables de entorno, configuración e incluso el sistema base.
Solución 2
- (a) Incluye su propio sistema operativo completo → Máquina virtual.
- (b) Arranca en segundos → Contenedor.
- (c) Comparte el kernel del host → Contenedor.
- (d) Ocupa varios gigabytes → Máquina virtual.
Solución 3
- Imagen → la receta (plantilla de solo lectura).
- Contenedor → el plato cocinado (instancia en ejecución).
- Registro → el libro de recetas (almacén de imágenes).
Conclusión
En esta lección hemos sentado las bases: el problema de "en mi máquina funciona", el concepto de contenerización, la diferencia entre contenedores y máquinas virtuales, los principales casos de uso de Docker y los tres conceptos esenciales que usaremos a lo largo del curso —imagen, contenedor y registro—. Con esta visión general ya entiendes qué es Docker y por qué es tan valioso.
En la siguiente lección, Instalando Docker, pasaremos de la teoría a la práctica: instalaremos Docker en Windows, macOS y Linux, verificaremos que funciona correctamente y resolveremos los problemas de instalación más habituales para dejar tu entorno listo.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
