Docker — платформа контейнеризации, которая упаковывает приложение вместе со всеми зависимостями в изолированный контейнер. Выпущен в 2013 году компанией Docker, Inc., написан на языке Go, распространяется под лицензией Apache 2.0. По данным Stack Overflow Developer Survey 2023, инструмент используют 52% профессиональных разработчиков. В этой статье разберём, что такое Docker, как устроены контейнеры и образы, зачем нужны Dockerfile и Compose и чем контейнеры отличаются от виртуальных машин.
Учитесь бесплатно за счёт государства
Экономия до 100 000 ₽ на любой программе
Представьте, что приложение — не просто набор файлов, а целая «коробка»: внутри лежат код, нужные библиотеки, конфигурация и рабочая среда. Именно такую коробку создаёт Docker. Её называют контейнером. Контейнер запускается одинаково на ноутбуке разработчика, облачном сервере и в системе непрерывной интеграции — окружение всегда одинаковое.
Классический сценарий: разработчик пишет код на Python 3.10 с определёнными версиями библиотек. Коллега запускает тот же код на Python 3.8 — и получает ошибки. На продакшн-сервере — другие версии, другое поведение. Различия в окружениях порождают проблему «у меня работает», которая съедает часы на отладку.
Docker решает её радикально: приложение и все зависимости упакованы в единый контейнер. Где бы он ни запускался, внутри — одно и то же окружение. Конфликты версий остаются в прошлом, а среда разработки воспроизводимо совпадает с продакшном.

Docker — платформа контейнеризации, выпущенная в 2013 году компанией Docker, Inc. Написана на Go, Community Edition распространяется под лицензией Apache 2.0. По данным Stack Overflow Developer Survey 2023, инструмент используют 52% профессиональных разработчиков.
Две редакции:
Платформа работает на Linux, Windows (с 2015 года) и macOS. Открытые стандарты контейнеров определяет организация OCI (Open Container Initiative — Открытая инициатива по контейнерам), участником которой является Docker.
Экосистема Docker строится на четырёх взаимосвязанных компонентах. Логика такая: Dockerfile описывает, как собрать образ → образ (Image) служит шаблоном → из образа создаётся контейнер → готовые образы хранятся в Registry. Разберём каждый элемент отдельно.
Контейнер — это запущенный экземпляр образа. Удобная аналогия из объектно-ориентированного программирования: образ — класс, контейнер — объект-экземпляр. Из одного образа можно одновременно запустить десятки контейнеров.
Ключевые характеристики:
Жизненный цикл контейнера проходит четыре состояния: Created (создан) → Running (запущен) → Stopped (остановлен) → Removed (удалён). Важно: без подключения тома (Volume) данные уничтожаются при переходе в Removed — их нужно сохранять в постоянное хранилище заранее.

Образ Docker (Docker Image) — неизменяемый (readonly) шаблон, из которого создаются контейнеры. Уже собранный образ изменить нельзя — только пересобрать.
Внутри образ устроен как стопка слоёв: каждая инструкция в Dockerfile добавляет один слой поверх предыдущего. Файловая система строится поверх механизма overlay2. Благодаря слоистой структуре повторная сборка работает быстро: неизменённые слои Docker берёт из кэша, а не пересчитывает. Поэтому редко меняющиеся инструкции — например, установку зависимостей — лучше помещать выше в файле.
Каждый образ идентифицируется уникальным sha256-хэшем и может получить человекочитаемый тег: latest, v1.0, dev.
Dockerfile — текстовый файл с инструкциями на специальном языке разметки (DSL, предметно-ориентированный язык). Каждая инструкция соответствует одному слою образа. Для сборки используется команда docker build -t.
| Инструкция | Назначение | Создаёт слой |
|---|---|---|
| FROM | Базовый образ — отправная точка сборки | да |
| WORKDIR | Рабочая директория внутри контейнера | да |
| COPY | Копирует файлы с хоста в образ | да |
| RUN | Выполняет команду при сборке | да |
| CMD | Команда по умолчанию при запуске контейнера | нет |
| ENTRYPOINT | Точка входа, выполняется всегда | нет |
| USER | Пользователь для запуска процессов | нет |
Таблица 1. Основные инструкции Dockerfile и их назначение.
Ключевое различие CMD и ENTRYPOINT: аргументы, переданные в docker run, полностью заменяют CMD, но лишь дополняют ENTRYPOINT. Если контейнер должен всегда запускать конкретную программу — используйте ENTRYPOINT. Для продакшн-среды добавляйте инструкцию USER с непривилегированным пользователем: запуск от имени root повышает риски безопасности.
Docker Hub — публичный реестр образов. В нём хранятся образы более 100 000 проектов: nginx, Python, PostgreSQL, Redis и другие официальные решения. Основные команды: docker pull (скачать образ), docker push (загрузить в реестр), docker tag (добавить метку версии).
Docker Registry — корпоративное хранилище, которое организации разворачивают самостоятельно. Обеспечивает приватный доступ, аутентификацию и контроль версий: проприетарные образы хранятся внутри инфраструктуры компании, не попадая в публичное пространство.
Docker построен по клиент-серверной модели. Пользователь работает с командной строкой (CLI) — это клиент. За кулисами запросы обрабатывает цепочка компонентов. На Windows и macOS эта цепочка работает внутри лёгкой Linux-виртуальной машины — именно потому на этих системах нужен Docker Desktop.
Когда вы вводите команду docker run, запускается следующая последовательность:

Такое разделение ответственности — намеренное архитектурное решение: каждый компонент цепочки можно обновить независимо от остальных.
Docker Desktop объединяет в одном установщике Docker Engine, интерфейс командной строки, Docker Compose и графический интерфейс управления.
Контейнеры используют ядро Linux — на Windows и macOS его нет. Docker Desktop решает задачу через лёгкую виртуализацию:
Ценообразование: бесплатно для личного использования и организаций до 250 сотрудников с выручкой до $10 млн в год. Крупные компании переходят на платную подписку от $5 в месяц.
Для начинающих Docker Desktop — самый быстрый старт: устанавливаешь один пакет и сразу переходишь к практике.
И контейнеры, и виртуальные машины (VM) изолируют приложения, но делают это принципиально разными способами.
Виртуальная машина работает поверх гипервизора — программного слоя (VMware, VirtualBox, KVM), который эмулирует полноценное железо и запускает гостевую операционную систему со своим ядром. Полная изоляция обходится дорого: 5–20 ГБ дискового пространства и 1–5 минут на запуск.
Контейнер Docker использует ядро хоста напрямую: изолирует только процессы, файловую систему и сеть, не создавая отдельной операционной системы. Результат — 50–500 МБ и старт за 1–3 секунды. Контейнер легче виртуальной машины — именно это делает его стандартом для микросервисной архитектуры и массовых развёртываний.
| Параметр | Контейнер Docker | Виртуальная машина |
|---|---|---|
| Уровень изоляции | Процесс и пространство имён | Гипервизор + полноценная ОС |
| Ядро ОС | Общее с хостом | Собственное |
| Гипервизор | Не требуется | Обязателен |
| Размер | 50–500 МБ | 5–20 ГБ |
| Время запуска | 1–3 с | 1–5 мин |
| Потребление ресурсов | Низкое | Высокое |
| Совместимость ОС | Только Linux-ядро | Любая ОС |
Таблица 2. Сравнение контейнера Docker и виртуальной машины по 7 параметрам.
VM выбирают, когда требуется полная изоляция на уровне операционной системы или запуск другой ОС поверх хоста. В остальных случаях контейнер выигрывает по скорости и плотности размещения.
Реальные приложения редко состоят из одного компонента. Типичный стек — веб-приложение, база данных и кеш — это уже три сервиса. Запускать каждый вручную неудобно и чревато ошибками. Docker Compose решает задачу: все сервисы описываются в одном YAML-файле и стартуют единой командой — это основа микросервисной архитектуры на локальной машине.
Конфигурация хранится в файле docker-compose.yml (или compose.yml). Блок services перечисляет контейнеры проекта с их параметрами: образ, порты, переменные окружения, зависимости.
Классический пример трёх сервисов: web (приложение), db (PostgreSQL) и cache (Redis). Docker Compose автоматически создаёт для них общую bridge-сеть (сеть-мост). Контейнеры видят друг друга по имени сервиса: приложение обращается к базе данных через db:5432, а не через IP-адрес, который меняется при каждом перезапуске.

При 50 и более контейнерах Docker Compose уступает место полноценному оркестратору — Kubernetes или Docker Swarm.
Docker доступен на Linux, Windows и macOS. Для серверов под управлением Linux рекомендуется пакет docker-ce из официального репозитория. На Windows и macOS самый быстрый старт — Docker Desktop.
Дистрибутив для Windows и macOS скачивается с официального сайта Docker. На Linux пакет docker-ce устанавливается из репозитория через пакетный менеджер системы.
После установки проверьте корректность командой docker version: в ответе появятся два блока — Client и Server. Затем запустите первый контейнер:
Хотите сменить профессию или повысить квалификацию?
Федеральный проект «Активные меры содействия занятости» даёт возможность пройти обучение бесплатно за счёт государства
docker run hello-world
В терминале появится надпись «Hello from Docker!» — платформа работает. Контейнер скачивает образ, выполняет задачу и завершается.
Для долгоживущих сервисов — веб-серверов, баз данных — используется флаг -d:
docker run -d -p 8080:80 nginx
Флаг -d (detached) запускает контейнер в фоне: терминал освобождается немедленно, в ответ выводится только ID контейнера — длинная строка символов. Флаг -p 8080:80 пробрасывает порт: запросы на порт 8080 хоста перенаправляются на порт 80 внутри контейнера.
Команда docker ps показывает список запущенных контейнеров со статусом Up.

Для создания собственного образа из Dockerfile используется:
docker build -t myapp:1.0 .
Флаг -t (tag) задаёт имя и версию образа: myapp — имя, 1.0 — тег. Точка в конце — контекст сборки: директория, где Docker ищет Dockerfile и файлы для копирования внутрь образа.
Без флага -t образ получит только sha256-хэш без удобного имени для запуска. Популярные соглашения для тегов: latest (текущая версия), v1.0 (стабильный релиз), dev (ветка разработки). Кэширование слоёв значительно ускоряет повторные сборки: неизменённые шаги Docker не пересчитывает заново.
Контейнер разделяет ядро с хост-системой — граница между ними тоньше, чем у виртуальной машины. Поэтому Docker предлагает многоуровневую модель безопасности, основанную на механизмах ядра Linux.
Два механизма ядра Linux обеспечивают фундамент изоляции процессов в контейнере.
namespaces (пространства имён) делают ресурсы хоста невидимыми изнутри контейнера: изолируются PID (процессы), сеть, файловая система и пользователи. PID 1 внутри контейнера — не PID 1 хоста: они живут в разных пространствах имён и не видят друг друга.
cgroups (контрольные группы) ограничивают потребление ресурсов — CPU, оперативной памяти и дискового ввода-вывода. «Жадный» контейнер не сможет перегрузить соседей: квота задаётся при запуске. Оба механизма активируются компонентом runc в момент создания контейнера.
Помимо namespaces и cgroups, Docker поддерживает несколько дополнительных уровней защиты:
Когда приложение состоит из десятков контейнеров на нескольких серверах, управлять ими вручную невозможно. Нужен оркестратор — система, которая автоматически распределяет контейнеры по узлам, перезапускает упавшие сервисы и масштабирует нагрузку. У Docker есть два пути: встроенный Docker Swarm и промышленный Kubernetes.
Docker Swarm — встроенный оркестратор для мультихостовых развёртываний. Активируется командой docker swarm init без отдельной установки.
Swarm подходит для небольших кластеров средней сложности: настраивается быстрее и проще Kubernetes. При высоких нагрузках и сложных требованиях к отказоустойчивости возможностей Swarm начинает не хватать — тогда переходят на K8s.
Kubernetes (K8s) — система оркестрации, созданная в Google. Управляет сотнями и тысячами контейнеров в продакшене: Netflix, Spotify и PayPal строят на нём критическую инфраструктуру.
Docker и Kubernetes — не конкуренты. Docker создаёт контейнеры, Kubernetes управляет ими. Вместе они образуют стандартный стек непрерывной поставки.
| Параметр | Docker (одиночный) | Docker Swarm | Kubernetes |
|---|---|---|---|
| Назначение | Запуск контейнеров | Встроенная оркестрация | Промышленная оркестрация |
| Сложность настройки | Низкая | Средняя | Высокая |
| Масштаб | 1 хост | Десятки узлов | Сотни узлов |
| Автомасштабирование | Нет | Ограниченное | Полное |
| Экосистема | Богатая | Ограниченная | Огромная |
| Когда использовать | Разработка, тесты | Средние кластеры | Крупный продакшн |
Таблица 3. Сравнение Docker, Docker Swarm и Kubernetes по 6 параметрам.
Docker — не единственный инструмент контейнеризации. Три основных альтернативы:
Podman (Red Hat) — совместим с Docker CLI: большинство команд работают без изменений. Ключевое отличие — работает без демона с правами суперпользователя. В режиме rootless by default контейнеры запускаются от имени обычного пользователя прямо из коробки.
containerd — низкоуровневый контейнерный runtime (среда выполнения). Это тот самый компонент, который Docker использует внутри своей архитектуры. Kubernetes работает с containerd напрямую через интерфейс CRI (Container Runtime Interface — интерфейс среды выполнения контейнеров), минуя Docker.
LXC (Linux Containers — Linux-контейнеры) — контейнеры уровня операционной системы. По модели изоляции они ближе к виртуальным машинам: каждый LXC-контейнер ведёт себя как полноценная система со своим init-процессом.
Для большинства задач Docker остаётся оптимальным выбором: зрелая экосистема, огромный реестр образов на Docker Hub и широкое сообщество разработчиков.

Хотите освоить IT-профессию и разобраться в современных инструментах разработки? В рамках федерального проекта «Активные меры содействия занятости» можно пройти обучение по востребованным IT-направлениям — аналитика, нейросети, дизайн, 1С — без отрыва от работы и без вложений. Смотрите каталог доступных программ.
Docker Compose — инструмент для запуска многоконтейнерных приложений. Все сервисы (веб-приложение, база данных, кеш) описываются в одном файле docker-compose.yml и стартуют командой docker compose up. Остановка и удаление — docker compose down. При 50 и более контейнерах Compose заменяют на Kubernetes или Docker Swarm.
Docker создаёт и запускает контейнеры. Kubernetes — система оркестрации, управляющая сотнями контейнеров в продакшене: распределяет нагрузку, перезапускает упавшие сервисы, масштабирует автоматически. Это не конкуренты: Docker создаёт, Kubernetes управляет. Вместе они образуют стандартный стек непрерывной поставки.
Docker Swarm — встроенный в Docker оркестратор для мультихостовых развёртываний. Проще Kubernetes в настройке, активируется командой docker swarm init без дополнительной установки. При высоких нагрузках уступает K8s по функциональности. Оптимален для небольших кластеров, где полный Kubernetes избыточен.
Флаг -d (detached) запускает контейнер в фоновом режиме. Терминал освобождается немедленно — в ответ выводится только ID контейнера. Без -d терминал прикреплён к контейнеру и блокируется до его остановки. Состояние запущенных контейнеров проверяется командой docker ps.
Флаг -t (tag) задаёт имя и версию собираемого образа. Команда docker build -t myapp:1.0 . создаёт образ myapp версии 1.0 из Dockerfile в текущей директории. Без -t образ получит только sha256-хэш — без удобного имени для последующего запуска.
docker compose up запускает все сервисы из docker-compose.yml в переднем плане. Флаг -d (detached) переключает в фоновый режим: терминал свободен, контейнеры продолжают работать. Остановить и удалить все сервисы и сети — docker compose down.
Docker Engine и Docker CLI распространяются бесплатно под лицензией Apache 2.0. Docker Desktop бесплатен для личного использования и организаций до 250 сотрудников с выручкой до $10 млн в год. Крупные компании переходят на платную подписку от $5 в месяц.
Нет. Docker Desktop работает на Windows 10/11 (через WSL 2) и macOS (через Apple Virtualization Framework). Команды идентичны на всех платформах. На Linux Docker Engine устанавливается напрямую как системная служба — без дополнительного слоя виртуализации.
Docker Registry — сервер хранения Docker-образов. Публичный вариант — Docker Hub с более чем 100 000 образов: nginx, Python, PostgreSQL, Redis и другие. Для корпоративных задач разворачивают собственный Registry с приватным доступом, аутентификацией и контролем версий образов.
Podman (Red Hat) — совместим с Docker CLI, работает без root-демона по умолчанию. containerd — низкоуровневый runtime, который Docker использует внутри и который напрямую применяется в Kubernetes. LXC — контейнеры уровня ОС, ближе к VM по модели изоляции. Для большинства задач Docker предпочтительнее благодаря зрелой экосистеме.

Подайте заявку —
забронируйте место в группе
45 000 мест на 2026 год. Бесплатное обучение по федеральному проекту «Активные меры содействия занятости»