Добавить в корзинуПозвонить
Найти в Дзене
Анастасия Софт

Введение в контейнеризацию: Что такое Docker и почему он изменил мир разработки. Урок 1

Наверняка каждый разработчик хотя бы раз в жизни произносил фразу: «Странно, на моей машине всё работает!». Вы написали код (например, на Java с использованием Spring Boot), настроили локальную базу данных, установили нужные версии библиотек. Всё компилируется и летает. Но когда вы передаете этот код тестировщику или пытаетесь развернуть на рабочем сервере, всё ломается. Оказывается, на сервере стоит другая версия Java, переменные окружения называются иначе, а нужный порт уже занят другим приложением. Именно эту фундаментальную проблему решает Docker. Контейнеризация — это метод упаковки приложения и всех его зависимостей (библиотек, конфигурационных файлов, системных утилит) в единый стандартизированный блок, который называется контейнером. Контейнер изолирован от остальной операционной системы и других контейнеров. Это гарантирует, что приложение будет работать абсолютно одинаково везде: на вашем ноутбуке с Windows или macOS, на сервере с Ubuntu или в облаке AWS. Docker не изобрел ко
Оглавление
Введение в контейнеризацию: Что такое Docker и почему он изменил мир разработки
Введение в контейнеризацию: Что такое Docker и почему он изменил мир разработки

Наверняка каждый разработчик хотя бы раз в жизни произносил фразу: «Странно, на моей машине всё работает!».

Вы написали код (например, на Java с использованием Spring Boot), настроили локальную базу данных, установили нужные версии библиотек. Всё компилируется и летает. Но когда вы передаете этот код тестировщику или пытаетесь развернуть на рабочем сервере, всё ломается. Оказывается, на сервере стоит другая версия Java, переменные окружения называются иначе, а нужный порт уже занят другим приложением.

Именно эту фундаментальную проблему решает Docker.

Что такое контейнеризация?

Контейнеризация — это метод упаковки приложения и всех его зависимостей (библиотек, конфигурационных файлов, системных утилит) в единый стандартизированный блок, который называется контейнером.

Контейнер изолирован от остальной операционной системы и других контейнеров. Это гарантирует, что приложение будет работать абсолютно одинаково везде: на вашем ноутбуке с Windows или macOS, на сервере с Ubuntu или в облаке AWS.

Docker не изобрел контейнеры (технологии вроде LXC существовали в Linux задолго до него), но он сделал их использование простым, удобным и массовым.

Docker vs. Виртуальные машины (VM): Главное отличие

Чтобы понять легкость Docker, нужно сравнить его с традиционным подходом — виртуализацией.

Виртуальная машина (VM) эмулирует полноценный физический компьютер. Чтобы запустить приложение в VM, вам нужен гипервизор (например, VirtualBox или VMware), поверх которого устанавливается полноценная гостевая операционная система (Guest OS), и только внутри неё крутится ваше приложение.

  • Аналогия: Вы строите отдельный дом с собственным фундаментом, водопроводом и электричеством для каждого нового жильца. Это надежно, но очень ресурсоемко.

Docker-контейнер не эмулирует «железо» и не содержит полноценную ОС. Контейнеры делят ядро хост-операционной системы (Host OS) между собой. Они изолированы друг от друга на уровне процессов (благодаря механизмам Linux, таким как Namespaces и Cgroups).

  • Аналогия: Вы строите большой многоквартирный дом. Общий водопровод и фундамент (ядро ОС) делятся между всеми, но каждая квартира (контейнер) имеет свою железную дверь и свой интерьер.

Таблица сравнения

-2

Архитектура Docker: Как это работает внутри

Docker использует клиент-серверную архитектуру. Главные компоненты, которые нужно знать:

  1. Docker Daemon (dockerd) — это серверная часть. Фоновый процесс, который работает на хост-машине. Именно он делает всю "грязную" работу: создает, запускает, останавливает и удаляет контейнеры, управляет сетями и томами. Демон слушает API-запросы от клиентов.
  2. Docker Client (docker) — это интерфейс командной строки (CLI), с которым вы взаимодействуете. Когда вы вводите в терминал команду docker run, клиент отправляет этот запрос демону через REST API. Клиент и демон могут находиться как на одном компьютере (что бывает чаще всего при локальной разработке), так и на разных.
  3. Docker Registry — это хранилище образов (библиотека). Самый известный публичный реестр — Docker Hub. Когда вы просите Docker запустить базу данных PostgreSQL, он сначала ищет её образ локально. Если не находит, демон автоматически скачивает (pull) его из реестра.
  4. Docker Image (Образ) — это read-only (только для чтения) шаблон с инструкциями для создания контейнера. Это как чертеж дома или класс в объектно-ориентированном программировании.
  5. Docker Container (Контейнер) — это запущенный экземпляр образа. Если образ — это класс, то контейнер — это объект этого класса. В него можно вносить изменения, пока он работает, но по умолчанию эти изменения исчезнут при его удалении.

Практический пример: Разбор процесса "под капотом"

Давайте представим, что вы ввели в терминал команду для запуска тестового веб-сервера (в следующей статье мы разберем эти команды детально):

docker run -d -p 8080:80 nginx

Вот что произойдет за доли секунды с точки зрения архитектуры:

  1. Клиент (docker) перехватывает вашу команду и отправляет REST API запрос к Docker Daemon (dockerd).
  2. Демон проверяет, есть ли на вашем жестком диске Image (образ) с названием nginx.
  3. Если образа нет, демон обращается к Docker Registry (Docker Hub) и скачивает официальный образ Nginx.
  4. Получив образ, демон создает из него новый Container.
  5. Демон выделяет контейнеру часть файловой системы (read-write слой), назначает ему IP-адрес внутри внутренней сети Docker и связывает порт 8080 вашего компьютера с портом 80 внутри контейнера.
  6. Демон запускает главный процесс веб-сервера внутри контейнера. Всё, приложение работает!

Блок самопроверки

Внимательно прочитайте задачу и попробуйте ответить на нее самостоятельно, опираясь на теорию выше.

Ситуация: Вы присоединились к проекту. У вас есть мощный рабочий ноутбук. Вам нужно одновременно запустить три компонента системы:

  1. Legacy-сервис на старой версии Java (требует определенных старых системных библиотек Ubuntu).
  2. Современный микросервис на Python (требует свежих библиотек Alpine Linux).
  3. Базу данных PostgreSQL.

Ваш коллега, не знающий Docker, предлагает установить на ноутбук VirtualBox, поднять три отдельные виртуальные машины (VM) с разными ОС, настроить внутри них окружение и запустить сервисы. Вы же предлагаете использовать Docker.

Вопрос:

Какая архитектурная особенность Docker позволит вам запустить эти три совершенно разных окружения на одном ноутбуке быстрее и с меньшими затратами оперативной памяти, чем предложение коллеги? Будут ли в этом случае скачиваться три полноценных ядра операционных систем?

Подумайте над ответом, прежде чем прокручивать страницу вниз.
😎

Ответ и разбор построчно

Краткий ответ: Контейнеры будут делить одно общее ядро хост-операционной системы (через Docker Daemon), но при этом иметь изолированные файловые системы и процессы. Скачиваться полноценные ядра операционных систем не будут.

Построчный разбор логики:

  1. «...позволит запустить быстрее и с меньшими затратами оперативной памяти...»
    Разбор: Виртуальная машина (предложение коллеги) эмулирует аппаратное обеспечение. Для трех VM потребуется выделить строго фиксированный объем RAM (например, по 2 ГБ каждой) и процессорного времени, чтобы загрузить три полноценные гостевые ОС. Docker-контейнеры не эмулируют железо. Они используют ядро операционной системы вашего ноутбука. Память расходуется только на сами процессы (Java, Python, PostgreSQL), а не на обслуживание системных фоновых служб трех разных ОС.
  2. «...запустить три совершенно разных окружения (старые библиотеки Ubuntu, свежий Alpine)...»
    Разбор: Docker-образы (Images) содержат внутри себя только нужные системные утилиты и библиотеки (rootfs), но не ядро ОС. Образ с Legacy-сервисом будет содержать файловую структуру старой Ubuntu, а образ микросервиса — структуру Alpine Linux. Демон Docker изолирует их друг от друга (используя Namespaces), поэтому конфликта библиотек не возникнет, хотя физически они исполняются на одном и том же хосте.
  3. «...Будут ли скачиваться три полноценных ядра операционных систем?»
    Разбор: Нет. Docker Registry предоставит образы, которые содержат только пользовательское пространство (user space) нужных ОС: файлы, утилиты, менеджеры пакетов. Все эти контейнеры, независимо от того, "думают" они, что находятся в Ubuntu или Alpine, будут прозрачно транслировать свои системные вызовы к единому ядру вашей хост-машины. Именно поэтому запуск занимает миллисекунды — ядро уже загружено.