Esta es una guía super sencilla para entender qué es Docker, cómo levantar este proyecto y por qué necesitamos nginx.
Docker es una herramienta que nos permite empaquetar nuestra aplicación junto con todo lo que necesita para funcionar (dependencias, configuraciones, etc.) en un "contenedor".
Imagínate que tu aplicación es como una comida para llevar: Docker es la caja que contiene todo lo necesario para que funcione perfectamente en cualquier lugar, sin importar qué computadora uses.
- ✅ Consistencia: Funciona igual en tu computadora, en el servidor y en la de tu compañero
- ✅ Aislamiento: No interfiere con otras aplicaciones
- ✅ Portabilidad: Se puede mover fácilmente entre diferentes ambientes
- ✅ Reproducibilidad: Siempre obtienes el mismo resultado
# Instalar dependencias
npm install
# Levantar en modo desarrollo
npm run dev# Construir la imagen de Docker
docker build -t astro-app .
# Ejecutar el contenedor
docker run -p 8080:8080 astro-appDespués de esto, abre tu navegador en http://localhost:8080
Cuando desarrollamos localmente, Astro tiene su propio servidor integrado. Pero en producción necesitamos algo más robusto y eficiente.
nginx es un servidor web super rápido y ligero que se encarga de:
- Servir archivos estáticos: HTML, CSS, JS, imágenes
- Manejar múltiples conexiones: Miles de usuarios al mismo tiempo
- Comprimir archivos: Para que carguen más rápido
- Manejar errores: Como páginas 404
- Seguridad: Protección básica contra ataques
- 🐌 Node.js es más lento sirviendo archivos estáticos
- 🔧 nginx está optimizado específicamente para esto
- 💪 nginx consume menos memoria y CPU
- 🛡️ nginx tiene mejor manejo de seguridad
Nuestro archivo de configuración de nginx está en nginx/nginx.conf. Vamos línea por línea:
worker_processes 1;¿Qué hace? Define cuántos procesos de nginx usar. Con 1 es suficiente para aplicaciones pequeñas.
events {
worker_connections 1024;
}¿Qué hace? Cada proceso puede manejar hasta 1024 conexiones simultáneas.
http {
server {
listen 8080;
server_name _;¿Qué hace? nginx escucha en el puerto 8080 y acepta cualquier nombre de dominio.
root /usr/share/nginx/html;
index index.html index.htm;¿Qué hace? Define dónde están los archivos de nuestra aplicación y qué archivo mostrar por defecto.
gzip on;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript...;¿Qué hace? Activa la compresión para archivos mayores a 1000 bytes. Esto hace que la página cargue más rápido.
location / {
try_files $uri $uri/index.html =404;
}¿Qué hace? Esta es la parte más importante. Le dice a nginx:
- Primero, busca el archivo exacto que se pidió
- Si no existe, busca una carpeta con ese nombre y muestra su index.html
- Si tampoco existe, muestra error 404
Esto es crucial para aplicaciones SPA (Single Page Applications) como las de Astro.
Nuestro Dockerfile tiene dos etapas:
FROM node:lts AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build¿Qué hace? Instala dependencias y construye la aplicación para producción.
FROM nginx:alpine AS runtime
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 8080¿Qué hace? Toma los archivos construidos y los sirve con nginx.
- 🎯 Imagen más pequeña: Solo incluimos lo necesario para producción
- 🗑️ Sin basura: No incluimos Node.js ni dependencias de desarrollo
- ⚡ Más rápida: Menos archivos = descargas más rápidas
- Docker empaqueta nuestra aplicación para que funcione en cualquier lugar
- nginx sirve nuestros archivos de forma súper eficiente
- El Dockerfile construye primero y luego sirve (optimización)
- La configuración de nginx maneja rutas, compresión y errores
¡Y eso es todo! Ahora tienes una aplicación Astro completamente containerizada y lista para producción. 🎉