Tutorial Completo de Docker: Componentes y Funcionamiento

 ¿Qué es Docker?

Docker es una plataforma que permite crear, desplegar y ejecutar aplicaciones en contenedores. Los contenedores empaquetan una aplicación con todas sus dependencias, garantizando que funcione de manera consistente en cualquier entorno.


🔧 Componentes Principales de Docker

1. Docker Engine

  • Motor central que corre y gestiona contenedores

  • Incluye el daemon de Docker, la API y la interfaz de línea de comandos (CLI)

2. Docker Images (Imágenes Docker)

  • Plantillas de sólo lectura utilizadas para crear contenedores

  • Incluyen todo lo necesario para ejecutar una aplicación:

    • Código de la aplicación

    • Bibliotecas y dependencias

    • Herramientas del sistema

  • Se construyen a partir de archivos Dockerfile o se descargan de Docker Hub

3. Dockerfile

  • Archivo de texto con instrucciones para construir una imagen Docker

  • Describe pasos como:

    • Instalación de software

    • Copia de archivos

    • Configuración del entorno

Ejemplo de Dockerfile:

dockerfile
# Usar la imagen oficial de Nginx como base
FROM nginx:alpine

# Copiar el archivo HTML al directorio de Nginx
COPY index.html /usr/share/nginx/html/index.html

# Exponer el puerto 80
EXPOSE 80

# Comando para iniciar Nginx
CMD ["nginx", "-g", "daemon off;"]

4. Docker Hub

  • Registro público para almacenar, compartir y descargar imágenes Docker

  • Repositorio central que permite distribución y reutilización de entornos

5. Docker Build

  • Comando para construir una imagen a partir de un Dockerfile

  • Genera imágenes personalizadas con configuraciones específicas

Ejemplo:

bash
docker build -t mi-imagen .

6. Docker Compose

  • Herramienta para definir y ejecutar múltiples contenedores en conjunto

  • Usa un archivo docker-compose.yml

  • Facilita la administración de entornos complejos

Ejecución:

bash
docker-compose up -d

7. Volúmenes

  • Mecanismo para persistir datos generados y utilizados en contenedores

  • Los datos sobreviven al ciclo de vida del contenedor

Sintaxis:

bash
-v <ruta_en_tu_equipo>:<ruta_en_el_contenedor>

8. Redes (Networks)

  • Facilitan la comunicación entre contenedores

  • Tipos principales:

    • Bridge: Red predeterminada, aísla contenedores pero permite internet

    • Host: Comparte la red del equipo anfitrión

    • User-defined: Redes personalizadas para mayor control


🚀 Comandos Básicos de Docker

Gestión de Contenedores

bash
# Ejecutar un contenedor
docker run -d -p 8080:80 --name mi-nginx nginx

# Listar contenedores en ejecución
docker ps

# Listar todos los contenedores (ejecución y detenidos)
docker ps -a

# Detener un contenedor
docker stop mi-nginx

# Iniciar un contenedor detenido
docker start mi-nginx

# Eliminar un contenedor
docker rm mi-nginx

# Ver logs de un contenedor
docker logs mi-nginx

Acceso a Contenedores

bash
# Acceder a un contenedor (con bash)
docker exec -it mi-nginx bash

# Si la imagen no tiene bash, usar sh
docker exec -it mi-nginx sh

# Ejecutar comandos específicos sin entrar al contenedor
docker exec mi-nginx cat /var/log/nginx/access.log

Gestión de Imágenes

bash
# Descargar una imagen
docker pull nginx

# Listar imágenes
docker images

# Eliminar una imagen
docker rmi mi-imagen

📁 Trabajo con Volúmenes

Montar Carpeta Local en Contenedor

bash
# Montar carpeta local en contenedor
docker run -v ~/mi-proyecto:/var/www/html mi-imagen

# Persistir datos de base de datos
docker run -v ~/mysql-datos:/var/lib/mysql mysql:5.7

Explicación:

  • ~/mi-proyecto: Ruta en tu equipo

  • /var/www/html: Ruta en el contenedor


🌐 Configuración de Redes

Comandos Básicos de Redes

bash
# Crear una red personalizada
docker network create mi-red

# Conectar un contenedor a una red
docker run --network mi-red mi-imagen

# Conectar un contenedor a múltiples redes
docker network connect mi-red mi-contenedor

Ejemplo en Docker Compose

yaml
version: '3.8'
services:
  web:
    image: php:8.0-apache
    networks:
      - red-frontend
  
  db:
    image: mysql:5.7
    networks:
      - red-backend

networks:
  red-frontend:
    driver: bridge
  red-backend:
    driver: bridge

🛠️ Ejemplo Práctico: Contenedor Web con Nginx

Paso 1: Preparar Archivos

bash
# Crear directorio y archivo HTML
mkdir mi-contenedor-web
cd mi-contenedor-web
echo "<html><body><h1>¡Hola, Mundo!</h1></body></html>" > index.html

Paso 2: Crear Dockerfile

dockerfile
# Usar la imagen oficial de Nginx como base
FROM nginx:alpine

# Copiar el archivo HTML al directorio de Nginx
COPY index.html /usr/share/nginx/html/index.html

# Exponer el puerto 80
EXPOSE 80

# Comando para iniciar Nginx
CMD ["nginx", "-g", "daemon off;"]

Paso 3: Construir la Imagen

bash
docker build -t mi-contenedor-web .

Paso 4: Ejecutar el Contenedor

bash
docker run -d -p 8080:80 --name mi-servidor-web mi-contenedor-web

Paso 5: Verificar

Visita http://localhost:8080 en tu navegador para ver la página web.


📋 Docker Compose en Acción

Archivo docker-compose.yml Completo

yaml
version: '3.8'

services:
  web:
    image: mi-contenedor-web
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./index.html:/usr/share/nginx/html/index.html
    depends_on:
      - db
    restart: always
    networks:
      - app-network

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: contraseña
      MYSQL_DATABASE: mi_db
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    networks:
      - app-network

volumes:
  db_data:

networks:
  app-network:
    driver: bridge

Comandos de Docker Compose

bash
# Iniciar servicios
docker-compose up -d

# Detener servicios
docker-compose down

# Ver logs
docker-compose logs

# Reconstruir y reiniciar
docker-compose up --build

# Listar contenedores
docker-compose ps

🔄 Flujo de Trabajo Típico

  1. Crear Dockerfile → Define el entorno de la aplicación

  2. Construir imagen → docker build -t nombre-imagen .

  3. Definir orquestación (opcional) → Crear docker-compose.yml

  4. Ejecutar contenedor →

    • Simple: docker run -p 8080:80 nombre-imagen

    • Compose: docker-compose up -d

  5. Administrar → Usar comandos de gestión y monitoreo


💡 Diferencias Clave

Imagen Oficial vs. Imagen Personalizada

AspectoImagen OficialImagen Personalizada
PersonalizaciónLimitadaCompleta
ComplejidadBajaMedia/Alta
MantenimientoProveedor
TamañoOptimizadoPuede ser mayor
Uso típicoServicios estándarAplicaciones personalizadas

Dockerfile vs Docker Compose vs Docker Build

  • Dockerfile: Define cómo construir una imagen

  • Docker Build: Construye la imagen desde el Dockerfile

  • Docker Compose: Orquesta múltiples contenedores


✅ Resumen de Comandos Esenciales

bash
# Contenedores
docker ps -a                    # Listar todos los contenedores
docker stop CONTENEDOR          # Detener contenedor
docker start CONTENEDOR         # Iniciar contenedor
docker rm CONTENEDOR            # Eliminar contenedor

# Acceso
docker exec -it CONTENEDOR bash # Acceder al contenedor
docker exec -u 0 -it CONTENEDOR bash # Acceder como root
exit                           # Salir del contenedor

# Archivos
docker cp CONTENEDOR:ORIGEN DESTINO    # Copiar desde contenedor
docker cp ORIGEN CONTENEDOR:DESTINO    # Copiar hacia contenedor

# Redes
docker network create RED       # Crear red
docker network ls              # Listar redes

🎯 Conclusión

Docker simplifica el desarrollo y despliegue de aplicaciones mediante:

  • Consistencia: Funciona igual en cualquier entorno

  • Portabilidad: Fácil mover entre desarrollo, pruebas y producción

  • Aislamiento: Aplicaciones separadas y seguras

  • Escalabilidad: Fácil escalar y orquestar servicios

Este tutorial cubre los conceptos fundamentales para comenzar a trabajar con Docker. ¡Practica con los ejemplos y estarás listo para containerizar tus aplicaciones

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