Saltearse al contenido

Dockerización

La dockerización permite empaquetar nuestra aplicación en un contenedor independiente que puede desplegarse fácilmente en cualquier entorno que soporte Docker.

Creación del Dockerfile

Creamos un Dockerfile con enfoque multi-etapa para optimizar el tamaño y rendimiento:

# Etapa de construcción
FROM node:20-alpine AS build
WORKDIR /app
# Copiar package.json y package-lock.json
COPY package*.json ./
# Instalar dependencias
RUN npm ci
# Copiar el resto de archivos del proyecto
COPY . .
# Construir la aplicación
RUN npm run build
# Etapa de producción
FROM nginx:alpine AS production
# Copiar archivos estáticos compilados
COPY --from=build /app/dist /usr/share/nginx/html
# Configuración básica de nginx
COPY --from=build /app/nginx.conf /etc/nginx/conf.d/default.conf
# Exponer el puerto
EXPOSE 80
# Comando de inicio
CMD ["nginx", "-g", "daemon off;"]

Ventajas del enfoque multi-etapa

  • Tamaño reducido: El contenedor final solo incluye lo necesario para ejecutar la aplicación
  • Mayor seguridad: Menos dependencias implican menos vulnerabilidades potenciales
  • Mejor eficiencia: Imágenes más pequeñas significan despliegues más rápidos

Configuración de Nginx para Docker

Creamos un archivo nginx.conf en la raíz del proyecto para servir los archivos estáticos:

server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# Configuración para archivos estáticos
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
add_header Cache-Control "public, max-age=31536000";
}
}

Esta configuración:

  • Define el directorio raíz donde se servirán los archivos
  • Configura el archivo index por defecto
  • Define cómo manejar las rutas
  • Optimiza el caché para archivos estáticos

Optimizaciones con .dockerignore

Creamos un archivo .dockerignore para excluir archivos innecesarios del contexto de construcción:

node_modules
.git
.github
.vscode
.astro
dist
*.md
.env*
!.env.example
.dockerignore
Dockerfile
docker-compose.yml

Las ventajas de usar .dockerignore incluyen:

  • Construcción más rápida: Menos archivos para copiar
  • Evitar errores: Previene la copia de archivos que podrían causar problemas
  • Mayor seguridad: Evita la inclusión accidental de secretos

Construcción de la imagen

Para construir la imagen Docker, ejecutamos:

Ventana de terminal
docker build -t neodigital-wiki:latest .

Ejecución del contenedor

Para ejecutar el contenedor localmente durante el desarrollo:

Ventana de terminal
docker run -d -p 80:80 --name wiki neodigital-wiki:latest

Siguientes pasos

Con la aplicación dockerizada, estamos listos para la configuración del servidor donde se desplegará la aplicación.