Tutorial Completo de Docker: Desde Imágenes Oficiales hasta Docker Compose

 1. Usar una Imagen Oficial Directamente

¿Qué es una imagen oficial?

Las imágenes oficiales son imágenes preconstruidas y mantenidas por los desarrolladores oficiales o la comunidad, optimizadas para uso general.

Ejemplo: Usar Nginx oficial

bash
docker run -d -p 8080:80 --name mi-nginx nginx

Explicación:

  • -d: Ejecuta en segundo plano (detached)

  • -p 8080:80: Mapea puerto 80 del contenedor al 8080 del host

  • --name mi-nginx: Asigna nombre al contenedor

  • nginx: Imagen oficial de Nginx

Ventajas:

  • No necesitas Dockerfile

  • Lista para usar inmediatamente

  • Optimizada y segura

Opción 1: Usando Volúmenes (Recomendado para desarrollo)

bash
# 1. Crear tu archivo HTML personalizado
echo "<html><body><h1>¡Mi Web Personalizada!</h1><p>Usando imagen oficial</p></body></html>" > index.html

# 2. Ejecutar el contenedor mapeando tu archivo
docker run -d -p 8080:80 --name mi-nginx \
  -v $(pwd)/index.html:/usr/share/nginx/html/index.html \
  nginx

Opción 2: Copiando archivos después de crear el contenedor

bash
# 1. Crear el contenedor
docker run -d -p 8080:80 --name mi-nginx nginx

# 2. Crear tu archivo HTML
echo "<html><body><h1>¡Contenido Personalizado!</h1></body></html>" > mi-web.html

# 3. Copiar tu archivo al contenedor
docker cp mi-web.html mi-nginx:/usr/share/nginx/html/index.html

# 4. Recargar Nginx (opcional)
docker exec mi-nginx nginx -s reload

Opción 3: Usando un directorio completo

bash
# 1. Crear directorio con todos tus archivos web
mkdir mi-sitio-web
echo "<html><body><h1>Mi Sitio Completo</h1></body></html>" > mi-sitio-web/index.html
echo "/* Tus estilos CSS */" > mi-sitio-web/styles.css

# 2. Montar todo el directorio
docker run -d -p 8080:80 --name mi-nginx \
  -v $(pwd)/mi-sitio-web:/usr/share/nginx/html \
  nginx

2. Crear un Contenedor Web Personalizado con Nginx

Paso 1: Crear estructura del proyecto

bash
mkdir mi-contenedor-web
cd mi-contenedor-web
echo "<html><body><h1>¡Hola, Mundo desde mi contenedor personalizado!</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;"]

Instrucciones comunes del Dockerfile:

  • FROM: Imagen base

  • RUN: Ejecuta comandos

  • COPY: Copia archivos del host a la imagen

  • WORKDIR: Establece directorio de trabajo

  • CMD: Comando por defecto al iniciar

  • ENTRYPOINT: Comando principal (no se puede sobrescribir)

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.


3. Dockerfile vs Docker Compose vs Docker Build

Dockerfile

  • Propósito: Script para construir imágenes personalizadas

  • Uso: Define el entorno de la aplicación

  • Ejemplo: Instalar dependencias, copiar código, configurar servicios

Docker Build

  • Propósito: Comando que construye imágenes desde un Dockerfile

  • Usodocker build -t nombre-imagen .

  • Ejemplo: Crea la imagen ejecutable

Docker Compose

  • Propósito: Orquestar múltiples contenedores

  • Uso: Define servicios, redes, volúmenes en YAML

  • Ejemplo: Aplicación web + base de datos + cache

Flujo de trabajo conjunto:

  1. Dockerfile → Define la aplicación

  2. Docker Build → Construye la imagen

  3. Docker Compose → Ejecuta la aplicación con servicios relacionados


4. Docker Compose para Orquestación

Crear docker-compose.yml

yaml
version: '3.8'

services:
  web:
    image: mi-contenedor-web
    build: .  # Construye desde Dockerfile actual
    ports:
      - "8080:80"
    volumes:
      - ./index.html:/usr/share/nginx/html/index.html
    restart: always
    container_name: mi-servidor-web-compose

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

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

Ejemplo Avanzado con Base de Datos

yaml
version: '3.8'

services:
  web:
    image: mi-contenedor-web
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
    restart: always

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: contraseña-segura
      MYSQL_DATABASE: mi_app
    volumes:
      - db_data:/var/lib/mysql
    restart: always

volumes:
  db_data:

5. Comandos Esenciales de Docker

Gestión de Contenedores

bash
# Ver contenedores en ejecución
docker ps

# Ver todos los contenedores
docker ps -a

# Detener contenedor
docker stop NOMBRE_CONTENEDOR

# Eliminar contenedor
docker rm NOMBRE_CONTENEDOR

# Iniciar contenedor detenido
docker start NOMBRE_CONTENEDOR

# Reiniciar contenedor
docker restart NOMBRE_CONTENEDOR

Shell y Archivos

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

# Copiar archivos del contenedor al host
docker cp NOMBRE_CONTENEDOR:/ruta/en/contenedor /ruta/en/host

# Copiar archivos del host al contenedor
docker cp /ruta/en/host NOMBRE_CONTENEDOR:/ruta/en/contenedor

# Salir del shell
exit

Gestión de Imágenes

bash
# Listar imágenes
docker images

# Eliminar imagen
docker rmi NOMBRE_IMAGEN

# Inspeccionar imagen/contenedor
docker inspect NOMBRE

6. Diferencias Clave: Imagen Oficial vs Personalizada

AspectoImagen OficialImagen Personalizada
PersonalizaciónLimitadaCompleta
ComplejidadBajaMedia/Alta
MantenimientoProveedor
TamañoOptimizadoPuede ser mayor
Casos de usoServicios estándarAplicaciones específicas

¿Cuándo usar cada una?

Usar imagen oficial cuando:

  • Necesitas servicio estándar (Nginx básico, MySQL)

  • Sin configuraciones especiales

  • Rapidez y simplicidad

Construir imagen personalizada cuando:

  • Necesitas archivos/configuraciones específicas

  • Tu aplicación tiene dependencias especiales

  • Quieres control total sobre la imagen


7. Ejemplos Prácticos de Creación de Contenedores

Contenedor en modo detached (recomendado)

bash
docker run -d --name=mi-contenedor nginx

Contenedor con red específica

bash
docker run --name=mi-contenedor --net=mi-red nginx

Contenedor con mapeo de puertos

bash
docker run --name=mi-contenedor -p 8080:80 nginx

Contenedor con variables de entorno

bash
docker run --name=mi-contenedor -e VARIABLE=valor nginx

8. Recursos Adicionales Recomendados

Videos Tutoriales:

Mejores Prácticas:

  • Usa imágenes oficiales siempre que sea posible

  • Mantén tus imágenes lo más pequeñas posible

  • Usa .dockerignore para excluir archivos innecesarios

  • Implementa health checks en tus contenedores

  • Usa volúmenes para datos persistentes


Conclusión

Este tutorial te ha mostrado el flujo completo de trabajo con Docker:

  1. Imágenes oficiales para servicios estándar

  2. Dockerfile para personalización

  3. Docker Compose para orquestación

  4. Comandos esenciales para gestión diaria

Recuerda: La práctica constante es clave para dominar Docker. ¡Comienza con proyectos simples y ve incrementando la complejidad gradualmente

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