Servidor Web: Imágenes de Docker vs Dockerfile

 Escenarios Prácticos para Servidor Web

Caso 1: Usar Imagen Pre-construida (Nginx)

bash
# Descargar y ejecutar Nginx oficial en 30 segundos
docker run -d --name mi-web -p 80:80 nginx:alpine

✅ Listo! Tu servidor web está funcionando en http://localhost

Caso 2: Crear Imagen Personalizada con Dockerfile

dockerfile
# Dockerfile
FROM nginx:alpine
COPY mi-web.html /usr/share/nginx/html/index.html
COPY mi-config.conf /etc/nginx/conf.d/default.conf
bash
# Construir y ejecutar
docker build -t mi-web-personalizado .
docker run -d --name web-custom -p 8080:80 mi-web-personalizado

📊 Comparación Directa - Servidor Web Nginx

Usando SOLO IMAGEN:

bash
# Ejecutar Nginx estándar
docker run -d --name nginx-basico -p 80:80 nginx:alpine

# Verificar
curl http://localhost

✅ Ventajas:

  • Rápido (1 comando)

  • Configuración probada

  • Actualizaciones automáticas

❌ Desventajas:

  • Contenido por defecto

  • Configuración genérica

  • No personalizable

Usando DOCKERFILE:

dockerfile
# Dockerfile para servidor web personalizado
FROM nginx:alpine

# Copiar contenido HTML personalizado
COPY src/ /usr/share/nginx/html/

# Copiar configuración Nginx personalizada
COPY nginx.conf /etc/nginx/nginx.conf

# Instalar herramientas adicionales
RUN apk add --no-cache curl

# Exponer puerto
EXPOSE 80 443

# Health check
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
bash
# Construir
docker build -t mi-servidor-web .

# Ejecutar
docker run -d -p 80:80 --name web-app mi-servidor-web

✅ Ventajas:

  • Contenido personalizado

  • Configuración específica

  • Reproducible

  • Versionable

❌ Desventajas:

  • Más tiempo inicial

  • Mantenimiento requerido


🛠 Ejemplos Completos

Ejemplo 1: Servidor Web Estático (Solo Imagen)

bash
# Servidor web básico en 1 comando
docker run -d \
  --name static-server \
  -p 8080:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  nginx:alpine

Estructura:

text
proyecto/
├── html/
│   ├── index.html
│   ├── css/
│   └── js/
└── comando-docker.sh

Ejemplo 2: Servidor Web Personalizado (Con Dockerfile)

dockerfile
# Dockerfile
FROM nginx:alpine

# Eliminar contenido por defecto
RUN rm -rf /usr/share/nginx/html/*

# Copiar sitio web personalizado
COPY ./mi-sitio-web /usr/share/nginx/html

# Configuración personalizada de Nginx
COPY nginx-custom.conf /etc/nginx/conf.d/default.conf

# Configurar permisos
RUN chown -R nginx:nginx /usr/share/nginx/html

# Exponer puertos
EXPOSE 80 443

# Health check
HEALTHCHECK CMD curl --fail http://localhost/ || exit 1
bash
# Construir
docker build -t mi-sitio-produccion .

# Ejecutar con optimizaciones
docker run -d \
  --name produccion-web \
  -p 80:80 \
  -p 443:443 \
  --restart unless-stopped \
  mi-sitio-produccion

🔧 Configuraciones Avanzadas

Configuración con Variables de Entorno (Dockerfile)

dockerfile
FROM nginx:alpine

# Crear directorio para templates
RUN mkdir -p /etc/nginx/templates

# Configuración que usa variables
COPY default.conf.template /etc/nginx/templates/

# Script de inicialización
COPY init.sh /docker-entrypoint.d/
RUN chmod +x /docker-entrypoint.d/init.sh

EXPOSE 80
bash
# Ejecutar con variables
docker run -d \
  -e NGINX_HOST=midominio.com \
  -e NGINX_PORT=80 \
  -p 80:80 \
  mi-web-configurable

Servidor Web con SSL (Dockerfile)

dockerfile
FROM nginx:alpine

# Copiar configuración SSL
COPY ssl/ /etc/nginx/ssl/
COPY nginx-ssl.conf /etc/nginx/conf.d/default.conf

# Crear directorio para certificados
RUN mkdir -p /etc/nginx/ssl

EXPOSE 80
EXPOSE 443

📈 Comparación de Flujos de Trabajo

Flujo con SOLO IMAGEN:

text
Descargar nginx → Montar volumen con contenido → Ejecutar
      ↓                    ↓                       ↓
  30 segundos        Contenido externo       Config simple

Flujo con DOCKERFILE:

text
Crear Dockerfile → Construir imagen → Subir a registry → Ejecutar
       ↓               ↓                 ↓               ↓
  Desarrollo        Empaquetado      Distribución    Producción

🚀 Casos de Uso Recomendados

Usa SOLO IMAGEN cuando:

  • Desarrollo rápido/prototipos

  • Testing de configuración

  • Entornos temporales

  • Aprendizaje

bash
# Desarrollo rápido
docker run -d -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx:alpine

Usa DOCKERFILE cuando:

  • Producción

  • Aplicaciones empresariales

  • CI/CD pipelines

  • Entornos reproducibles

dockerfile
# Dockerfile para producción
FROM nginx:alpine
COPY dist/ /usr/share/nginx/html/
COPY nginx-prod.conf /etc/nginx/nginx.conf
RUN adduser -D -s /bin/sh mi-usuario
USER mi-usuario
EXPOSE 8080

🔍 Ejemplo Real: Sitio E-commerce

Opción A: Solo Imagen (Rápido)

bash
# Para desarrollo
docker run -d \
  --name ecommerce-dev \
  -p 3000:80 \
  -v $(pwd)/src:/usr/share/nginx/html \
  -v $(pwd)/nginx-dev.conf:/etc/nginx/conf.d/default.conf \
  nginx:alpine

Opción B: Con Dockerfile (Producción)

dockerfile
# Dockerfile para ecommerce
FROM nginx:alpine

# Instalar dependencias de seguridad
RUN apk add --no-cache openssl

# Configurar SSL
RUN openssl req -x509 -nodes -days 365 \
  -newkey rsa:2048 \
  -keyout /etc/ssl/private/nginx.key \
  -out /etc/ssl/certs/nginx.crt \
  -subj "/C=US/ST=State/L=City/O=Organization/CN=localhost"

# Copiar aplicación
COPY build/ /usr/share/nginx/html/

# Configuración de producción
COPY nginx-prod.conf /etc/nginx/nginx.conf

# Seguridad
RUN chown -R nginx:nginx /usr/share/nginx/html
RUN chmod -R 755 /usr/share/nginx/html

EXPOSE 80 443
bash
# Construir para producción
docker build -t ecommerce-prod .
docker run -d -p 80:80 -p 443:443 ecommerce-prod

📋 Checklist de Decisión

Elige SOLO IMAGEN si:

  • Necesitas un servidor web rápido

  • El contenido cambia frecuentemente

  • Es para desarrollo/testing

  • No necesitas configuración compleja

Elige DOCKERFILE si:

  • Va a producción

  • Necesitas configuración personalizada

  • Quieres reproducibilidad

  • Usas CI/CD

  • Necesitas seguridad específica


🎯 Conclusión para Servidor Web

  • "Solo imagen" = Velocidad ⚡ (ideal para desarrollo)

  • "Con Dockerfile" = Control 🛡️ (ideal para producción)

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