Apptainer для разработчиков Docker: подробное руководство

Контейнерная платформа с открытым исходным кодом Apptainer (ранее Singularity) предназначена для безопасных высокопроизводительных вычислительных сред (HPC). В отличие от Docker, который доминирует на настольных компьютерах и в облачных сервисах, Apptainer отлично подходит для многопользовательских систем Linux, таких как кластеры HPC, где требуются контейнеры пользовательского пространства без привилегий root. Он обеспечивает аналогичную функциональность Docker, включая совместимость с большинством образов Docker, одновременно удовлетворяя потребности в безопасности и переносимости в HPC.

Это руководство поможет разработчикам, разбирающимся в Docker, изучить Apptainer в Linux, включая установку, базовое использование и варианты использования.

Начало работы с Apptainer в Ubuntu

Установить Apptainer в Linux можно через менеджеры пакетов или из исходного кода. Apptainer требует современного ядра Linux (с пользовательскими пространствами имен, разрешенными для непривилегированного использования) и не работает на Windows/Mac без виртуальной машины Linux.

Для многих пользователей Debian/Ubuntu самый простой путь — использовать официальный архив личных пакетов (PPA):

sudo apt update && sudo apt install -y Software-properties-common sudo add-apt-repository -y ppa:apptainer/ppa sudo apt update && sudo apt install -y apptainer # используйте apptainer-suid для режима SUID 123 sudo apt update && sudo apt install -y Software-properties-commonsudo add-apt-repository -y ppa:apptainer/ppasudo apt update && sudo apt install -y apptainer # используйте apptainer-suid для режима SUID

Эти команды по умолчанию устанавливают Apptainer в непривилегированном режиме (без двоичных файлов setuid). Если вам нужны функции, требующие SUID (помощники root setuid для старых ядер или определенные функции монтирования), вместо этого установите пакет apptainer-suid. В непривилегированном режиме Apptainer использует пользовательские пространства имен, чтобы вы могли запускать контейнеры полностью как обычный пользователь.

После установки убедитесь, что все работает, запустив простой контейнер, например:

apptainer exec docker://alpine cat /etc/alpine-release 1 apptainer exec docker://alpine cat /etc/alpine-release

Эта команда извлекает крошечный образ Alpine Linux и печатает файл его версии, подтверждая, что Apptainer настроен правильно.

Вы заметили, что Apptainer преобразует образ Docker в файл SIF в текущем каталоге. Формат изображения Singularity (SIF) — это стандартный формат изображения контейнера, используемый Apptainer и Singularity. SIF инкапсулирует всю контейнерную среду — ОС, программное обеспечение, метаданные и конфигурацию — в один неизменяемый файл.

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

Файл .sif обычно создается на основе файла определения (.def), в котором описаны этапы сборки, установленные пакеты и настройка среды. После создания образ .sif действует как надежный, проверяемый образ контейнера производственного качества, переносимый и обеспечивающий воспроизводимое выполнение, поскольку его содержимое никогда не меняется после создания. Apptainer может использовать этот файл для создания экземпляра контейнера, выполнения определенных команд, запуска приложений или предоставления интерактивной оболочки.

Базовый файл Apptainer .def показан ниже. Он создает определение образа из существующего образа Docker.

Bootstrap: docker От: ubuntu:22.04 %post apt-get update apt-get install -y python3 %runscript echo «Привет от Apptainer!» %help Этот контейнер устанавливает Python 3 в Ubuntu 22.04 и печатает сообщение при запуске. 123456789101112131415 Bootstrap: dockerОт: ubuntu:22.04 %post apt-get update apt-get install -y python3 %runscript echo «Привет от Apptainer!» %help Этот контейнер устанавливает Python 3 в Ubuntu 22.04 и печатает сообщение при запуске.

Вы можете создать образ с помощью следующей команды:

sudo apptainer build myimage.sif myfile.def 1 sudo apptainer build myimage.sif myfile.def

Apptainer внутренне поддерживает кеш для промежуточных файлов и слоев, обычно в ~/.apptainer/cache в вашей системе.

Запуск базовых контейнеров

Интерфейс командной строки Apptainer аналогичен интерфейсу Docker, но в нем нет демона. Вы запускаете контейнеры напрямую с помощью команды apptainer. Общие подкоманды включают run, exec и Shell, которые аналогичны командам docker run, docker exec и docker run —IT для интерактивной оболочки.

Используйте apptainer run для выполнения сценария запуска изображения по умолчанию. Например, после получения образа Apptainer (файла .sif) вы можете просто запустить его:

apptainer pull docker://alpineapptainer run alpine_latest.sif 12 apptainer pull docker://alpineapptainer run alpine_latest.sif

Если в изображении есть определенный сценарий запуска, его выполняет apptainer run. В противном случае он возвращается к интерактивной оболочке. Вы также можете запускать изображения напрямую через URI, не сохраняя их.

Apptainer запускает Docker://ghcr.io/apptainer/lolcow 1 Apptainer запускает Docker://ghcr.io/apptainer/lolcow

Вы можете использовать apptainer exec для запуска определенной команды внутри контейнера. Например:

apptainer exec alpine_latest.sif echo «Привет из контейнера» 1 apptainer exec alpine_latest.sif echo «Привет из контейнера»

Это похоже на docker exec, но его можно запустить даже с файлом изображения или URI Docker Hub. Если у вас еще нет изображения, Apptainer получит его и выполнит команду за один шаг.

Используйте оболочку аптейнера, чтобы получить оболочку внутри контейнера, что полезно для исследования или отладки. Например:

оболочка apptainer alpine_latest.sif 12 оболочка apptainer alpine_latest.sif

Как Apptainer выполняет контейнеры

Apptainer использует принципиально иной подход к работе контейнера по сравнению с Docker. Фонового демона нет, а запуск контейнера — это прямой вызов, который создает среду контейнера в процессе. Когда вы запускаете контейнер приложения, он выполняет ряд шагов: монтирует образ SIF (который представляет собой файловую систему SquashFS) в минимальном пространстве имен пользователя Linux, настраивает необходимые пространства имен (mount, PID и т. д., если необходимо), а затем использует системный вызов exec() для запуска указанного процесса внутри контекста контейнера. В результате контейнеризованное приложение запускается как дочерний процесс вашей команды Apptainer, без каких-либо дополнительных прокладок или оболочек. Дизайн Apptainer обеспечивает минимальные накладные расходы: как только процесс контейнера запускается, текущий процесс менеджера отсутствует — ваше приложение работает непосредственно на ядре хоста с примененной изоляцией контейнера.

Важно отметить, что контейнеры Apptainer по умолчанию запускаются с тем же идентификатором пользователя, что и на хосте. Если вы запустите контейнер как непривилегированный пользователь, вы также будете этим пользователем внутри контейнера (UID/GID сохранится). Нет сети docker0 или NAT по умолчанию: по умолчанию Apptainer использует общий сетевой стек хоста (поэтому сеть не изолируется, если вы не используете явные параметры). Процесс контейнера может видеть и использовать ресурсы хоста, такие как графические процессоры, сетевые интерфейсы и файлы (в зависимости от того, что смонтировано), как разрешено пользователю. Эта модель соответствует случаям использования HPC, когда вы не хотите, чтобы у контейнера было больше привилегий, чем у вызывающего, и вам нужен эффективный доступ к оборудованию, например, к высокоскоростным межсоединениям.

Чтобы настроить контейнер без рута, Apptainer можно установить в режиме setuid или в полностью непривилегированном режиме. В режиме setuid небольшая часть кода Apptainer (apptainer-suid) выполняется с привилегиями root для выполнения операций монтирования, а затем теряет привилегии. В непривилегированном режиме он использует функции пространства имен пользователя (доступные в ядрах ≥ 4.18) для имитации root внутри нового пространства имен для настройки. В любом случае в результате вам не понадобится служба демона с root-доступом. Контейнер запускается в рамках пользовательского сеанса, что делает Apptainer по своей сути не требующим демонов и интегрированным в ядро. С точки зрения разработчика это означает, что вы можете вызывать команды Apptainer, как и любой другой инструмент CLI, и контейнеры завершают работу после завершения вашей команды, не оставляя затянувшихся процессов контейнера.

Когда использовать Apptainer вместо Docker

Apptainer предпочтительнее Docker в нескольких сценариях, особенно в высокопроизводительных вычислениях (HPC) и безопасных многопользовательских средах, по следующим причинам:

Безрутовое исполнение и безопасность

Apptainer позволяет пользователям запускать контейнеры, не требуя привилегий root (администратора), что делает его более безопасным в мультитенантных системах и общих кластерах HPC, избегая рисков повышения привилегий, характерных для модели демона Docker.

Высокопроизводительные вычисления и научные вычисления

Apptainer был специально разработан для научных вычислений и высокопроизводительных вычислений, интегрируясь с менеджерами ресурсов и планировщиками заданий, тогда как Docker в первую очередь разрабатывался для рабочих процессов развертывания микросервисов и корпоративных приложений.

Однофайловые образы контейнеров

Apptainer использует формат изображения Singularity (SIF), который упаковывает весь контейнер в один неизменяемый файл. Это упрощает распространение, совместное использование и архивирование по сравнению с Docker, который структурирует контейнеры как стопки слоев изображений в файлах tar.

Сохранение собственной личности пользователя

Идентификация пользователя (UID/GID) вне контейнера сохраняется внутри контейнера, обеспечивая прозрачную файловую систему и обработку разрешений, что имеет решающее значение в университетских кластерах или средах совместных исследований.

Совместимость с существующей инфраструктурой HPC

Apptainer безупречно работает с существующими инструментами HPC и хранилищем без необходимости внесения изменений в инфраструктуру. Его контейнеры изначально интегрируются с параллельными файловыми системами и крупномасштабными планировщиками заданий и не требуют запуска фонового демона с правами root, в отличие от Docker.

Эти преимущества делают Apptainer предпочтительным выбором для безопасных, крупномасштабных и ориентированных на исследования вычислительных сред, где приоритетными являются работа без root-доступа и плавная интеграция.

ТЕНДЕНЦИОННЫЕ ИСТОРИИ YOUTUBE.COM/THENEWSTACK Технологии развиваются быстро, не пропустите ни одной серии. Подпишитесь на наш канал YouTube, чтобы смотреть все наши подкасты, интервью, демонстрации и многое другое. ПОДПИСАТЬСЯ Группа, созданная в Sketch. Джанакирам MSV — главный аналитик Janakiram & Associates и внештатный преподаватель Международного института информационных технологий. Он также является сертифицированным облачным разработчиком Google, сертифицированным архитектором решений Amazon, сертифицированным разработчиком Amazon,… Читать далее от Джанакирама MSV

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *