Tutorial Completo: Flujo de Trabajo con Docker

 

 Tutorial Completo: Flujo de Trabajo con Docker

📋 Introducción a Docker

Docker utiliza imágenes y contenedores:

  • Imagen: Plantilla de solo lectura que define el contenedor

  • Contenedor: Instancia de una imagen en ejecución


1️⃣ Crear un Dockerfile

El Dockerfile define cómo debe construirse una imagen Docker.

Ejemplo de Dockerfile para aplicación Node.js:

dockerfile
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]

Explicación de las instrucciones:

  • FROM: Imagen base

  • WORKDIR: Directorio de trabajo en el contenedor

  • COPY: Copia archivos al contenedor

  • RUN: Ejecuta comandos durante la construcción

  • EXPOSE: Expone puertos

  • CMD: Comando por defecto al ejecutar el contenedor


2️⃣ Construir la Imagen con Docker Build

bash
docker build -t nombre-imagen .

Opciones comunes:

  • -t: Etiqueta/nombre de la imagen

  • -f: Especificar Dockerfile diferente

  • --no-cache: Construir sin usar cache


3️⃣ Definir Orquestación con Docker Compose

Para aplicaciones con múltiples servicios.

Ejemplo de docker-compose.yml:

yaml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8080:80"
    environment:
      - NODE_ENV=production
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Comandos Docker Compose:

bash
# Levantar servicios
docker-compose up -d

# Detener servicios
docker-compose down

# Ver logs
docker-compose logs

# Escalar servicios
docker-compose up -d --scale web=3

4️⃣ Ejecutar Contenedores

Ejecutar contenedor individual:

bash
# Modo interactivo
docker run -it --name=mi-contenedor nombre-imagen

# Modo detached (segundo plano)
docker run -d --name=mi-contenedor nombre-imagen

# Con mapeo de puertos
docker run -d -p 8080:80 --name=mi-contenedor nombre-imagen

# Con variables de entorno
docker run -d -e VARIABLE=valor --name=mi-contenedor nombre-imagen

# Con volumen
docker run -d -v /ruta/local:/ruta/contenedor --name=mi-contenedor nombre-imagen

Opciones importantes al crear contenedores:

bash
# Incluir en red específica
sudo docker run --name=CONTENEDOR --net=RED REPOSITORIO

# Mapeo de puertos
sudo docker run --name=CONTENEDOR -p PUERTO_EXTERNO:PUERTO_INTERNO REPOSITORIO

# Variables de entorno
sudo docker run --name=CONTENEDOR -e VARIABLE=VALOR REPOSITORIO

5️⃣ Administrar Contenedores

Comandos esenciales:

bash
# Ver contenedores en ejecución
docker ps

# Ver todos los contenedores (ejecutándose y detenidos)
docker ps -a

# Detener contenedor
docker stop ID_CONTENEDOR

# Eliminar contenedor
docker rm ID_CONTENEDOR

# Iniciar contenedor detenido
docker start CONTENEDOR

# Reiniciar contenedor
docker restart CONTENEDOR

Acceder a contenedores:

bash
# Acceder a shell del contenedor
sudo docker exec -it CONTENEDOR /bin/bash

# Acceder como root
sudo docker exec -u 0 -it CONTENEDOR /bin/bash

# Adjuntarse a contenedor en ejecución
docker attach NOMBRE_CONTENEDOR

⚠️ IMPORTANTE: Para salir de un contenedor sin detenerlo usar Ctrl + P + Q

Transferir archivos:

bash
# Copiar del contenedor al host
sudo docker cp CONTENEDOR:ORIGEN DESTINO

# Copiar del host al contenedor
sudo docker cp ORIGEN CONTENEDOR:DESTINO

🎯 Resumen del Flujo de Trabajo

Componente¿Qué hace?¿Cuándo se usa?
DockerfileDefine entorno y dependenciasCrear imagen personalizada
Docker BuildConstruye imagen desde DockerfileGenerar imagen ejecutable
Docker ComposeOrquesta múltiples contenedoresAplicaciones con varios servicios
ContenedorInstancia en ejecución de una imagenEjecutar la aplicación

🔄 Flujo Final Completo

  1. Escribir Dockerfile que define la imagen de tu aplicación

  2. Construir imagen usando docker build

  3. Definir servicios en docker-compose.yml (si es necesario)

  4. Ejecutar contenedores con docker run o docker-compose up

  5. Gestionar contenedores para monitoreo y mantenimiento


💡 Consejos Prácticos

Buenas prácticas con Dockerfile:

  • Usar imágenes oficiales

  • Minimizar el número de capas

  • Usar .dockerignore

  • Ordenar instrucciones de más estáticas a más dinámicas

Comandos útiles de diagnóstico:

bash
# Ver logs de contenedor
docker logs CONTENEDOR

# Ver uso de recursos
docker stats

# Inspeccionar contenedor
docker inspect CONTENEDOR

# Ver imágenes locales
docker images

Limpieza:

bash
# Eliminar contenedores detenidos
docker container prune

# Eliminar imágenes no usadas
docker image prune

# Limpieza completa
docker system prune

🚀 Ejemplo Práctico Completo

Estructura de proyecto:

text
mi-app/
├── Dockerfile
├── docker-compose.yml
├── package.json
└── src/
    └── app.js

Dockerfile:

dockerfile
FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "src/app.js"]

Comandos de ejecución:

bash
# Construir imagen
docker build -t mi-app .

# Ejecutar con Docker
docker run -d -p 3000:3000 --name mi-app-container mi-app

# O con Docker Compose
docker-compose up -d

¡Este flujo te permite crear, desplegar y gestionar aplicaciones de manera flexible y escalable usando Docker! 

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