Docker y Containerización: Conceptos Básicos y Uso
Docker empaqueta aplicaciones en contenedores para un despliegue consistente y portátil. Esta guía cubre los fundamentos de Docker, la escritura de Dockerfile y la gestión de contenedores.
Actualizado:¿Qué es Docker?
Docker es una plataforma que empaqueta aplicaciones y sus dependencias en contenedores. Los contenedores son entornos de ejecución ligeros y aislados.
VM vs Container: Las máquinas virtuales ejecutan un sistema operativo completo (GBs). Los contenedores comparten el kernel del SO host y ocupan MBs.
Consistencia: Resuelve el problema de 'funciona en mi máquina'. Los entornos de desarrollo, prueba y producción usan el mismo contenedor.
Portabilidad: Los contenedores funcionan en cualquier plataforma compatible con Docker (Linux, Windows, Mac, cloud).
Conceptos Fundamentales de Docker
Image: Plantilla para un contenedor. Almacenada como capas de solo lectura. Construida a partir de un Dockerfile.
Container: Instancia en ejecución de una imagen. Cada contenedor se ejecuta como un proceso aislado.
Dockerfile: Archivo de texto que define cómo construir una imagen. Contiene instrucciones como FROM, RUN, COPY, CMD.
Registry: Repositorio que almacena y distribuye imágenes. Docker Hub es el registry público más popular.
Volume: Almacenamiento usado para persistir datos del contenedor. Los datos se conservan incluso si el contenedor se elimina.
Escritura de Dockerfile
FROM node:18-alpine: Use Node.js 18 (Alpine Linux) como imagen base. Alpine es una imagen base de tamaño pequeño.
WORKDIR /app: Establezca el directorio de trabajo en /app. Todos los comandos posteriores se ejecutan en este directorio.
COPY package*.json ./: Copie package.json y package-lock.json. Instale dependencias con RUN npm install.
COPY . .: Copie todo el código fuente. Cree el build de producción con RUN npm run build.
EXPOSE 3000: Especifique que el contenedor escucha en el puerto 3000. Defina el comando a ejecutar cuando el contenedor inicie con CMD ["npm", "start"].
Comandos Básicos de Docker
docker build -t myapp:1.0 .: Construya la imagen desde Dockerfile. Etiquete la imagen con nombre:versión usando -t.
docker run -p 3000:3000 myapp:1.0: Ejecute el contenedor. Mapee el puerto del host al puerto del contenedor con -p.
docker ps: Liste los contenedores en ejecución. docker ps -a: Liste todos los contenedores (incluyendo los detenidos).
docker stop <container_id>: Detenga el contenedor. docker rm <container_id>: Elimine el contenedor.
docker images: Liste las imágenes locales. docker rmi <image_id>: Elimine la imagen.
Docker Compose
Docker Compose es una herramienta para definir y gestionar aplicaciones multi-contenedor. Configurado con archivo docker-compose.yml.
Servicios: Cada servicio es un contenedor. Defina servicios como web (frontend), api (backend), db (base de datos).
Volumes: Defina volumes para persistencia de datos. networks: Cree networks para comunicación entre servicios.
docker compose up: Inicie todos los servicios. docker compose down: Detenga y elimine todos los servicios.
docker compose up -d: Ejecute en modo detached (segundo plano). docker compose logs -f: Siga los logs.
Mejores Prácticas
Imágenes pequeñas: Use imágenes base Alpine o distroless. Elimine dependencias de build de la imagen final con multi-stage build.
Layer caching: COPY dependencias (que cambian raramente) primero, código (que cambia frecuentemente) después. Esto optimiza el build cache.
.dockerignore: Ignore archivos innecesarios (node_modules, .git, logs). Esto reduce el build context.
Seguridad: Use usuario non-root en lugar de root. Cree usuario con RUN adduser --disabled-password appuser.
Health check: Use la instrucción HEALTHCHECK para realizar verificación de salud del contenedor. Docker reinicia automáticamente los contenedores unhealthy.