Apéndice C — Docker y Docker Compose

Objetivo del apéndice

Imágenes, contenedores, redes, volúmenes y multi-servicio con Compose. Suficiente para correr Backstage localmente.

Conceptos

  • Imagen: snapshot de un FS + comando de arranque.

  • Contenedor: instancia corriendo de una imagen.

  • Volumen: almacenamiento persistente fuera del FS del contenedor.

  • Red: espacio de nombres donde los contenedores se ven por hostname.

  • Compose: declarativa multi-contenedor en YAML.

Comandos esenciales

docker pull postgres:16           # bajar imagen
docker images                     # listar imágenes
docker run -d --name db postgres:16
docker ps                         # contenedores corriendo
docker ps -a                      # todos
docker logs -f db                 # logs del contenedor
docker exec -it db bash           # shell interactivo
docker stop db                    # parar
docker rm db                      # borrar
docker rmi postgres:16            # borrar imagen

Compose mínimo

services:
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:
docker compose up -d      # arranca en background
docker compose down       # para y borra contenedores (no volúmenes)
docker compose logs -f    # logs agregados
docker compose exec db bash

Dockerfile mínimo (Node)

FROM node:20-bookworm-slim AS builder
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build

FROM node:20-bookworm-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 7007
CMD ["node", "dist/index.js"]
Buenas prácticas
  • Imágenes slim (:code:`-slim`) cuando puedas.

  • :code:`HEALTHCHECK` para que Compose sepa si el contenedor está listo.

  • :code:`--init` para que las señales lleguen al proceso principal.

  • Variables de entorno en :code:`.env`, no en el YAML.