Flujo de Trabajo con Docker
📋 Introducción
Docker es una plataforma que permite crear, desplegar y ejecutar aplicaciones en contenedores. Este tutorial te guiará a través de todo el flujo de trabajo con Docker.
🏗️ 1. Crear un Dockerfile
El Dockerfile es el archivo que define cómo debe construirse una imagen Docker.
Estructura básica de un Dockerfile:
# Imagen base
FROM node:14
# Directorio de trabajo en el contenedor
WORKDIR /app
# Copiar archivos de la aplicación
COPY . .
# Instalar dependencias
RUN npm install
# Exponer puerto
EXPOSE 3000
# Comando para ejecutar la aplicación
CMD ["npm", "start"]Ejemplos de Dockerfile para diferentes tecnologías:
Para una aplicación Python:
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]Para una aplicación PHP:
FROM php:8.1-apache
WORKDIR /var/www/html
COPY . .
RUN docker-php-ext-install pdo pdo_mysql
EXPOSE 80🔨 2. Construir la Imagen con Docker Build
Una vez creado el Dockerfile, construimos la imagen:
# Construir imagen con tag
docker build -t nombre-imagen .
# Construir imagen con tag y versión
docker build -t nombre-imagen:v1.0 .
# Construir desde un Dockerfile específico
docker build -f Dockerfile.dev -t nombre-imagen:dev .Ejemplo práctico:
# Navegar al directorio del proyecto
cd /ruta/a/mi/proyecto
# Construir la imagen
docker build -t mi-app-web .
# Ver imágenes disponibles
docker images🎼 3. Orquestación con Docker Compose
Docker Compose permite gestionar múltiples contenedores simultáneamente.
Archivo docker-compose.yml básico:
version: '3.8'
services:
web:
build: .
ports:
- "8080:80"
environment:
- DATABASE_URL=mysql://user:pass@db:3306/mydb
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:Comandos de Docker Compose:
# Levantar todos los servicios
docker-compose up -d
# Levantar servicios específicos
docker-compose up -d web db
# Ver logs de los servicios
docker-compose logs
# Detener servicios
docker-compose down
# Reconstruir y levantar servicios
docker-compose up -d --build🚀 4. Ejecutar Contenedores
Ejecutar contenedor individual:
# Ejecutar contenedor en primer plano
docker run -p 8080:80 nombre-imagen
# Ejecutar en segundo plano (detached)
docker run -d -p 8080:80 --name mi-contenedor nombre-imagen
# Ejecutar con variables de entorno
docker run -d -p 8080:80 -e "ENV_VAR=valor" nombre-imagen
# Ejecutar mapeando volúmenes
docker run -d -p 8080:80 -v /ruta/local:/ruta/contenedor nombre-imagenModos de ejecución importantes:
Modo detached (
-d): El contenedor corre en segundo planoModo interactivo (
-it): Permite interactuar con el contenedorModo TTY (
-t): Asigna una pseudo-terminal
🔧 5. Administrar Contenedores
Comandos esenciales de administración:
# Ver contenedores en ejecución
docker ps
# Ver todos los contenedores (ejecutándose y detenidos)
docker ps -a
# Detener un contenedor
docker stop nombre-contenedor
docker stop ID_CONTENEDOR
# Eliminar un contenedor
docker rm nombre-contenedor
docker rm ID_CONTENEDOR
# Eliminar contenedor forzadamente
docker rm -f nombre-contenedor
# Reiniciar contenedor
docker restart nombre-contenedor
# Pausar/Reanudar contenedor
docker pause nombre-contenedor
docker unpause nombre-contenedor💻 6. Trabajar con Contenedores en Ejecución
Acceder a un contenedor:
# Acceder al shell del contenedor
docker exec -it nombre-contenedor /bin/bash
# Acceder como root
docker exec -u 0 -it nombre-contenedor /bin/bash
# Ejecutar comando específico
docker exec nombre-contenedor ls -laManejo de sesiones interactivas:
⚠️ Importante: Para salir de un contenedor sin detenerlo:
Presiona
Ctrl + Pseguido deCtrl + Q
No uses exit ya que esto detendrá el contenedor.
Re-conectar a un contenedor en ejecución:
docker attach nombre-contenedorCopiar archivos:
# Del contenedor al host
docker cp nombre-contenedor:/ruta/en/contenedor /ruta/en/host
# Del host al contenedor
docker cp /ruta/en/host nombre-contenedor:/ruta/en/contenedor🌐 7. Configuración Avanzada de Contenedores
Creación de contenedores con opciones avanzadas:
# Con red específica
docker run --name=mi-contenedor --net=mi-red nombre-imagen
# Con mapeo de puertos
docker run --name=mi-contenedor -p 8080:80 nombre-imagen
# Con variables de entorno
docker run --name=mi-contenedor -e "DB_HOST=db" -e "DB_USER=admin" nombre-imagen
# Con volúmenes
docker run --name=mi-contenedor -v /host/path:/container/path nombre-imagen
# Con límites de recursos
docker run --name=mi-contenedor --memory=512m --cpus=1.0 nombre-imagen📊 Resumen de Herramientas
| Componente | ¿Qué hace? | ¿Cuándo se usa? |
|---|---|---|
| Dockerfile | Define el entorno y dependencias | Al crear una imagen personalizada |
| Docker Build | Construye imágenes desde Dockerfile | Para generar imágenes ejecutables |
| Docker Compose | Orquesta múltiples contenedores | Aplicaciones con varios servicios |
| Contenedor | Instancia en ejecución de una imagen | Para ejecutar la aplicación |
🔄 Flujo de Trabajo Completo
📝 Escribir Dockerfile - Definir el entorno de la aplicación
🔨 Construir imagen -
docker build -t mi-app .🎼 Configurar orquestación (opcional) - Crear
docker-compose.yml🚀 Ejecutar contenedor -
docker runodocker-compose up🔧 Gestionar contenedores - Monitorear, detener, reiniciar según necesidad
🎯 Buenas Prácticas
Usa imágenes oficiales como base
Minimiza el número de capas en el Dockerfile
Usa
.dockerignorepara excluir archivos innecesariosNo ejecutes aplicaciones como root en producción
Usa volúmenes para datos persistentes
Establezca límites de recursos en producción
❓ Solución de Problemas Comunes
# Ver logs de un contenedor
docker logs nombre-contenedor
# Ver logs en tiempo real
docker logs -f nombre-contenedor
# Inspeccionar un contenedor
docker inspect nombre-contenedor
# Ver estadísticas de uso
docker stats
# Ver procesos dentro del contenedor
docker top nombre-contenedor¡Ahora estás listo para trabajar con Docker! 🚀 Recuerda practicar cada comando para familiarizarte con el flujo completo de trabajo
Comentarios
Publicar un comentario