Docker для новичка: образы, контейнеры, оптимизация
Docker для новичка: что такое образы и контейнеры, как написать Dockerfile, собрать и оптимизировать образ. Практические примеры и частые ошибки для входа в DevOps.
Коротко. Docker упаковывает приложение со всеми зависимостями в образ, из которого запускается изолированный контейнер — одинаково на вашем ноутбуке и на сервере. Достаточно понять три сущности (образ, контейнер, реестр), написать Dockerfile и знать 6–7 команд. Это база DevOps и обязательный навык для деплоя.
Зачем нужен Docker
Классическая проблема — «у меня работает, а на сервере нет». Docker решает её: образ содержит код, рантайм, библиотеки и настройки, поэтому окружение везде идентично. Плюс изоляция: контейнеры не мешают друг другу, легко запускать несколько версий рядом.
Образ, контейнер, реестр
- Образ (image) — неизменяемый шаблон приложения (как «слепок»).
- Контейнер (container) — запущенный экземпляр образа (как процесс).
- Реестр (registry) — хранилище образов (Docker Hub и приватные реестры).
Аналогия: образ — это класс, контейнер — объект этого класса.
Первый Dockerfile
Dockerfile — рецепт сборки образа. Пример для Node.js-приложения:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Каждая инструкция создаёт слой. Порядок важен: сначала копируем зависимости и ставим их, потом код — так кэш переиспользуется и пересборка быстрее.
Базовые команды
| Команда | Что делает |
|---|---|
| docker build -t myapp . | Собрать образ из Dockerfile |
| docker run -p 3000:3000 myapp | Запустить контейнер с пробросом порта |
| docker ps | Показать запущенные контейнеры |
| docker logs ID | Посмотреть логи контейнера |
| docker stop ID | Остановить контейнер |
| docker exec -it ID sh | Зайти внутрь контейнера |
Оптимизация образа
- ✅ Лёгкий базовый образ (alpine) — образ меньше в разы.
- ✅ .dockerignore — исключите node_modules, .git, чтобы не тащить лишнее.
- ✅ Многоступенчатая сборка (multi-stage) — собираете в одном слое, в финальный кладёте только результат.
- ✅ Ставьте зависимости отдельным шагом до копирования кода — для кэша.
Пример multi-stage для фронтенда:
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/html
Частые ошибки
- ❌ Копировать весь проект до установки зависимостей — ломает кэш.
- ❌ Забыть .dockerignore — образ раздувается.
- ❌ Хранить секреты прямо в Dockerfile — используйте переменные окружения/секреты.
- ❌ Запускать всё от root без необходимости.
Частые вопросы
Docker и виртуальная машина — одно и то же?
Нет. ВМ виртуализирует целую ОС, Docker делит ядро хоста и запускает изолированные процессы — легче и быстрее.
Что учить после Docker?
docker-compose для нескольких сервисов, затем CI/CD и Kubernetes. См. основы Kubernetes и GitHub Actions.
Нужен ли Docker джуну-разработчику?
Базовый — да: собрать образ и запустить контейнер. Это ждут и от бэкенда, и от QA-автоматизатора.