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) реализует слоистую файловую систему образов.
Другие термины в теме «DevOps и облака»
Не хватает деталей?
Напишите, что уточнить по теме «docker» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).