Servidor Web: Imágenes de Docker vs Dockerfile
Escenarios Prácticos para Servidor Web
Caso 1: Usar Imagen Pre-construida (Nginx)
# 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
FROM nginx:alpine
COPY mi-web.html /usr/share/nginx/html/index.html
COPY mi-config.conf /etc/nginx/conf.d/default.conf# 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:
# 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 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# 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)
# Servidor web básico en 1 comando
docker run -d \
--name static-server \
-p 8080:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:alpineEstructura:
proyecto/
├── html/
│ ├── index.html
│ ├── css/
│ └── js/
└── comando-docker.shEjemplo 2: Servidor Web Personalizado (Con 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# 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)
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# Ejecutar con variables
docker run -d \
-e NGINX_HOST=midominio.com \
-e NGINX_PORT=80 \
-p 80:80 \
mi-web-configurableServidor Web con SSL (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:
Descargar nginx → Montar volumen con contenido → Ejecutar
↓ ↓ ↓
30 segundos Contenido externo Config simpleFlujo con DOCKERFILE:
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
# Desarrollo rápido
docker run -d -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx:alpineUsa DOCKERFILE cuando:
Producción
Aplicaciones empresariales
CI/CD pipelines
Entornos reproducibles
# 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)
# 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:alpineOpción B: Con Dockerfile (Producción)
# 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# 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
Publicar un comentario