Путь приложения от разработки к продуктивному использованию не всегда прост и прямолинеен. Помимо обеспечения работоспособности в различных средах, существуют и другие задачи, такие как определение зависимостей, обновление компонентов и масштабирование.
Контейнеризация с помощью Docker помогает решить большую часть этих проблем. Приложение делится на функциональные компоненты, каждый из которых имеет индивидуальный пакет со своими зависимостями. Эти пакеты затем могут быть развёрнуты на архитектуре, отличающейся от стандартной.
Такой подход упрощает обновление отдельных компонентов и масштабирование всего приложения.
Изоляция и контейнеризация — не новые термины в вычислительных системах. Технология Linux Containers (LXC), появившаяся в ядре Linux ещё в 2008 году, легла в основу дальнейшей разработки контейнеризации. Она позволяет организовать изолированное использование ресурсов и пространств имён. Изначально Docker использовал LXC практически в неизменном виде.
Преимущества контейнеризации с Docker
Абстрагирование приложения от хоста
Основная идея контейнера — полная стандартизация. Он соединяется с хостом через определённый интерфейс, и приложение внутри него не зависит от архитектуры или ресурсов хоста. Для хоста контейнер — это «чёрный ящик», и его содержимое не имеет значения.
Масштабирование
Продолжением преимущества абстрагирования является возможность простого и линейного масштабирования. Например, на одной машине можно запустить несколько контейнеров, и их можно использовать как на тестовом сервере, так и в продуктивной среде.
Управление версиями и зависимостями
Благодаря контейнерам разработчик привязывает все компоненты и зависимости к приложению, что позволяет работать с ним как с единым объектом. Для запуска приложения внутри контейнера на хосте не требуется установка дополнительных компонентов или зависимостей, достаточно иметь возможность запускать контейнеры Docker.
Изолированная среда
Изоляция в контейнерах не достигает того же уровня, что и в виртуализации, но, тем не менее, обеспечивает легковесную среду выполнения и относится к изоляции на уровне процессов. При этом контейнер работает на том же ядре, что и хост, что позволяет ему очень быстро запускаться. Запуск сотен контейнеров на рабочей машине не будет проблемой.
Использование слоёв
Легковесность контейнеров объясняется их многослойной структурой. Когда несколько контейнеров используют один и тот же слой, они могут пользоваться им без дублирования, что минимизирует использование дискового пространства.
Компоновка
Существует возможность описывать конкретные действия для создания нового образа. Таким образом, настройки среды можно писать как код и сохранять в системе контроля версий.
Недостатки контейнеров Docker
Тонкая настройка
При больших масштабах и нагрузке требуется очень точная и качественная настройка систем.
Обратная совместимость
Docker быстро развивается, и одним из минусов такого развития может быть ограниченная обратная совместимость в некоторых областях.
Удаление
Процесс удаления контейнеров Docker может занимать много времени и требует немалого количества операций ввода-вывода.
Производительность
Дополнительные надстройки на системе в любом случае приводят к увеличению нагрузки и расходу ресурсов.
Архитектура
Контейнеризация является надстройкой над ОС, что усложняет реализацию некоторых задач.
Поддержка
Для поддержки и сопровождения контейнеров Docker необходимы не только навыки системного администратора, но и хорошие знания самого Docker.
Вывод
Контейнеризация с Docker имеет свои достоинства и недостатки. Решение об использовании контейнеров должно приниматься исходя из конкретной задачи. Для некоторых задач без Docker не обойтись, а для других он может быть попросту лишним.
Рассмотрим преимущества и недостатки использования контейнеров на конкретном примере создания простого веб-сервера.
Установка веб-сервера без контейнеров | ||
1 | Развёртывание Vesta CSP и установка пользователей и доменных имён 1 сервер | 2ч |
2 | Развёртывание Vesta CSP и установка пользователей и доменных имён 2 сервер | 2ч. |
3 | Организация отказоустойчивости серверов | 3ч. |
4 | Загрузка файлов сайта клиентом | 2ч |
5 | Замена IP-адресов на NS-серверах | 1ч. |
Итого | 8ч | |
Установка веб-сервера с использованием контейнеров | ||
1 | Установка Proxmox | 1ч. |
2 | Установка LXC-контейнеров, маршрутизация их сети и автобекапов контейнеров | 3ч. |
3 | Развёртывание Vesta CSP, настройка доменов и установка пользователей | 2ч |
4 | Аналогичная настройка резервного сервера | 5ч. |
5 | Создание кластера нод Proxmox и настройка автомаиции | 1ч |
6 | Установка, настройка прокси-сервера, балансировки нагрузки и отказоустойчивости | 3ч. |
Итого | 15ч. |
Как вы уже заметили, время на реализацию с использованием контейнеров значительно больше.
Давайте разберём плюсы и минусы Docker для веб-сервера:
Плюсы | Минусы |
Балансировка нагрузки пользователей (второй сервер не простаивает) | Усложнение инфраструктуры из-за маршрутизации трафика |
Отказоустойчивость в случае падения одной из нод | Зависимость от прокси-сервера (в идеале их тоже делают 2) |
Лёгкое восстановление полного бэкапа за счёт снапшотов | Снижение производительности на 2-4% за счёт контейнеризации |
Хранилище повышенной стойкости ZFS | Необходима поддержка виртуализации KVM на стороне хостера |
Возможность содержать в контейнерах тестовые/dev и прод-серверы | Стоимость решения и поддержки |
Подключение неограниченного кол-ва таких нод | Время реализации |
Повышение безопасности инфраструктуры |
Как и говорилось выше, в зависимости от поставленной задачи, минусы Docker могут нивелировать все плюсы от использования контейнерной виртуализации. Можно сделать вывод, что для сайтов вполне достаточно простой архитектуры из двух серверов. Если же планируется значительный рост разработки, а также огромный приток посетителей за короткое время, в таком случае стоит рассматривать инфраструктуру с использованием Docker.
Наша команда профессиональных DevOps-администраторов имеет большой опыт во внедрении и поддержке контейнеризации, в том числе и Docker. Обращайтесь: [email protected]
А нужно ли это поделие сисадмину? изучаю около 2 дня, скоро голова лопнет от кол-ва информации.
Конечно нужно, если планируете работать с большими проектами.