docker

Docker — платформа для разработки, доставки и запуска приложений в изолированных контейнерах. Контейнер содержит всё необходимое для работы приложения: код, рантайм, библиотеки, переменные среды и конфигурацию. Docker решает проблему «работает на моей машине»: приложение в контейнере ведёт себя одинаково на ноутбуке разработчика, сервере стейджинга и продакшн-кластере.

Контейнеры vs виртуальные машины

Виртуальная машина включает полноценную гостевую ОС (ядро, системные библиотеки) поверх гипервизора. Это обеспечивает полную изоляцию, но занимает гигабайты памяти и минуты для запуска. Контейнер использует ядро хостовой ОС напрямую, изолируясь через механизмы Linux: namespaces (пространства имён для процессов, сети, файловой системы) и cgroups (ограничение ресурсов CPU, памяти). Контейнер занимает мегабайты и запускается за секунды.

Ключевые концепции Docker

  • Dockerfile — текстовый файл с инструкциями для сборки образа: FROM (базовый образ), RUN (выполнить команду), COPY (скопировать файлы), CMD/ENTRYPOINT (команда запуска). Каждая инструкция добавляет слой к образу.
  • Image (образ) — неизменяемый шаблон файловой системы, созданный из Dockerfile. Состоит из слоёв, каждый из которых кэшируется. Хранится в реестре (Docker Hub, GitHub Container Registry, ECR).
  • Container (контейнер) — запущенный экземпляр образа. Добавляет тонкий записываемый слой поверх образа. Можно запустить несколько контейнеров из одного образа.
  • Registry (реестр) — хранилище образов. Docker Hub — публичный реестр. Для приватных образов используются ECR (AWS), GCR (Google), ACR (Azure) или самохостинг.
  • Volume (том) — механизм персистентного хранения данных, независимого от жизненного цикла контейнера. Данные в томе сохраняются при пересоздании контейнера.

Структура Dockerfile: лучшие практики

Правильный порядок инструкций критически важен для эффективного кэширования слоёв:

  • Сначала копировать файлы зависимостей (package.json, requirements.txt), установить зависимости, затем копировать остальной код. Зависимости меняются реже — слой с ними кэшируется.
  • Использовать multi-stage builds: собирать в одном образе (со всеми build-инструментами), копировать только артефакты в финальный минимальный образ.
  • Использовать distroless или alpine-образы для минимального размера конечного образа.
  • Запускать процессы от непривилегированного пользователя (USER directive).
  • Не хранить секреты в слоях образа.

Docker Compose: многоконтейнерные приложения

Docker Compose позволяет декларативно описать приложение, состоящее из нескольких контейнеров, в файле compose.yaml. Типичный стек: web (Node.js/Python), db (PostgreSQL), cache (Redis). Одна команда docker compose up запускает все сервисы с нужными зависимостями, переменными и томами. Compose автоматически создаёт сеть, в которой сервисы находят друг друга по имени сервиса.

Сети Docker

Docker управляет виртуальными сетями. По умолчанию контейнеры в compose получают общую bridge-сеть и разрешают имена сервисов через встроенный DNS. Типы сетей:

  • bridge — изолированная сеть для группы контейнеров на одном хосте.
  • host — контейнер использует сетевой стек хоста напрямую (только Linux).
  • overlay — виртуальная сеть для контейнеров на разных хостах (Docker Swarm, Kubernetes).
  • none — полная изоляция от сети.

Docker в CI/CD пайплайне

Контейнеры решают проблему воспроизводимости сборок. Типичный CI/CD с Docker: сборка образа при каждом коммите, запуск тестов внутри контейнера, публикация образа в реестр с тегом (SHA коммита, версия), деплой нового образа на сервер или в Kubernetes. BuildKit (современный backend сборки Docker) поддерживает параллельную сборку слоёв, кэш при монтировании и multi-platform builds.

Docker и безопасность

Запуск контейнеров с правами root — риск безопасности. Если контейнер скомпрометирован, злоумышленник получает root на хосте при некоторых конфигурациях. Меры: запускать от непривилегированного пользователя (USER), использовать rootless Docker, применять seccomp-профили для ограничения системных вызовов, регулярно сканировать образы на уязвимости (Trivy, Docker Scout). Не хранить секреты в образах — использовать переменные окружения или секреты Kubernetes/Docker Swarm.

Частые вопросы

  • Чем контейнер отличается от виртуальной машины?

    Виртуальная машина включает полноценную гостевую ОС с собственным ядром, занимает гигабайты и запускается минутами. Контейнер разделяет ядро хостовой ОС, использует namespaces и cgroups для изоляции, занимает мегабайты и запускается секундами. VM даёт полную изоляцию; контейнер — лёгкость и скорость при достаточной изоляции для большинства задач.

  • Что такое multi-stage build в Docker?

    Multi-stage build позволяет использовать несколько FROM-инструкций в одном Dockerfile. Первый этап (builder) компилирует код со всеми инструментами разработки. Второй этап (runtime) копирует только скомпилированные артефакты в минимальный базовый образ. Итоговый образ не содержит компиляторов и dev-зависимостей — значительно меньше размером и безопаснее.

  • Как Docker обеспечивает изоляцию контейнеров?

    Docker использует два механизма ядра Linux: namespaces изолируют видимость ресурсов (процессы, сеть, файловая система, пользователи — каждый контейнер видит только свои), cgroups ограничивают потребление ресурсов (CPU, память, I/O). Union filesystem (OverlayFS) реализует слоистую файловую систему образов.

Не хватает деталей?

Напишите, что уточнить по теме «docker» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться