¿Qué es y para qué sirve Docker?

Tiempo de lectura: 8 minutos

Docker es una plataforma de contenedores que permite empaquetar aplicaciones con todo lo que necesitan para funcionar, garantizando que se ejecuten de forma idéntica en cualquier entorno. Es una de las herramientas más adoptadas en desarrollo y operaciones modernas, especialmente útil para quienes trabajan con servidores VPS, automatizaciones o aplicaciones a medida.

¿Qué es Docker?

Docker es una plataforma de código abierto que permite crear, distribuir y ejecutar aplicaciones dentro de contenedores. Un contenedor es una unidad de software ligera que incluye el código de la aplicación, sus dependencias, bibliotecas, variables de entorno y configuración, todo empaquetado en un solo objeto portable.

La idea central es simple: si una aplicación funciona en tu computadora, debería funcionar exactamente igual en el servidor de producción, en la nube o en la máquina de otro desarrollador. Sin Docker, ese objetivo es difícil de garantizar porque cada entorno puede tener versiones distintas de Python, Node.js, PHP u otras dependencias.

Docker resuelve el problema clásico del desarrollo de software: «en mi máquina funciona». Al encapsular todo lo que la aplicación necesita, elimina las inconsistencias entre entornos.

Fue lanzado en 2013 por la empresa Docker, Inc. y hoy es uno de los proyectos de código abierto más activos del mundo, con millones de imágenes publicadas en Docker Hub, su repositorio oficial.

¿Cómo funciona Docker por dentro?

Para entender Docker, conviene conocer sus componentes principales:

Imágenes

Una imagen es una plantilla de solo lectura que define cómo se construirá un contenedor. Es similar a un snapshot o una fotografía del sistema en un momento dado. Las imágenes se construyen a partir de un archivo llamado Dockerfile.

Contenedores

Un contenedor es una instancia en ejecución de una imagen. Se puede iniciar, detener, mover y eliminar. Es efímero por naturaleza: si se destruye, los datos no persisten a menos que se configuren volúmenes.

Docker Engine

Es el motor principal que corre en el servidor o en la computadora. Se encarga de gestionar imágenes, contenedores, redes y volúmenes.

Docker Hub

Es el registro público de imágenes. Allí se encuentran imágenes oficiales de tecnologías como MySQL, Nginx, WordPress, Redis, Python, Node.js, entre muchas otras. También se pueden publicar imágenes privadas.

Docker Compose

Es una herramienta para definir y ejecutar aplicaciones que requieren múltiples contenedores. Se configura mediante un archivo docker-compose.yml y permite levantar toda la infraestructura de una aplicación con un solo comando.

Dockerfile: la base de todo

El Dockerfile es el archivo de instrucciones que le dice a Docker cómo construir la imagen. Un ejemplo básico para una aplicación Node.js:

# Imagen base
FROM node:20-alpine

# Directorio de trabajo dentro del contenedor
WORKDIR /app

# Copiar archivos de dependencias
COPY package*.json ./

# Instalar dependencias
RUN npm install

# Copiar el resto del código
COPY . .

# Puerto que expone el contenedor
EXPOSE 3000

# Comando que se ejecuta al iniciar el contenedor
CMD ["node", "index.js"]

Este archivo es suficiente para que cualquier persona, en cualquier máquina con Docker instalado, pueda construir y ejecutar esa aplicación de manera idéntica.

¿Para qué sirve Docker en la práctica?

Docker tiene aplicaciones concretas tanto para desarrolladores como para administradores de sistemas y emprendedores técnicos.

Despliegue de aplicaciones web

En lugar de configurar manualmente un servidor con todas las dependencias necesarias, se puede preparar una imagen Docker con todo incluido y desplegarla en minutos. Si algo falla, se puede volver a la versión anterior de la imagen.

Entornos de desarrollo reproducibles

Un equipo distribuido puede trabajar con el mismo entorno sin importar el sistema operativo de cada miembro. Docker garantiza que todos tengan la misma versión de Node, PHP, la base de datos y cualquier otro servicio.

Autoalojamiento de herramientas

Muchas aplicaciones populares se distribuyen como imágenes Docker: n8n, Nextcloud, GitLab, Mattermost, Ghost CMS, Moodle, entre otras. Esto simplifica enormemente su instalación en un servidor VPS.

Por ejemplo, levantar una instancia de n8n con Docker Compose es tan directo como esto:

version: "3"
services:
  n8n:
    image: n8nio/n8n
    ports:
      - "5678:5678"
    volumes:
      - n8n_data:/home/node/.n8n
volumes:
  n8n_data:

Con ese archivo y el comando docker compose up -d, la aplicación queda corriendo en segundo plano.

Para profundizar sobre cómo instalar aplicaciones autoalojadas en un servidor propio, la guía sobre cómo alojar un LLM en un VPS cubre el proceso paso a paso con ejemplos reales.

Microservicios

Las arquitecturas basadas en microservicios dividen una aplicación grande en servicios independientes que se comunican entre sí. Docker es el estándar para empaquetar y desplegar cada uno de esos servicios de manera aislada.

Integración y entrega continua (CI/CD)

En pipelines de CI/CD, Docker permite crear entornos de prueba limpios para cada versión del código, ejecutar tests y desplegar automáticamente si todo pasa.

Docker vs. máquinas virtuales: diferencias clave

Una pregunta frecuente es en qué se diferencia Docker de una máquina virtual (VM). Ambas tecnologías aíslan entornos de ejecución, pero lo hacen de manera muy distinta.

CaracterísticaDocker (contenedor)Máquina virtual
Sistema operativoComparte el kernel del hostTiene su propio SO completo
PesoMegabytesGigabytes
Tiempo de inicioSegundosMinutos
AislamientoA nivel de procesoA nivel de hardware
RendimientoCercano al nativoOverhead por virtualización
PortabilidadAltaMedia

Los contenedores son más livianos porque no necesitan emular hardware completo ni cargar un sistema operativo propio. Comparten el kernel del sistema operativo del host, lo que los hace considerablemente más eficientes en términos de recursos.

Sin embargo, las máquinas virtuales ofrecen un aislamiento más fuerte a nivel de seguridad, lo que las hace preferibles en ciertos contextos donde se ejecuta código de terceros no confiable.

En la práctica, muchas infraestructuras combinan ambas tecnologías: corren Docker dentro de máquinas virtuales para obtener lo mejor de los dos mundos.

Cómo instalar y usar Docker: primeros pasos

Instalación en Linux (Ubuntu/Debian)

# Actualizar repositorios
sudo apt update

# Instalar dependencias
sudo apt install -y ca-certificates curl gnupg

# Agregar clave GPG oficial de Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Agregar repositorio de Docker
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Instalar Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Verificar instalación
docker --version

Comandos básicos de Docker

# Descargar una imagen
docker pull nginx

# Listar imágenes descargadas
docker images

# Ejecutar un contenedor
docker run -d -p 80:80 --name mi-nginx nginx

# Listar contenedores en ejecución
docker ps

# Detener un contenedor
docker stop mi-nginx

# Eliminar un contenedor
docker rm mi-nginx

# Ver logs de un contenedor
docker logs mi-nginx

# Construir imagen desde un Dockerfile
docker build -t mi-app:1.0 .

Gestión de volúmenes para persistencia de datos

Los contenedores son efímeros, pero los datos deben persistir. Los volúmenes permiten montar directorios del host dentro del contenedor:

# Crear un volumen
docker volume create mis-datos

# Montar el volumen al ejecutar el contenedor
docker run -d -v mis-datos:/var/lib/mysql --name mi-mysql mysql:8.0

Esto garantiza que los datos de la base de datos sobrevivan aunque el contenedor se destruya y se recree.

Si estás trabajando con servidores y aplicaciones autoalojadas, conocer los consejos de seguridad para proteger un VPS de ataques es complementario, ya que Docker no elimina la necesidad de buenas prácticas de seguridad en el servidor.

Errores comunes al usar Docker

1. Ejecutar todo como root dentro del contenedor

Por defecto, muchos Dockerfile ejecutan procesos como el usuario root. Esto representa un riesgo de seguridad. La práctica correcta es crear un usuario sin privilegios:

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

2. No usar .dockerignore

Al igual que .gitignore, el archivo .dockerignore evita que archivos innecesarios (como node_modules, .env o archivos de log) se copien dentro de la imagen, lo que la hace más pesada y lenta de construir.

node_modules
.env
*.log
.git

3. Usar la etiqueta latest en producción

Depender de latest implica que la imagen puede cambiar sin previo aviso y romper el entorno de producción. Siempre es mejor anclar una versión específica:

# Evitar esto en producción
FROM node:latest

# Preferir esto
FROM node:20.11-alpine

4. Almacenar secretos en la imagen

Las variables de entorno con contraseñas o tokens no deben ir dentro del Dockerfile. Deben pasarse en tiempo de ejecución mediante archivos .env o herramientas de gestión de secretos como Docker Secrets.

5. No limpiar imágenes y contenedores antiguos

Con el tiempo, Docker acumula imágenes, contenedores detenidos y capas sin usar que consumen espacio en disco. El siguiente comando limpia todo lo que no está en uso:

docker system prune -a

Consejos poco conocidos sobre Docker

Multi-stage builds para imágenes más ligeras. Permite usar una imagen grande para compilar el código y luego copiar solo el resultado a una imagen base mínima:

# Etapa de compilación
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o mi-binario

# Imagen final mínima
FROM alpine:3.19
COPY --from=builder /app/mi-binario /mi-binario
CMD ["/mi-binario"]

El resultado puede ser una imagen de menos de 10 MB en lugar de cientos.

docker exec para depurar contenedores en ejecución. Permite abrir una terminal dentro del contenedor sin detenerlo:

docker exec -it nombre-contenedor /bin/sh

Healthchecks integrados. Se puede definir dentro del Dockerfile una verificación de salud que Docker ejecuta periódicamente para saber si el contenedor está funcionando correctamente:

HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

Redes personalizadas para comunicación entre contenedores. Los contenedores en la misma red Docker pueden comunicarse entre sí usando el nombre del servicio como hostname, sin necesidad de exponer puertos al exterior.

Para quienes trabajan con aplicaciones que requieren automatización de flujos, el artículo sobre qué es n8n y para qué sirve explica cómo esta herramienta, que se instala fácilmente con Docker, puede conectar servicios y automatizar tareas sin programar.

Si planeas ejecutar contenedores en producción, necesitarás un servidor con los recursos adecuados. El hosting VPS de Neolo es una opción sólida para eso: ofrece acceso root completo, rendimiento consistente y soporte técnico atendido por personas reales, sin bots ni respuestas automáticas. Neolo lleva más de 20 años en el mercado y cuenta con servidores en múltiples regiones, lo que permite elegir la ubicación más cercana a los usuarios finales.

Lo que dicen los clientes de Neolo

★★★★★ Matías Pregliasco
«Usualmente, cuando escribo al soporte la respuesta es prácticamente inmediata. Agradecido también por la buena predisposición.»

★★★★★ Pablo Gutiérrez
«Destaco la velocidad de su soporte y el tiempo de actividad del servidor, que es del 100%.»

★★★★★ Matias
«Es la única empresa que supo resolver todos los problemas que tenía con el hosting. Soporte constante y super profesional.»

Preguntas frecuentes

¿Docker es gratuito?

Docker Engine (el motor principal) es completamente gratuito y de código abierto. Docker Desktop, la aplicación para Mac y Windows, tiene una versión gratuita para uso personal y educativo, pero requiere licencia de pago para uso comercial en empresas con más de 250 empleados o más de 10 millones de dólares de ingresos anuales. En servidores Linux, Docker es siempre gratuito.

¿Qué diferencia hay entre Docker y Kubernetes?

Docker se encarga de crear y ejecutar contenedores individuales. Kubernetes es un orquestador: gestiona múltiples contenedores distribuidos en varios servidores, se encarga del escalado automático, la recuperación ante fallos y el balanceo de carga. Para proyectos pequeños o medianos, Docker con Compose es suficiente. Kubernetes entra en juego cuando la escala o la complejidad lo justifican.

¿Puedo usar Docker en un hosting compartido?

No. El hosting compartido no permite instalar Docker porque requiere acceso root al servidor y capacidad para ejecutar procesos en segundo plano. Docker funciona en servidores VPS o dedicados, donde el usuario tiene control total del sistema operativo.

¿Qué es Docker Hub y cómo se usa?

Docker Hub es el registro público de imágenes Docker. Allí se encuentran imágenes oficiales de MySQL, WordPress, Nginx, Redis, Python y cientos de otras tecnologías. También es posible publicar imágenes propias, ya sea de forma pública o privada. Se accede desde la línea de comandos con docker pull nombre-imagen.

¿Docker reemplaza al servidor?

No. Docker es una capa de abstracción que corre encima del servidor. Necesita un sistema operativo Linux (o Windows Server) y recursos de hardware para funcionar. Lo que simplifica es la gestión del software que corre sobre ese servidor.

¿Es seguro usar Docker en producción?

Sí, con las configuraciones adecuadas. Docker está ampliamente adoptado en entornos de producción a nivel global. Las buenas prácticas incluyen no ejecutar contenedores como root, usar imágenes oficiales o verificadas, mantener las imágenes actualizadas y controlar los puertos expuestos. La seguridad del servidor subyacente también sigue siendo responsabilidad del administrador.

¿Qué recursos necesito para correr Docker?

Depende de las aplicaciones que se ejecuten dentro de los contenedores. Para un servidor de desarrollo o aplicaciones livianas, 1-2 GB de RAM y 1 vCPU puede ser suficiente. Para cargas de trabajo más exigentes, se recomienda al menos 4 GB de RAM. La elección del plan de VPS debe ajustarse a los contenedores que se planea ejecutar.

Conclusión

Docker cambió la forma en que se desarrollan y despliegan aplicaciones. Al aislar el software en contenedores portables y reproducibles, elimina uno de los problemas más frecuentes en tecnología: las diferencias entre entornos que hacen que una aplicación funcione en desarrollo pero falle en producción.

Para pymes, emprendedores y desarrolladores que trabajan con aplicaciones a medida, herramientas autoalojadas o flujos de automatización, Docker representa una inversión de aprendizaje con retorno directo en eficiencia y control.

Para aprovechar Docker en producción, se necesita un servidor con acceso root y recursos adecuados. El hosting VPS de Neolo está pensado exactamente para ese tipo de uso: empresa bootstrapped con más de 10.000 clientes, soporte humano real y garantía de reembolso de 30 días si el servicio no cumple las expectativas.

banner hosting