Dockerfile — текстовый скрипт сборки Docker-образа. Инструкции: FROM (базовый образ), RUN (выполнить команду), COPY/ADD (скопировать файлы), WORKDIR, ENV, EXPOSE, CMD, ENTRYPOINT. Каждая инструкция создаёт layer — кэшируемый слой.
Best practices: (1) multi-stage build — separate build-stage (с компилятором) и runtime-stage (только результат). Пример: node:22-alpine as build → COPY .next/standalone into distroless. Финальный образ 50 МБ вместо 1 ГБ. (2) минимальный base — alpine (5 МБ) или distroless (без shell) вместо ubuntu (70 МБ). (3) layer cache order — сначала COPY package.json + npm install, потом COPY код — пере-install только при изменении package.json.
Ещё: (4) .dockerignore — не копировать node_modules, .git, .env в build context (ускоряет билд, уменьшает образ). (5) non-root user — `USER 1000` в конце (безопасность). (6) healthcheck — `HEALTHCHECK CMD curl -f http://localhost/health` (Docker/K8s знают, жив ли контейнер).
Практика: наш Dockerfile для Next.js — 3-stage (deps → build → runner), финал 150 МБ на node:22-alpine + standalone. Готовые примеры Dockerfile для Node/Python/Go/Rust — в `/docs/docker-recipes`.