¿Te has encontrado alguna vez diciendo "en mi máquina funciona"? ¿Has perdido horas configurando entornos de desarrollo? ¿Te has preguntado cómo las empresas despliegan aplicaciones de forma tan fluida? Docker es la respuesta a todos estos dolores de cabeza, y en esta guía vas a descubrir por qué se ha convertido en una herramienta imprescindible para cualquier desarrollador web moderno.
¿Qué es realmente Docker y por qué debería importarte?
Docker es una plataforma que permite desarrollar, enviar y ejecutar aplicaciones en contenedores. Pero espera, ¿qué significa esto realmente? Imagina que tienes una caja mágica que contiene todo lo necesario para que tu aplicación funcione: el código, las librerías, las dependencias, incluso el sistema operativo. Ahora imagina que puedes llevar esa caja a cualquier lugar y, al abrirla, tu aplicación funcionará exactamente igual que en tu máquina. Eso es Docker.
La analogía del contenedor físico
Piensa en los contenedores de transporte marítimo. Antes de su existencia, transportar mercancías era un caos: diferentes tamaños, formas, métodos de carga... Los contenedores estandarizaron todo esto. Docker hace lo mismo con el software: estandariza cómo empaquetamos y ejecutamos las aplicaciones.
El problema que resuelve Docker
Como desarrollador web, probablemente te hayas encontrado con situaciones como estas:
"Necesito PHP 7.4 para este proyecto, pero PHP 8.1 para aquel otro"
"Mi base de datos MySQL funciona en local pero falla en producción"
"Nuevo compañero en el equipo: 3 días configurando su entorno de desarrollo"
"El servidor de staging tiene una configuración ligeramente diferente y todo se rompe"
Docker elimina el clásico "funciona en mi máquina" proporcionando un entorno consistente y reproducible en cualquier lugar.
Conceptos fundamentales de Docker
1. Imágenes
Una imagen de Docker es como una plantilla de solo lectura. Contiene:
Un sistema operativo base
Las dependencias necesarias
La configuración de la aplicación
Los archivos necesarios para ejecutar el software
Es como una "foto" de todo lo que necesita tu aplicación para funcionar.
2. Contenedores
Un contenedor es una instancia ejecutable de una imagen. Es como crear una copia funcional a partir de esa "foto". Puedes tener múltiples contenedores ejecutándose a partir de la misma imagen, cada uno aislado de los demás.
3. Registry
El registry es como un repositorio de imágenes. Docker Hub es el más conocido, pero puedes tener registries privados. Es similar a lo que GitHub es para el código.
Instalación de Docker
Para Windows
Descarga Docker Desktop para Windows desde la página oficial
Asegúrate de que tu sistema cumple los requisitos:
Windows 10/11 64-bit
WSL 2 habilitado
Virtualización habilitada en BIOS
Ejecuta el instalador y sigue los pasos
Para macOS
Descarga Docker Desktop para Mac
Arrastra Docker.app a tu carpeta de Aplicaciones
Docker se instalará automáticamente con toda la configuración necesaria
Para Linux (Ubuntu)
Verificación de la instalación
Después de instalar Docker, abre una terminal y ejecuta:
Si ves un mensaje de bienvenida, ¡felicidades! Docker está instalado y funcionando correctamente.
Primeros pasos con Docker
Tu primer contenedor
Vamos a ejecutar un servidor web Nginx:
¿Qué acaba de pasar?
-d: ejecuta el contenedor en segundo plano-p 80:80: mapea el puerto 80 del contenedor al puerto 80 de tu máquinanginx: la imagen que queremos usar
Ahora abre tu navegador y visita http://localhost. ¡Deberías ver la página de bienvenida de Nginx!
Comandos básicos
Trabajando con Dockerfile
Un Dockerfile es un archivo de texto que contiene todas las instrucciones necesarias para crear una imagen de Docker personalizada. Es como una receta que le dice a Docker exactamente qué necesita incluir en la imagen y cómo debe configurarla.
Estructura básica de un Dockerfile
Instrucciones comunes en Dockerfile
FROM
Especifica la imagen base sobre la que construiremos nuestra imagen personalizada.
COPY y ADD
COPY: Copia archivos desde tu máquina al contenedor
ADD: Similar a COPY, pero puede también descargar archivos de URLs y descomprimir archivos
RUN
Ejecuta comandos durante la construcción de la imagen. En nuestro caso, instalamos algunas herramientas útiles:
ENV
Define variables de entorno. Para nuestro servidor Nginx:
EXPOSE
Documenta qué puertos escuchará el contenedor. Para Nginx, típicamente el puerto 80:
CMD y ENTRYPOINT
CMD: Define el comando predeterminado al ejecutar el contenedor
ENTRYPOINT: Establece el ejecutable principal del contenedor
Construcción de la imagen
Para construir una imagen a partir de un Dockerfile:
El archivo .dockerignore
Similar al .gitignore, el .dockerignore te permite especificar qué archivos y directorios deben ser ignorados al construir la imagen:
Docker Compose: Orquestando múltiples contenedores
Docker Compose es una herramienta que permite definir y gestionar aplicaciones multi-contenedor. Con un único archivo YAML, puedes configurar todos los servicios, redes y volúmenes necesarios.
Estructura de docker-compose.yml
Elementos principales de Docker Compose
Services
Cada servicio representa un contenedor en tu aplicación. Puedes:
Construir desde un Dockerfile o usar una imagen existente
Configurar variables de entorno
Mapear puertos
Montar volúmenes
Establecer dependencias entre servicios
Volumes
Los volúmenes permiten persistir datos y compartirlos entre contenedores:
Networks
Puedes crear redes personalizadas para aislar grupos de servicios:
Comandos básicos de Docker Compose
Variables de entorno en Docker Compose
Puedes usar un archivo .env para manejar configuraciones:
Y referenciarlo en docker-compose.yml:
Redes en Docker
Docker crea automáticamente una red para cada aplicación de Docker Compose, permitiendo que los contenedores se comuniquen entre sí usando el nombre del servicio como hostname.
Tipos de redes
Bridge: Red predeterminada para contenedores en el mismo host
Host: El contenedor comparte la red del host
None: Sin acceso a red
Overlay: Para comunicación entre contenedores en diferentes hosts
Buenas prácticas
Imágenes ligeras
Usa imágenes base mínimas cuando sea posible
Combina comandos RUN para reducir capas
Limpia caches y archivos temporales
Seguridad
No ejecutes contenedores como root
No almacenes secretos en imágenes
Usa COPY en lugar de ADD
Escanea imágenes en busca de vulnerabilidades
Optimización de builds
Organiza las capas por frecuencia de cambio
Usa .dockerignore
Aprovecha la caché de capas
Gestión de logs
Usa STDOUT/STDERR
Implementa rotación de logs
Considera una solución de agregación de logs
Volúmenes y persistencia
Usa volúmenes nombrados para datos persistentes
Documenta los puntos de montaje
Implementa estrategias de backup
Docker es una herramienta poderosa que puede simplificar significativamente tu flujo de trabajo de desarrollo. Con estas bases, podrás crear entornos de desarrollo consistentes y reproducibles, facilitando el desarrollo y el despliegue de tus aplicaciones web.
🐳 ¿Te ha resultado útil esta guía sobre Docker? ¡Compártela con tus compañeros desarrolladores! La ballena azul de Docker estará encantada de nadar por más pantallas y seguir ayudando a la comunidad de desarrollo.
Recursos para seguir aprendiendo
Si quieres profundizar en Docker con ejemplos prácticos, te recomiendo estos cursos:
Curso Práctico de Docker para Programadores - Iníciate en Docker desde cero
Laravel y MongoDB con Docker y Testing - Aprende a integrar Docker en un stack moderno con Laravel y MongoDB
Desarrolla tu propio Mini-Framework PHP - Crea un framework desde cero usando Docker con Nginx, PHP-FPM y MySQL