Обзор
Изоляция процессов – важный аспект операционной системы Linux.
В частности, она позволяет нескольким процессам выполняться на одной машине без риска вмешательства в их работу.
Кроме того, механизм изоляции процессов в операционной системе Linux обеспечивает эти преимущества без типичных затрат, которые несут виртуальные машины.
Команда chroot на Linux и программное обеспечение Docker широко известны своей способностью изолировать процессы в рамках одной операционной системы.
В этом руководстве мы узнаем разницу между командой chroot и программным обеспечением Docker.
Команда chroot
Команда chroot – это команда Linux, которая изменяет корневой каталог запущенного процесса.
Она существует с 1979 года, с первых дней существования Unix-подобных операционных систем.
Основная цель команды – изолировать файловую систему между различными процессами.
Изолированная среда, создаваемая командой chroot, обычно называется jail.
🐧 Как разрешить выполнение приложений с sudo в определенном каталоге на Linux
Предполагая, что каталог /opt/fake-root был инициализирован как правильный jail, мы можем запустить chroot на новом процессе и установить /opt/fake-root в качестве его корневого каталога:
Приведенная выше команда запускает новый процесс, в котором выполняется двоичный файл /bin/bash.
Примечательно, что корневым каталогом нового процесса теперь является /opt/fake-root.
Следовательно, его активность в файловой системе ограничивается каталогом /opt/fake-root.
Docker
Docker – это технология контейнеризации, которая обеспечивает виртуализацию на уровне операционной системы (ОС).
Многие компоненты в программном комплексе Docker работают вместе, чтобы обеспечить механизм контейнеризации.
Во-первых, компоненты контейнера Docker в программном обеспечении Docker обеспечивают изолированную среду для запущенного процесса, подобно jail в chroot.
Это позволяет запускать на одном хосте множество различных рабочих нагрузок, которые могут иметь конфликтующие зависимости.
Кроме того, образ Docker служит шаблоном, содержащим инструкции по созданию контейнера Docker.
Обычно мы создаем образ Docker на основе Dockerfile.
Dockerfile содержит пошаговые инструкции по созданию контейнера.
🐳 Краткое введение в Dockerfile
Вот пример Dockerfile, который создает образ Docker:
Dockerfile расширяется за счет базового образа alpine с последним тегом.
Директива CMD задает команду, которая будет выполняться при запуске контейнера.
В нашем случае контейнер запустится и выведет в консоль сообщение «Hello world».
Разница между chroot и Docker
На первый взгляд, команда chroot и программное обеспечение Docker обеспечивают изоляцию между процессами на одном экземпляре ОС.
Однако между командой chroot и программным обеспечением Docker больше различий, чем сходств.
В последующих разделах мы подчеркнем разницу между командой chroot и контейнером Docker, сравнив несколько аспектов.
Область применения
Команда chroot – это отдельный бинарный файл, который делает одну вещь: изменяет видимый корневой каталог процесса.
Команда chroot не предлагает команд управления, таких как получение списка закрытых процессов.
С другой стороны, программный пакет Docker представляет собой комплексную платформу для контейнеризации.
Помимо изоляции процессов и виртуализации, команда docker в программном пакете Docker упрощает создание и использование контейнера.
Например, docker ps – это команда, с помощью которой можно вывести список запущенных в данный момент контейнеров:
Кроме того, мы можем запустить контейнер Docker с помощью команды docker run:
Чтобы очистить контейнер, мы можем выполнить docker rm для остановленных контейнеров:
В целом, команда chroot – это относительно простая программа по сравнению с программным обеспечением Docker.
Переносимая и многократно используемая копия контейнера
Концепция образа Docker имеет решающее значение для широкого распространения контейнерной технологии.
После создания образ Docker становится переносимым артефактом, которым можно легко поделиться с другими.
Образ Docker может воспроизводить ту же копию контейнера, что и создатель образа Docker.
Это значительно снижает трудности при распространении приложений из-за различий в окружении.
Многие популярные программы, включая PostgreSQL, Redis и Nginx, распространяются в формате образов Docker.
Кроме того, многократное использование и расширяемость контейнеров Docker также значительно снижает кривую обучения этой технологии.
Начинающий пользователь может поиграть с существующим образом Docker, чтобы понять, как он работает.
Затем можно постепенно наращивать существующий образ.
Без образа Docker кривая обучения была бы намного круче, поскольку нам пришлось бы начинать создавать контейнер с нуля.
С другой стороны, среда chroot не имеет такого же уровня многократного использования и возможностей распространения.
Когда мы создаем изолированную среду с помощью команды chroot, она, как правило, предназначена для конкретного случая использования.
Кроме того, отсутствие стандартизации среды chroot затрудняет ее распространение и совместное использование среди более широкой аудитории.
Использование пространств имен Linux
Еще одно огромное различие между chroot и контейнером Docker – это их механизм изоляции.
Команда chroot изолирует файловую систему, «изменяя компонент в процессе разрешения имени пути и не делая ничего другого», как говорится на ее man-странице.
В отличие от нее, Docker использует механизм пространств имен Linux для обеспечения изоляции различных компонентов на уровне ОС.
Среди таких пространств имен – идентификатор процесса (PID), сетевой стек и идентификаторы пользователей.
Это означает, что разные контейнеры на одном хосте получают изолированное представление PID, сетевого стека и UID.
Важно отметить, что мы можем ограничить вычислительные ресурсы для контейнеров с помощью пространств имен групп управления (cgroups).
С другой стороны, chroot не имеет возможности ограничить использование вычислительных ресурсов.
Например, мы можем установить верхнюю границу на потребление CPU и RAM с помощью опций -cpus и -memory, соответственно:
Приведенная выше команда ограничивает процессор одним ядром, а оперативную память – 256 МБ.
Процесс внутри контейнера не может использовать больше, чем установленный нами лимит.
Заключение
В этом руководстве мы кратко познакомились с командой chroot и программным пакетом Docker.
Затем мы подчеркнули разницу между этими двумя командами в различных аспектах. Например, программный пакет Docker охватывает гораздо большую область, чем команда chroot.
Кроме того, мы узнали, что Docker упрощает повторное использование контейнеров с помощью конструкции образа Docker.
И наконец, мы узнали, что под капотом у обеих систем используются совершенно разные механизмы для достижения изоляции.
см. также:
- 🖧 Как часто вам приходится перезагружать свой Linux-сервер?
- 🐳 Как защитить Docker в производственной среде?
- 👨⚕️️ Как настроить systemd для автоматического запуска службы после сбоя в Linux👨⚕️
- 🇨🇴 Как ограничить некоторые ресурсы пользовательской памяти в CentOS / RHEL с помощью cgroup
- 🐧 Использование команд nice и renice для изменения приоритета процессов в Linux