Imagenes y Dockerfile
Una imagen Docker se construye a partir de capas. Cada instruccion relevante del Dockerfile crea una capa reutilizable, por eso el orden de instrucciones afecta al cache y al rendimiento de builds.
Dockerfile basico para Node.js
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "start"]Construir:
bash
docker build -t mi-app:dev .Ejecutar:
bash
docker run --rm -p 3000:3000 mi-app:devInstrucciones principales
FROM: imagen base.WORKDIR: directorio de trabajo.COPY: copia archivos desde el host.RUN: ejecuta comandos durante la construccion.ENV: define variables de entorno.EXPOSE: documenta puertos usados.CMD: comando por defecto al iniciar contenedor.ENTRYPOINT: ejecutable principal del contenedor.
.dockerignore
Evita copiar archivos innecesarios:
txt
node_modules
.git
.env
dist
coverageCache de capas
Este orden aprovecha cache:
dockerfile
COPY package*.json ./
RUN npm ci
COPY . .Si copias todo antes de instalar, cualquier cambio en codigo invalida tambien la instalacion de dependencias.
Imagenes multi-stage
dockerfile
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/htmlBuenas practicas
- Usa imagenes base pequenas.
- Fija versiones.
- Separa build y runtime cuando aporte.
- No copies
.env. - Ejecuta como usuario no root si la imagen lo permite.
Errores comunes
- Usar
latesten produccion. - No tener
.dockerignore. - Instalar dependencias cada vez por mal orden de capas.
- Meter credenciales durante el build.
Ejercicio
Crea una imagen para una app Node sencilla que sirva un index.js. Usa .dockerignore, etiqueta la imagen y ejecutala publicando un puerto.
