Контейнеры Linux (LXC) - это технология виртуализации на уровне операционной системы, которая позволяет создавать и запускать несколько операционных систем (ОС) Linux одновременно на одном компьютере Linux (хосте LXC). LXC предоставляет набор инструментов для управления вашим контейнером, а также шаблоны для создания виртуальной среды наиболее распространенных ОС Linux.
Docker - это технология контейнеризации, которая фокусируется на запуске одного приложения в изолированной среде.
### Использование Хост-Машины
Контейнера LXC и Docker взаимодействуют с ядром хост-машины.
Контейнеры пытаются предложить альтернативу виртуальным машинам. В результате преобладающим определением является то, которое наиболее подходит для разграничения виртуальных машин (VM) и виртуальных сред (VE - virtual environment, контейнеры).
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/docker13.png)
В Linux память разделена между kernel space, зарезервированным для ядра операционной системы, отвечающего за управление процессором, памятью и устройствами, и user space.
Контейнеры LXC используют функции ядра Linux для создания изолированных процессов и файловых систем.
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/docker14.png)
Давайте взглянем на пару примеров. В Linux вы можете использовать команду ps для перечисления запущенных процессов. Если вы запускаете что-то в LXC и запускаете ps с хоста, вы увидите список запущенных процессов, включая ваш контейнер (да, контейнеры - это в первую очередь процессы с точки зрения хоста). Однако, если вы запустите ту же команду ps из контейнера LXC, вы увидите только процессы, запущенные внутри контейнера. LXC использует пространства имен ядра для достижения этой цели.
Аналогично, на вашем хост-компьютере Linux есть /bin, стандартный корневой каталог для исполняемых файлов. В пользовательском пространстве контейнера у есть еще один /bin. Пользовательское пространство контейнера находится внутри контейнера и может быть отправлено на другой хост. Эта изоляция пользовательского пространства является причиной того, что вы можете установить контейнер Alpine Linux на компьютере с Ubuntu, поскольку программы в контейнерах Linux изолированы от остальной системы. LXC использует chroot для этого.
Docker использовал LXC до версии 1.0 для создания изоляции от хост-системы. Позже Docker разработал собственную замену LXC под названием libcontainer. Вот почему Docker и LXC имеют так много общего.
С точки зрения использования хоста Docker имеет два отличия от LXC:
1. Предлагает абстракцию для специфичных для машины настроек, таких как networking, storage, logging и т.д. Они являются частью Docker Engine и делают контейнеры Docker более переносимыми, поскольку они меньше зависят от базовой физической машины.
2. Docker предназначены для запуска одного процесса для каждого контейнера.
![Структура данных буферного кэша](https://whoisdeveloper.ru/static/img/docker15.png)
### Простота
Контейнеры Linux (LXC) более гибкие, так как немного ближе к виртуальным машинам, так как можно настраивать и устанавливать что угодно с помощью LXC так же, как и с виртуальными машинами. Такие функции ядра, как chroot, cgroups и пространства имен, могут быть использованы для создания виртуальной среды LXC. Эти механизмы ядра помогают контролировать использование ресурсов и видимость процессов в остальной части системы.
Docker изначальн был ответвлением из проекта LXC. Однако разница заключается в дизайне: контейнеры Docker были разработаны специально для приложений микросервисов. Это сильно отличает их от виртуальных машин. Docker прост в использовании разработчиками; абстракция сетей, хранилища и ведения журнала позволяет разработчикам практически не нуждаться (или вообще не нуждаться) в предварительных знаниях Linux.
Простота, которую Docker предлагает разработчикам, - вот что сделало его таким популярным. Обе платформы просты в использовании, но ориентированы на разные аудитории.
### Скорость
LXC может похвастаться быстрым временем загрузки по сравнению с виртуальной машиной – ему не нужно упаковывать всю операционную систему и c полной настройкой ОС, а также управлять сетевыми интерфейсами, виртуальными процессорами и жестким диском.
Контейнеры Docker также имеют малый вес, что значительно повышает их скорость. Docker добавляет дополнительный уровень для абстракрции хранилища и сети, но в большинстве случаев вы не увидите существенных проблем с производительностью из-за этого. Создание и запуск контейнера Docker занимает считанные секунды. Поскольку Docker может работать на существующей операционной системе, которая уже инициализирована, вы можете загрузить контейнер из его образа почти мгновенно.
Docker по умолчанию поддерживает многоуровневые контейнеры. Это означает, что результирующий контейнер представляет собой последовательную комбинацию изменений, внесенных в файловую систему, аналогично истории Git. Слои могут загружаться параллельно, что может дать вам преимущество в скорости при одновременном запуске множества контейнерных приложений на нескольких компьютерах.
Один момент в пользу Docker, заключается в создании образов Docker без дистрибутивов. С distroless у вас есть абсолютный минимум — только ваше приложение, скомпилированный код и необходимая привязка. Образы LXC предназначены для репликации дистрибутивов Linux, таких как Ubuntu, Debian или Alpine. Тот факт, что Docker нацелен на упаковку отдельных приложений, может дать вам преимущество при подготовке сотен контейнеров.
Разница в производительности между LXC и Docker практически незначительна. Оба обеспечивают быстрое время загрузки. Загрузка образа LXC может быть медленнее, чем образы Docker без дистрибутивов, но не все образы Docker являются без дистрибутивов, что дает Docker возможности для улучшения по сравнению с LXC.
### Безопасность
LXC снабжен конфигурациями безопасности, такими как групповые политики и профиль AppArmor по умолчанию, для защиты хоста от случайного неправильного использования привилегий внутри контейнера.
Docker отделяет операционную систему от запущенных на ней служб для обеспечения безопасных рабочих нагрузок, но тот факт, что Docker запускается от имени root, может увеличить подверженность вредоносным программам. Это связано с тем, что демон Docker, который управляет объектами Docker, такими как сети, контейнеры, образы и тома, и выполняет запросы к API Docker, также запускается как root на хост—компьютере. Разработчики обычно проводят аудит установок Docker для поиска потенциальных уязвимостей.
LXC ставит безопасность на первый план. Это предоставляет вам функции безопасности, включая поддержку возможностей Linux, которые помогут вам сохранить контроль над контейнерной средой и размещенными приложениями. Подход Docker к хранению различных компонентов приложения в отдельных контейнерах является плюсом. Но у этой стратегии также есть свои недостатки в области безопасности, если вы размещаете сложные приложения, которые могут потребовать внимания опытного инженера по безопасности.
### Простота использования
Для начала работы с LXC потребуется установить последние версии LXC, совместимые с дистрибутивом Linux. Это дает команды LXC, шаблоны и а python3 доступными для создания контейнеров. Кроме того, LXC запускает стандартный модуль операционной системы для каждого контейнера, что означает, что ваши приложения размещаются в стандартной ОС Linux. Таким образом, переход на контейнеры LXC с серверов с открытым исходным кодом или виртуальных машин более управляемый, чем переход на контейнеры Docker.
С другой стороны, Docker упрощает работу с контейнерами и запуск программ. С помощью Docker вы можете упаковывать контейнеры и отправлять их для использования на других машинах. Вы можете использовать команду docker build для создания образов из файла Dockerfile. Для работы с Docker нужно - это операционная система с поддержкой контейнеров.
### Масштабируемость
LXC менее масштабируем чем Docker. Его образы не такие легкие, как у Docker. Однако образы LXC более легкие, чем образы физических машин или виртуальных машин. Это делает его идеальным для подготовки по требованию и автоматического масштабирования. Кроме того, тот факт, что вы можете использовать LXC для реализации облегченных виртуальных машин без гипервизора, делает контейнеры Linux масштабируемым вариантом.
С помощью Docker вы можете разделить функциональность приложений на отдельные контейнеры. Вы можете, например, запустить свою базу данных Oracle в одном контейнере во время работы вашего сервера Cassandra и ASP.NET приложение в других отдельных контейнерах. Затем вы можете связать эти три контейнера вместе и создать приложение, позволяющее независимо масштабировать компоненты.
### Набор инструментов
Инструментарий LXC предоставлять несколько команд, позволяя создавать, запускать и удалять LXC контейнеры. Этот инструментарий также позволяет повторно использовать сценарии автоматизации, которые вы, возможно, использовали на виртуальной машине или "голом железе", запущенном в VirtualBox или других виртуальных средах. Благодаря такой функции легко переносить приложения с традиционного сервера Linux в Linux контейнеры.
Интерфейс командной строки Docker (CLI) является основным инструментом Docker. Он дает контроль над вашими контейнерами, позволяя вам видеть список образов и управлять ими. Вы также можете использовать реестр Docker для доступа и распространения образов для часто используемых приложений.
Как LXC, так и Docker предоставляют необходимые функциональные возможности для улучшения работы разработчиков. Однако у каждого инструмента есть особенность, которая выделяет его из толпы. LXC отлично подходит для переноса приложений с традиционного сервера Linux в Linux контейнер. Но если вы хотите отдать предпочтение опыту разработчиков, выберите Docker.
### Linux Containers
Теперь давайте подробнее рассмотрим некоторые особенности LXC.
Хотя LXC не является полноценной виртуальной машиной, она обеспечивает виртуализацию на уровне OS с помощью виртуальной окружения, которое содержит собственное пользовательское пространство и процессы. LXC зависит от функционала ядра Linux для изоляции контейнеров. CPU хоста разделяет выделение памяти на пространства имен(namespaces) для управления использованием ОЗУ и ЦП.
Виртуальное окружение LXC позволяет создавать контейнеры, содержащие дистрибутив Linux и ваши приложения. В этом случае все контейнеры совместно используют базовое ядро и аппаратные ресурсы.
Некоторые преимущества LXC:
- LXC отлично справляется с запуском нескольких дистрибутивов Linux на одном сервере.
- LXC дает вам большой контроль над функциями, на которых он основан (namespace, cgroup, chroot и т.д.).
- LXC позволяет легко управлять виртуальной средой, одновременно повышая переносимость приложений и упрощая их распространение внутри контейнеров.
LXC подходит для:
- Проверки обновления и изменений приложений. Можно создать клон за считанные секунды, развернуть его, проверить изменениями и удалить исходный экземпляр.
- Быстрого запуска новых экземпляров и запуска нескольких версий веб-стеков и приложений. Вы можете, например, поэкспериментировать с конкретными версиями Python или Ruby для конкретного приложения перед обновлением.
### Docker
Docker был разработан для переносимости приложений. Они хотели убедиться, что вся команда разработчиков работала в той же тестовой среде и конфигурациях, что и в производственной среде.
Docker использует Dockerfile, чтобы сделать создание контейнеров простым и удобным в обслуживании. Каждая инструкция в файле Dockerfile создает слой с версиями изменений, внесенных в образ контейнера.
Лучшие черты Docker:
- Docker включает в себя уровень абстракции для хранения данных(storage), создания сетей и ведения журнала, который упрощает настройку и масштабирование контейнеров Docker.
- Docker предлагает кроссплатформенную поддержку. Несмотря на то, что изначально он разрабатывался как технология только для Linux, контейнеры Docker теперь могут работать на Windows и Mac.
- Образы контейнеров Docker состоят из слоев. Это обеспечивает более высокую производительность (кэширование и параллельная загрузка) и систему управления версиями.
Недостатки:
- Контейнеры Docker не предназначены для замены Linux машин. Приложения с отслеживанием состояния не получать профита от Docker.
- Docker не предоставляет низкоуровневого управления доступного в LXC.