Принципы работы с контейнерами#
Контейнеризация — метод упаковки и распространения приложений с открытым исходным кодом. Контейнеры изолируют приложения и используют различные методы развертывания, основанные на образах. Platform V SberLinux OS Server использует контейнеры Linux, сочетая их с технологиями cgroups (для управления ресурсами), namespaces (пространства имен для изоляции процессов), Secure multi-tenancy и SELinux (для обеспечения безопасности). Это снижает вероятность взлома системы безопасности и обеспечивает среду для создания и использования контейнеров корпоративного уровня.
SberLinux OS предоставляет инструменты командной строки для создания, управления и запуска контейнеров в pods. Также позволяет создавать отдельные контейнеры, образы этих контейнеров и управлять ими.
К ним относятся:
podman - управляет pods и образами контейнеров;
runc - предоставляет функций запуска и сборки контейнеров Podman;
crun - обеспечивает гибкость, контроль и безопасность для rootless-контейнеров (не требующих привилегий администратора) благодаря дополнительной настраиваемой среде выполнения.
Поскольку эти инструменты совместимы с Open Container Initiative (OCI), их можно использовать для управления контейнерами Linux, которые создаются и управляются другими OCI-совместимыми контейнерными движками.
Характеристики Podman#
Podman по умолчанию использует внутренний каталог хранилища /var/lib/containers.
Для программного взаимодействия с Podman можно использовать RESTful API Podman версии 2.0, он работает в среде rootful и среде rootless.
Общие команды Podman#
Чтобы управлять образами, контейнерами и ресурсами контейнера с помощью утилиты podman, используются перечисленные ниже основные команды. Для отображения полного списка команд Podman, используйте podman -h.
Команда |
Обозначение |
|---|---|
|
Присоединение к работающему контейнеру |
|
Создание нового образа из измененного контейнера |
|
Создание контрольной точки одного или нескольких запущенных контейнеров |
|
Восстановление одного или нескольких контейнеров из контрольной точки |
|
Создание образа, используя инструкции |
|
Создание контейнера без его запуска |
|
Проверка изменений в файловых системах контейнера |
|
Запуск процесса в работающем контейнере |
|
Экспорт содержимого файловой системы контейнера в виде tar-архива |
|
Вывод списка команд или справки по одной команде |
|
Запуск проверки работоспособности контейнера |
|
Отображение истории указанного образа |
|
Вывод списка образов в локальном хранилище |
|
Импорт архивного файла для создания образа файловой системы |
|
Отображение системной информации |
|
Отображение конфигурации контейнера или образа |
|
Отправка сигнала завершения процесса одному или нескольким запущенным контейнерам |
|
Генерация YAML-файлов Kubernetes на основе контейнеров, pods или томов |
|
Создание контейнеров, pods и томов на основе YAML-файлов Kubernetes |
|
Загрузка образа из архива |
|
Аутентификация для входа в реестр контейнеров |
|
Выход из реестра контейнеров |
|
Извлечение log-файлов из контейнера |
|
Монтирование корневой файловой системы рабочего контейнера |
|
Приостановка всех процессов в одном или нескольких контейнерах |
|
Вывод списка контейнеров |
|
Сопоставление портов для контейнера |
|
Извлечение образа из реестра |
|
Размещение образа в конкретном месте назначения |
|
Перезапуск одного или нескольких контейнеров |
|
Удаление одного или нескольких контейнеров с хоста. Добавьте к команде ключ |
|
Удаление одного или нескольких образов из локального хранилища |
|
Запуск команды в новом контейнере |
|
Сохранение образа в архив |
|
Поиск образ в реестре |
|
Запуск одного или нескольких контейнеров |
|
Процентное отображение использования процессора, памяти, сетевого ввода-вывода, блочного ввода-вывода и PID для одного или нескольких контейнеров |
|
Остановка одного или нескольких контейнеров |
|
Добавление дополнительного имени к локальному образу |
|
Отображение запущенных процессов контейнера |
|
Размонтирование корневой файловой системы рабочего контейнера |
|
Отмена приостановки процессов в одном или нескольких контейнерах |
|
Отображение информации о версии podman |
|
Блок на одном или нескольких контейнерах |
Процессорная архитектура для контейнеризации#
SberLinux OS поддерживает контейнеризацию на процессорах с архитектурой x86-64.
Установка Podman#
Для того чтобы установить пакет podman, используйте команду:
dnf install podman
Настройка rootless-контейнеров#
Запуск контейнеров от имени администратора при помощи Podman предоставляет полный доступ ко всем функциям системы.
С опцией rootless containers можно использовать контейнеры от имени пользователя без административных полномочий. Это позволяет безопасно запускать большинство функций под обычными учетными записями.
Предоставленный сценарий поможет настроить Podman для работы с пользователями без административных полномочий. В нем также описаны некоторые ограничения настройки, поскольку обычные учетные записи не имеют полного доступа ко всем функциям ОС, которые могут потребоваться для запуска их контейнеров.
Предварительные условия#
Перед выполнением сценария установите пакет podman. Подробнее смотрите в разделе «Установка Podman».
Сценарий#
Для настройки контейнеров от имени пользователя без административных полномочий выполните следующие действия:
Создайте новую учетную запись пользователя:
useradd -c "First User" firstuserЧтобы установить пароль, воспользуйтесь командой:
passwd firstuserПосле чего:
Команда
useraddавтоматически устанавливает диапазон доступных идентификаторов пользователей и групп в файлах/etc/subuidи/etc/subgid;Если вручную изменяется
/etc/subuidили/etc/subgid, запустите командуpodman system migrate, чтобы применить изменения.
Подключитесь к пользователю:
ssh firstuser@server.example.ru
Примечание
Не используйте команды su или su -, так как они не задают правильные переменные окружения.
Извлеките образ контейнера
<container image>:podman pull <container image>Запустите контейнер с именем
myubiи отобразите версию ОС:podman run --rm --name=myubi <container image> \ cat /etc/os-releaseПример вывода команды:
NAME="Platform V SberLinux OS Server" VERSION="9.0.0"
Особые рекомендации для rootless-контейнеров#
При запуске контейнеров от имени пользователя без привилегий администратора необходимо учитывать следующие факторы:
Путь к хранилищу контейнеров хоста отличается для администраторов
(/var/lib/containers/storage)и пользователей($HOME/.local/share/containers/storage);Пользователям предоставляется специальное разрешение на запуск от имени идентификаторов, входящих в UID и GID хост-системы. Но при этом у них нет прав администратора для операционной системы на хосте;
При изменении
/etc/subuidили/etc/subgidвручную необходимо запустить командуpodman system migrateдля сохранения настроек;Если необходимо настроить среду rootless, создайте файлы конфигурации в своем домашнем каталоге
($HOME/.config/containers). Файлы конфигурации включаютstorage.conf(для настройки хранилища) иcontainers.conf(для различных настроек контейнера). Также можете создать файлregistries.confдля идентификации реестров контейнеров, которые доступны при использовании Podman для извлечения, поиска или запуска образов;Некоторые системные функции нельзя изменить без прав администратора. Например, нельзя изменить системные часы, установив параметр
SYS_TIMEвнутри контейнера и запустив службу сетевого времени (ntpd).Чтобы изменить эти функции, необходимо запустить контейнер от имени администратора, например:
~~~bash podman run -d --cap-add SYS_TIME ntpd ~~~Примечание
Выполнение команды в такой форме позволит
ntpdизменить время для всей системы, а не только внутри контейнера.Rootless-контейнер не может получить доступ к порту с номером менее 1024. Внутри namespace контейнер без полномочий администратора может, например, запустить службу, предоставляющую порт 80 службы httpd, но это недоступно за пределами namespace:
podman run -d httpdПри этом контейнеру требуются полномочия администратора, чтобы предоставить доступ к этому порту хост-системе:
podman run -d -p 80:80 httpdАдминистратор может разрешить пользователям предоставлять доступ к службам на портах с номерами ниже 1024, но это небезопасно.
Чтобы разрешить пользователям подключаться до порта 80, выполните следующую команду:
echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_start