Saltar al contenido

¿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

  1. Descarga Docker Desktop para Windows desde la página oficial

  2. Asegúrate de que tu sistema cumple los requisitos:

    • Windows 10/11 64-bit

    • WSL 2 habilitado

    • Virtualización habilitada en BIOS

  3. Ejecuta el instalador y sigue los pasos

Para macOS

  1. Descarga Docker Desktop para Mac

  2. Arrastra Docker.app a tu carpeta de Aplicaciones

  3. 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áquina

  • nginx: 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

  1. Bridge: Red predeterminada para contenedores en el mismo host

  2. Host: El contenedor comparte la red del host

  3. None: Sin acceso a red

  4. Overlay: Para comunicación entre contenedores en diferentes hosts

Buenas prácticas

  1. Imágenes ligeras

    • Usa imágenes base mínimas cuando sea posible

    • Combina comandos RUN para reducir capas

    • Limpia caches y archivos temporales

  2. 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

  3. Optimización de builds

    • Organiza las capas por frecuencia de cambio

    • Usa .dockerignore

    • Aprovecha la caché de capas

  4. Gestión de logs

    • Usa STDOUT/STDERR

    • Implementa rotación de logs

    • Considera una solución de agregación de logs

  5. 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:

Rutas de aprendizaje