📖 Теория: Основы Docker

⚡ Кратко: Docker за 2 минуты

Docker — платформа контейнеризации. Контейнеры изолируют приложение от окружения, но в отличие от VM делят ядро ОС хоста, поэтому легче и быстрее.

  • DockerfileImageContainer: рецепт → образ → запущенный процесс
  • Docker Engine: Daemon (фоновый процесс) + CLI (командная строка)
  • Слои: образ = стек неизменяемых слоёв, контейнер добавляет read-write слой сверху
  • Реестр: хранилище образов; публичный — Docker Hub, бывают частные

Ключевое преимущество: "Works on my machine" больше не проблема — образ переносит всё окружение.

Что такое Docker

Идея 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 слой
  • Сам образ остаётся неизменным — его могут использовать многие контейнеры одновременно
  • Это обеспечивает изоляцию и эффективное использование ресурсов
⚠️ Важно: Данные в read-write слое контейнера не сохраняются после удаления контейнера. Для постоянного хранения данных используются volumes (тома) — это тема урока 02.

Docker Hub и реестры образов

Реестры Docker (Docker Registries) — хранилища образов Docker. Они могут быть:

  • Публичными — например, Docker Hub (hub.docker.com)
  • Частными — самоуправляемые реестры в организации

Реестры позволяют пользователям сохранять, обмениваться и загружать образы Docker.

💡 Docker Hub содержит тысячи готовых образов: операционные системы (ubuntu, alpine), веб-серверы (nginx), базы данных (postgres, mysql), языки программирования (python, node) и многое другое.