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:

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:

dockerfile
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:

dockerfile
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:

bash
# 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:

bash
# 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:

yaml
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:

bash
# 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:

bash
# 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-imagen

Modos de ejecución importantes:

  • Modo detached (-d): El contenedor corre en segundo plano

  • Modo interactivo (-it): Permite interactuar con el contenedor

  • Modo TTY (-t): Asigna una pseudo-terminal

🔧 5. Administrar Contenedores

Comandos esenciales de administración:

bash
# 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:

bash
# 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 -la

Manejo de sesiones interactivas:

⚠️ Importante: Para salir de un contenedor sin detenerlo:

  • Presiona Ctrl + P seguido de Ctrl + Q

No uses exit ya que esto detendrá el contenedor.

Re-conectar a un contenedor en ejecución:

bash
docker attach nombre-contenedor

Copiar archivos:

bash
# 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:

bash
# 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?
DockerfileDefine el entorno y dependenciasAl crear una imagen personalizada
Docker BuildConstruye imágenes desde DockerfilePara generar imágenes ejecutables
Docker ComposeOrquesta múltiples contenedoresAplicaciones con varios servicios
ContenedorInstancia en ejecución de una imagenPara ejecutar la aplicación

🔄 Flujo de Trabajo Completo

  1. 📝 Escribir Dockerfile - Definir el entorno de la aplicación

  2. 🔨 Construir imagen - docker build -t mi-app .

  3. 🎼 Configurar orquestación (opcional) - Crear docker-compose.yml

  4. 🚀 Ejecutar contenedor - docker run o docker-compose up

  5. 🔧 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 .dockerignore para excluir archivos innecesarios

  • No 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

bash
# 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

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Instalar Docker en Ubuntu Server usando docker.io

Tutorial de Carpetas y Directorios en Ubuntu Linux