Docker — это платформа контейнеризации с открытым исходным кодом, с помощью которой можно автоматически создавать, управлять и доставлять приложения. Платформа позволяет ускорить процедуры тестирования и выкладки приложений, запускать на одной машине несколько контейнеров.
Следует отметить, что открытый исходный код становится не совсем открытым. Компания Docker приостановила продажу подписок на программное обеспечение Docker для пользователей из России и Беларуси.
Контейнеризация в целом и Docker в частности позволяют разработчикам не задумываться над тем, в какой инфраструктурной среде будет работать их приложение. Не нужно разрабатывать различные версии приложения для разных операционных систем. Нет необходимости решать проблемы с зависимостями при тестировании. Достаточно упаковать в контейнер приложение и описать необходимые зависимости и процессы, после этого контейнер с приложением можно запустить на любой системе: Linux, Windows или MacOS.
Платформа Docker отделила приложения от инфраструктуры. Это сильно поспособствовало развитию облачной инфраструктуры, отличия при запуске приложений в локальной среде исчезли. Стало возможным легко перемещать приложения между облачной и локальной инфраструктурой.
Контейнеризация и виртуализация
На самом деле контейнеризация — это одна из разновидностей виртуализации. Однако, с развитием популярности контейнеризации стало принято отделять мух от котлет.
Классическая виртуализация представляет собой отдельные компьютеры со своим виртуальным железом и операционной системой, которые работают на одном физическом аппаратном гипервизоре. А контейнеризация предполагает, что виртуальная среда запускается из ядра ОС, при этом не предусматривается виртуализация оборудования.
Считается что контейнеры эффективнее виртуальных машин. Размер контейнера меньше размера виртуальной машины с тем же функционалом. На одном аппаратном сервере можно запустить больше контейнеров, чем виртуалок. Повышается производительность, снижается потребление ресурсов.
Контейнеры
- Объём контейнера мал, измеряется в мегабайтах. Контейнеры легковесны, поскольку в них упаковывается только то, что необходимо для выполнения кода. Быстрая загрузка, экономия места.
- Один контейнер — один процесс, это правило хорошего тона. Не стоит запихивать в контейнер весь функционал проекта, не нужно делать очередной монолит. Если есть возможность сделать два контейнера, лучше сделать два. При этом появляется возможность использовать те же контейнеры в других задачах, как функции. Отключение или перезапуск одного контейнера происходит быстро, позволяет на лету проводить обновления, не мешают работе всего проекта.
- Особенность контейнеров — их короткий жизненный цикл. Контейнер можно остановить, обновить, перезапустить, удалить при необходимости. При этом данные внутри контейнера пропадут. Не храните данные внутри контейнеров! Этот подход называется Stateless.
- Микросервисная архитектура. Использование контейнеров позволяет отказаться от классических монолитных систем. Ускоряется разработка, тестирование, доставка, развёртывание.
- Контейнеризация обеспечивает надёжную изоляцию процессов, без этого были бы большие вопросы к безопасности систем. Приложение внутри контейнера не имеет доступ к основной ОС и к другим контейнерам в той же системе.
- Контейнеры позволяют развёртывать приложения на разных хостах, операционных системах, в облаке.
- Из-за меньшего потребления ресурсов контейнеры лучше подходят для облачных инфраструктур.
Основные компоненты Docker
- Dockerfile — текстовый файл с последовательно расположенными инструкциями для создания образа Docker. Одна строка — одна команда, как слои.
- Daemon — демон на хосте, который отвечает за создание, запуск и удаление контейнеров. Любое взаимодействие с контейнером проходит через Daemon.
- Image — статичный файл-образ, из которого можно неограниченное количество раз развернуть контейнер, или несколько контейнеров.
- Client — утилита командной строки в Docker для управления демоном.
- Container — приложение, которое развернули из образа и запустили.
- Registry — служба в Docker, выполняющая функции репозитория (хранилища).
- Docker Hub — популярный открытый репозиторий образов контейнеров, который поддерживается компанией Docker. Интеграция c GitHub и Bitbucket.
- Docker Desktop — приложение для Windows и macOS, позволяющее локально собирать, выполнять и тестировать контейнеры.
- Docker volumes — тома для постоянного хранения информации вне контейнера. Есть возможность подключения удаленных хранилищ.
Преимущества Docker
В Интернете можно найти ряд преимуществ от использования Docker, с некоторыми я, как специалист по виртуализации, не могу согласиться.
- Гибкость и адаптивность. Согласен, Docker контейнеры можно легко запускать как локально, так и в облаке. Лёгкая переносимость и простота использования.
- Меньше ошибок при переносе между средами. Согласен, перенос между средами не вызывает затруднения и не требует доработок. Пропадает такая вещь как: "Не знаю что там у вас на проде, у меня локально работает!"
- Скорость развёртывания. Согласен, образы мелкие, быстро качаются, быстро развёртываются.
- Универсальность. Согласен, пиши на том языке программирования и в том окружении, которое тебе больше нравится.
- Комьюнити. Не согласен. Да, есть огромная библиотека контейнеров с открытым исходным кодом, можно скачать любой образ для своей задачи. Или обратиться к комьюнити за помощью. Но это палка о двух концах. Закроют стране вход в репозиторий, и всё. Встроит разработчик в популярный пакет троян-вымогатель, и всё. Заблокируют тебя в репозитории, и всё, потерял все свои наработки.
- Непрерывность работы. Согласен, CI-CD — наше всё.
- Упрощение администрирования. Не согласен. Шило на мыло.
- Повышение уровня безопасности. Не согласен, с чего бы? Вы хотели сказать понижение?
- Экономическая эффективность. Да.
- Современный подход. Да, модно-стильно-молодёжно. И денег больше платят, пойду в девопсеры.