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 | Зайти внутрь контейнера |
docker-compose: несколько сервисов
Реальное приложение — это не один контейнер, а несколько: бэкенд, база, кэш. Запускать их по одному вручную неудобно. docker-compose описывает всю связку одним YAML-файлом и поднимает её командой docker compose up:
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
Это следующий после Dockerfile навык, который ждут почти на любой вакансии с Docker.
Оптимизация образа
- ✅ Лёгкий базовый образ (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 без необходимости.
Следующий шаг в DevOps
Соберите и опубликуйте образ учебного сервиса, опишите в README команды build/run. Поднимите один сервис в Docker, прогоните простой CI, задеплойте на VPS или в песочницу. База: GitHub Actions, VPS. Полный маршрут — DevOps старт, обзор роли — DevOps на уровне джуна.
Проверьте контейнер после пересоздания
Соберите образ своего сервиса, запустите его и проверьте ответ. Измените код, пересоберите образ и пересоздайте контейнер. Данные, которые должны сохраняться, вынесите в volume и проверьте после пересоздания. Секреты не должны попадать в образ.
По теме: GitHub Actions, VPS, DevOps старт, DevOps на уровне джуна, профессии.
Проверьте, что проект можно перенести и восстановить
После первого запуска попробуйте перенести проект на другой сервер и восстановить его из резервной копии. Проверьте базу, файлы и действия пользователя. Так станет видно, какие зависимости вы забыли при первом деплое.
Частые вопросы
Docker и виртуальная машина — одно и то же?
Нет. ВМ виртуализирует целую ОС, Docker делит ядро хоста и запускает изолированные процессы — легче и быстрее.
Что учить после Docker?
docker-compose для нескольких сервисов, затем CI/CD и Kubernetes. См. основы Kubernetes и GitHub Actions.
Нужен ли Docker джуну-разработчику?
Базовый — да: собрать образ и запустить контейнер. Это ждут и от бэкенда, и от QA-автоматизатора.
Docker или Podman?
Для старта — Docker: больше материалов и вакансий. Podman совместим по командам и осваивается потом легко.
Материал «Docker для новичка: образы, контейнеры, оптимизация» имеет смысл только вместе с практикой: один артефакт в git на этой неделе важнее десяти вкладок с теорией. Если застряли на выборе роли — начните с профессий и одной вакансии-ориентира.