Docker
Docker es una plataforma de código abierto que permite desarrollar, empaquetar, distribuir y ejecutar aplicaciones en contenedores. Un contenedor es una unidad ligera, autónoma y portátil que incluye todo lo necesario para ejecutar una aplicación: código, dependencias, librerías, configuraciones, etc.
Docker se basa en características del núcleo de Linux (como cgroups y namespaces) para permitir que múltiples contenedores se ejecuten en un mismo sistema operativo de manera aislada.
¿Para qué sirve Docker?
Docker facilita la creación y despliegue de aplicaciones porque:
- Elimina problemas de "en mi máquina funciona".
- Proporciona entornos consistentes para desarrollo, testing y producción.
- Simplifica el despliegue y escalado de aplicaciones.
- Permite aislamiento y seguridad de procesos.
- Acelera la integración y entrega continua (CI/CD).
Casos de uso comunes
- Microservicios: cada servicio corre en su contenedor.
- Entornos de desarrollo reproducibles.
- Automatización de pruebas.
- Despliegue en la nube.
- Simulación de arquitecturas complejas (con
Docker Compose). - Contenedorización de bases de datos, APIs, servicios web.
Componentes Clave
1. Docker Engine
El motor de Docker es el núcleo de Docker. Incluye:
- Servidor (dockerd): daemon que gestiona contenedores.
- CLI (docker): cliente de línea de comandos.
- API REST: permite controlar Docker desde otras herramientas.
2. Imágenes
Las imágenes Docker son plantillas inmutables que contienen el sistema de archivos y la configuración de una aplicación. Se crean a partir de un Dockerfile.
3. Contenedores
Un contenedor es una instancia en ejecución de una imagen. Se puede detener, iniciar, reiniciar, destruir, etc.
docker run nginx
docker ps
docker stop <id>
Dockerfile
Un Dockerfile es un archivo de texto que contiene instrucciones para construir una imagen Docker personalizada.
Ejemplo de Dockerfile
# Imagen base
FROM node:18
# Directorio de trabajo dentro del contenedor
WORKDIR /app
# Copiar dependencias
COPY package*.json ./
# Instalar dependencias
RUN npm install
# Copiar el resto del código
COPY . .
# Puerto expuesto
EXPOSE 3000
# Comando de inicio
CMD ["npm", "start"]
Instrucciones comunes
| Instrucción | Descripción |
|---|---|
FROM |
Imagen base (ej: node, python, ubuntu) |
COPY |
Copia archivos al contenedor |
RUN |
Ejecuta comandos en la creación |
CMD |
Comando por defecto al iniciar el contenedor |
EXPOSE |
Indica qué puerto usará la app |
WORKDIR |
Cambia el directorio de trabajo |
Docker Compose
Docker Compose permite definir y ejecutar aplicaciones multicontenedor con un solo archivo YAML (docker-compose.yml). Es ideal para orquestar varios servicios como API, frontend, base de datos, etc.
Ejemplo de archivo docker-compose.yml {:#ejemplo-docker-compose}
version: '3.9'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Comandos comunes
docker-compose up # Levanta todos los servicios
docker-compose down # Detiene y elimina los contenedores
docker-compose build # Construye imágenes
docker-compose logs # Muestra logs
docker-compose ps # Lista servicios activos
Buenas prácticas
- Usa
.dockerignorecomo.gitignorepara evitar copiar archivos innecesarios. - Minimiza el número de capas (
RUNyCOPY). - Usa imágenes oficiales y ligeras (por ejemplo:
node:alpine). - Evita correr como root dentro del contenedor.
- Utiliza variables de entorno seguras (con archivos
.envysecrets).
Recursos adicionales
- Sitio oficial: https://www.docker.com
- Docker Hub (imágenes): https://hub.docker.com
- Documentación oficial: https://docs.docker.com
Conclusión
Docker es una herramienta esencial en el desarrollo moderno. Su capacidad para contener y aislar aplicaciones facilita el desarrollo, testing, y despliegue en cualquier entorno, desde laptops hasta clústeres en la nube.