Что такое Docker
Идея Docker возникла из желания создать более эффективный способ упаковки, доставки и запуска программного обеспечения. Ранее приложения могли испытывать проблемы с переносимостью между различными окружениями из-за различий в настройках и зависимостях.
Docker — платформа для разработки, доставки и запуска контейнерных приложений. Docker позволяет создавать контейнеры, автоматизировать их запуск и развёртывание, управляет жизненным циклом. Позволяет запускать множество контейнеров на одном хосте.
Docker состоит из двух главных компонентов:
- Docker — платформа виртуализации с открытым кодом
- Docker Hub — платформа-как-сервис для распространения и управления Docker-контейнерами
История Docker
Docker — проект, который был начат в 2008 году как внутренняя разработка компании dotCloud во главе с Соломоном Хайксом.
- В 2013 году компания Docker, Inc. (тогда называвшаяся Dotcloud) выпустила первую версию Docker.
- В июне 2013 года Docker стал open-source проектом, что способствовало быстрому росту сообщества разработчиков.
- В 2015 году был создан проект Open Container Initiative (OCI) для разработки открытых стандартов для контейнеров, в котором Docker сыграл ключевую роль.
- Docker быстро стал де-факто стандартом для контейнеризации в индустрии разработки ПО.
Docker и классическая виртуализация
Сравним два подхода к изоляции приложений.
Классическая виртуализация (Virtual Machines)
- Использует гипервизор для виртуализации аппаратных ресурсов
- Каждая виртуальная машина (ВМ) имеет свою собственную операционную систему
- Занимает больше ресурсов — каждая ВМ должна иметь свою копию ОС
- Запускает полные копии ОС — ресурсозатратно и медленно
Docker (контейнеризация)
- Использует контейнеризацию для упаковки и запуска приложений с зависимостями
- Все контейнеры на одном хосте используют общее ядро ОС
- Занимает меньше ресурсов — контейнеры делят ОС с хостовой системой
- Более быстрый запуск и эффективное использование ресурсов
Преимущества Docker
- Эффективность ресурсов: контейнеры делят ОС и ресурсы хостовой системы
- Быстрое развёртывание: запуск контейнеров быстрее, чем виртуальных машин
- Лёгкая масштабируемость: легко создавать и развёртывать новые контейнеры
- Повторяемость и надёжность: контейнеры обеспечивают одинаковую среду везде
- Экосистема и интеграция: Docker Hub, Docker Compose, Docker Swarm и многое другое
Архитектура Docker
Docker Engine
Docker Engine — основной компонент Docker, который управляет контейнерами. Включает в себя:
- Docker Daemon (dockerd) — фоновый процесс, который управляет контейнерами, образами, сетями и хранилищами. Принимает команды от Docker CLI и управляет контейнерами на хостовой системе.
- Docker CLI — интерфейс командной строки, который позволяет пользователям взаимодействовать с Docker Daemon, отправляя ему команды.
docker run nginx в терминале → Docker CLI отправляет запрос → Docker Daemon принимает его и выполняет: скачивает образ, создаёт и запускает контейнер.
Хостовая система Docker
Хостовая система (Host) — это система, на которой установлен Docker. Она включает:
- Daemon (Демон) — управляет всеми объектами Docker (контейнерами, образами и т.д.), обрабатывает запросы от клиента
- Containers (Контейнеры) — изолированные среды, в которых запускаются приложения. Каждый контейнер основан на образе и может включать все необходимые библиотеки и зависимости
- Images (Образы) — содержат файловую систему и всё необходимое для запуска приложения. Создаются из Dockerfile и могут быть повторно использованы
Dockerfile, Docker Image, Docker Container
Dockerfile
Dockerfile — текстовый файл с инструкциями, который используется для создания Docker-образа. Содержит последовательность команд, которые Docker выполняет для создания образа.
Docker Image (Образ)
Docker Image — неизменяемый файл, который содержит всё необходимое для запуска приложения: код, библиотеки, зависимости, инструменты и настройки. Образ создаётся на основе Dockerfile и состоит из нескольких слоёв. Каждый слой представляет собой изменения по сравнению с предыдущим.
Docker Container (Контейнер)
Docker Container — исполняемая инстанция Docker-образа. Контейнеры являются изолированными средами, которые запускаются на основе образов и содержат всё необходимое для выполнения приложения.
- Dockerfile — задание фотографу: что снять, какие инструменты взять, как «собрать» снимок
- Docker Image — готовая фотография: её можно отправить другим или выложить в интернет
- Docker Container — распечатанный отпечаток фотографии: из одного image можно сделать сколько угодно копий
Аналогичный пример: техническое задание на проектирование → производственные чертежи → стулья, произведённые по этим чертежам.
Слои образов и контейнеров
Контейнеры Docker основаны на концепции слоёв (layers).
- При создании образа Docker сохраняет его как неизменяемый иерархический набор слоёв
- Каждая инструкция Dockerfile создаёт новый слой в образе
- Docker использует кэширование слоёв для ускорения сборки: если инструкция не изменилась, используется кэш
Copy-on-write (копирование при записи)
Docker использует стратегию copy-on-write для управления слоями:
- Когда контейнер создаётся, Docker добавляет read-write слой поверх read-only образа
- Все изменения файловой системы контейнера записываются только в этот read-write слой
- Сам образ остаётся неизменным — его могут использовать многие контейнеры одновременно
- Это обеспечивает изоляцию и эффективное использование ресурсов
Docker Hub и реестры образов
Реестры Docker (Docker Registries) — хранилища образов Docker. Они могут быть:
- Публичными — например, Docker Hub (hub.docker.com)
- Частными — самоуправляемые реестры в организации
Реестры позволяют пользователям сохранять, обмениваться и загружать образы Docker.