Основные концепции Docker

Что такое технология контейнеризации

Контейнеры используют общее ядро хоста, что делает их легковесными, изолированными и эффективными — в отличие от виртуальных машин, которым требуется полноценная операционная система. На следующей схеме показана базовая архитектура контейнеров Docker:

  • Верхний слой состоит из нескольких контейнеров (App A-F), каждый контейнер независимо запускает приложение.
  • Средний слой — это Docker, который отвечает за управление этими контейнерами.
  • Нижний слой — это операционная система хоста (Host OS) и инфраструктура, обеспечивающие аппаратную и системную поддержку контейнеров.

1. Болевые точки традиционного развертывания приложений

При традиционном развертывании приложений мы часто сталкиваемся со следующими проблемами:

  • Несогласованность сред: приложения нормально работают в среде разработки, но сталкиваются с проблемами в среде тестирования или эксплуатации
  • Сложность управления зависимостями: разным приложениям требуются разные версии сред выполнения, библиотечных файлов и т. д.
  • Низкая утилизация ресурсов: традиционные виртуальные машины требуют полноценной операционной системы, потребляя большое количество ресурсов.
  • Сложное развёртывание: Требует ручной настройки среды и установки зависимостей, что чревато ошибками.

2. Решения с использованием технологии контейнеризации

Технология контейнеризации решает эти проблемы следующими способами:

  • Стандартизация среды: Упакуйте приложение вместе с его зависимостями, чтобы обеспечить согласованную работу в любой среде
  • Легковесность: Контейнеры совместно используют ядро операционной системы хоста, что делает их легче виртуальных машин.
  • Быстрое развёртывание: Контейнеры могут запускаться за секунды, значительно повышая эффективность развёртывания.
  • Переносимость: Соберите один раз — запускайте где угодно

3. Основные концепции контейнеризации

Контейнеризация следует философии «неизменяемой инфраструктуры»:

  • Приложения и среды упаковываются в неизменяемые образы.
  • Используйте один и тот же образ для каждого развёртывания
  • Конфигурация внедряется через переменные окружения или файлы конфигурации.
  • Исправляйте проблемы, пересобирая образ, а не изменяя работающие контейнеры

Основные концепции Docker

1. Образ

определение: Образ — это шаблон, доступный только для чтения, который содержит всё необходимое для запуска приложения: код, среду выполнения, файлы библиотек, переменные среды и файлы конфигурации.

Особенности:

  • Слоистое хранилище: Образ состоит из нескольких слоёв, каждый из которых представляет изменение.
  • Только для чтения: Сам образ доступен только для чтения, и его нельзя изменять напрямую.
  • Повторно используемый: Один и тот же образ можно использовать для создания нескольких контейнеров
  • Управление версиями: Управление версиями выполняется с помощью тегов.

Аналогия: Образ похож на установщик или шаблон; он определяет всё необходимое для запуска приложения, но не может запускаться напрямую сам по себе.

2. Контейнер

определение: Контейнер — это запущенный экземпляр образа, легковесная переносимая среда выполнения.

Особенности:

  • Изоляция: Каждый контейнер имеет собственную файловую систему, сеть и пространство процессов.
  • Временные: Контейнеры можно создавать, запускать, останавливать и удалять.
  • Записываемый слой: Контейнер добавляет записываемый слой поверх образа.
  • На уровне процессов: Обычно внутри контейнера выполняется один основной процесс

Аналогия: Если образ — это класс, то контейнер — это экземпляр объекта. Один образ может создать несколько контейнеров, так же как один класс может создать несколько объектов.

3. Репозиторий

определение: Репозиторий — это место для хранения и распространения образов, и он может содержать несколько версий образа.

Категория:

  • Публичный репозиторий: Например, Docker Hub, который может использовать любой желающий.
  • Приватный репозиторий: Создаётся внутри предприятия для хранения приватных образов.
  • Официальный репозиторий: Репозитории образов, поддерживаемые поставщиком программного обеспечения

Реестр против репозитория:

  • Реестр: Серверы реестров, например Docker Hub
  • Репозиторий: Конкретные репозитории образов, например nginx, mysql.

Различия между Docker и виртуальными машинами

1. Сравнение архитектуры

Особенности Виртуальной машины Контейнер Docker
Уровень изоляции Аппаратная виртуализация Виртуализация на уровне операционной системы
Операционная система Каждая виртуальная машина требует полной ОС Использует общее ядро хост-ОС
Использование ресурсов Тяжеловесный, потребляет больше ресурсов Легковесный, низкое потребление ресурсов
Время запуска Измеряется минутами Измеряется секундами
Накладные расходы на производительность Относительно большие Производительность, близкая к нативной
Размер образа Уровень ГБ Уровень МБ

2. Архитектура контейнеров и виртуальных машин

3. Сравнение сценариев использования

Сценарии применения VM:

  • Требуется полностью изолированная среда
  • Запуск приложений разных операционных систем
  • Требуется изоляция безопасности на аппаратном уровне

Сценарии, подходящие для контейнеров Docker:

  • Архитектура микросервисов
  • Конвейер CI/CD
  • Быстрое развертывание и масштабирование приложений
  • Стандартизация среды разработки

Преимущества Docker и сценарии применения.

Основные преимущества

1. Согласованность среды

  • Решение проблем: проблема «работает на моей машине»
  • Подход к реализации: приложение и среда упаковываются вместе
  • Ценность: снижает количество ошибок, связанных со средой, и проблем при развертывании

2. Легковесность и эффективность

  • Использование ресурсов: потребляет меньше ресурсов, чем виртуальные машины
  • Скорость запуска: время запуска — секунды
  • Плотность: Одна машина может запускать больше экземпляров приложений

3. Переносимость

  • Кроссплатформенность: Поддержка Linux, Windows и macOS
  • Облачная нативность: Миграция между различными облачными платформами
  • Гибридная среда: Разрабатывайте локально, развёртывайте в облаке

4. Контроль версий и откат

  • Версия образа: Каждой версии соответствует свой образ
  • Быстрый откат: Быстро откатиться к предыдущей версии при возникновении проблем
  • A/B-тестирование: Одновременный запуск разных версий для сравнения

5. Масштабируемость

  • Горизонтальное масштабирование: Быстро создавать больше экземпляров контейнеров
  • Эластичное масштабирование: Автоматически регулирует количество контейнеров в зависимости от нагрузки
  • Микросервисы: разделение сервисов и независимое развертывание

Типичные сценарии применения

1. Архитектура микросервисов

  • Декомпозиция сервисов: каждый микросервис независимо контейнеризуется
  • Независимое развертывание: сервисы можно независимо обновлять и масштабировать
  • Свобода технологического стека: разные сервисы могут использовать разные технологии

2. CI/CD конвейер

  • Среда сборки: стандартизированная среда сборки
  • Изоляция тестов: каждый тест выполняется в независимом контейнере
  • Согласованность развертывания: один и тот же образ развертывается в разных средах

3. Стандартизация среды разработки

  • Быстрая настройка: новые участники быстро получают среду разработки
  • Синхронизация версий: команда использует одну и ту же среду разработки
  • Управление зависимостями: избегает конфликтов локальной среды

4. Модернизация приложений

  • Устаревшая система: контейнеризация традиционных приложений
  • Миграция в облако: помогает переносить приложения на облачные платформы
  • Гибридное облако: переносимость между различными облачными средами

Компоненты архитектуры Docker

Общая схема архитектуры

Клиент Docker

Особенности:

  • Основные способы взаимодействия пользователей с Docker.
  • Получает пользовательские команды и отправляет их в Docker Daemon.
  • Может взаимодействовать с удалённым Docker Daemon.

Основные команды:

  • docker run- Запустить контейнер
  • docker build- Собрать образ
  • docker pull- Загрузить образ
  • docker ps- Просмотреть состояние контейнера

Демон Docker

Особенности:

  • Основной служебный процесс Docker
  • Управляет образами, контейнерами, сетями и томами хранилища
  • Прослушивает и обрабатывает запросы к Docker API.

Основные обязанности:

  • Управление образами (сборка, хранение, распространение)
  • Управление жизненным циклом контейнеров
  • Управление сетями
  • Управление томами данных
  • Взаимодействие с Registry

Docker Engine

Composition:

  • Docker Client + Docker Daemon + REST API
  • Это основной компонент Docker

Рабочий процесс:

  1. Клиент отправляет команды демону
  2. Демон разбирает и выполняет команды
  3. Взаимодействует с Registry (при необходимости).
  4. Управляет локальными образами и контейнерами
  5. Возвращает результаты клиенту

Docker Registry

Функция:

  • Хранит и распространяет образы Docker
  • Обеспечивает управление версиями образов
  • Поддерживает публичные и частные реестры

Возможности Docker Hub:

  • Официальный публичный реестр
  • Содержит большое количество предварительно собранных образов
  • Поддерживает функцию автоматической сборки
  • Бесплатные и платные сервисы

История развития Docker

Ключевые вехи

  • 2013: выпуск Docker с открытым исходным кодом
  • 2014: Выпущен Docker 1.0, доступный для промышленного использования.
  • 2016: Выпущен Docker Swarm со встроенными возможностями оркестрации.
  • 2017: Docker разделён на CE (Community Edition) и EE (Enterprise Edition).
  • 2019: Выпущен Docker Desktop, улучшающий опыт разработчика.

Развитие экосистемы

  • Оркестрация контейнеров: Kubernetes становится стандартом де-факто.
  • Среда выполнения контейнеров: containerd, CRI-O и другие альтернативы
  • Формат образов: Стандартная спецификация OCI
  • Инструменты безопасности: Инструменты сканирования и мониторинга безопасности контейнеров
Другие расширения