Принципы работы с контейнерами#

Контейнеризация — метод упаковки и распространения приложений с открытым исходным кодом. Контейнеры изолируют приложения и используют различные методы развертывания, основанные на образах. 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.

Команда

Обозначение

attach

Присоединение к работающему контейнеру

commit

Создание нового образа из измененного контейнера

container checkpoint

Создание контрольной точки одного или нескольких запущенных контейнеров

container restore

Восстановление одного или нескольких контейнеров из контрольной точки

build

Создание образа, используя инструкции Containerfile

create

Создание контейнера без его запуска

diff

Проверка изменений в файловых системах контейнера

exec

Запуск процесса в работающем контейнере

export

Экспорт содержимого файловой системы контейнера в виде tar-архива

help, h

Вывод списка команд или справки по одной команде

healthcheck

Запуск проверки работоспособности контейнера

history

Отображение истории указанного образа

images

Вывод списка образов в локальном хранилище

import

Импорт архивного файла для создания образа файловой системы

info

Отображение системной информации

inspect

Отображение конфигурации контейнера или образа

kill

Отправка сигнала завершения процесса одному или нескольким запущенным контейнерам

kube generate

Генерация YAML-файлов Kubernetes на основе контейнеров, pods или томов

kube play

Создание контейнеров, pods и томов на основе YAML-файлов Kubernetes

load

Загрузка образа из архива

login

Аутентификация для входа в реестр контейнеров

logout

Выход из реестра контейнеров

logs

Извлечение log-файлов из контейнера

mount

Монтирование корневой файловой системы рабочего контейнера

pause

Приостановка всех процессов в одном или нескольких контейнерах

ps

Вывод списка контейнеров

port

Сопоставление портов для контейнера

pull

Извлечение образа из реестра

push

Размещение образа в конкретном месте назначения

restart

Перезапуск одного или нескольких контейнеров

rm

Удаление одного или нескольких контейнеров с хоста. Добавьте к команде ключ -f, если контейнер запущен

rmi

Удаление одного или нескольких образов из локального хранилища

run

Запуск команды в новом контейнере

save

Сохранение образа в архив

search

Поиск образ в реестре

start

Запуск одного или нескольких контейнеров

stats

Процентное отображение использования процессора, памяти, сетевого ввода-вывода, блочного ввода-вывода и PID для одного или нескольких контейнеров

stop

Остановка одного или нескольких контейнеров

tag

Добавление дополнительного имени к локальному образу

top

Отображение запущенных процессов контейнера

unmount

Размонтирование корневой файловой системы рабочего контейнера

unpause

Отмена приостановки процессов в одном или нескольких контейнерах

version

Отображение информации о версии podman

wait

Блок на одном или нескольких контейнерах

Процессорная архитектура для контейнеризации#

SberLinux OS поддерживает контейнеризацию на процессорах с архитектурой x86-64.

Установка Podman#

Для того чтобы установить пакет podman, используйте команду:

dnf install podman

Настройка rootless-контейнеров#

Запуск контейнеров от имени администратора при помощи Podman предоставляет полный доступ ко всем функциям системы.

С опцией rootless containers можно использовать контейнеры от имени пользователя без административных полномочий. Это позволяет безопасно запускать большинство функций под обычными учетными записями.

Предоставленный сценарий поможет настроить Podman для работы с пользователями без административных полномочий. В нем также описаны некоторые ограничения настройки, поскольку обычные учетные записи не имеют полного доступа ко всем функциям ОС, которые могут потребоваться для запуска их контейнеров.

Предварительные условия#

Перед выполнением сценария установите пакет podman. Подробнее смотрите в разделе «Установка Podman».

Сценарий#

Для настройки контейнеров от имени пользователя без административных полномочий выполните следующие действия:

  1. Создайте новую учетную запись пользователя:

    useradd -c "First User" firstuser
    

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

    passwd firstuser
    

    После чего:

    • Команда useradd автоматически устанавливает диапазон доступных идентификаторов пользователей и групп в файлах /etc/subuid и /etc/subgid;

    • Если вручную изменяется /etc/subuid или /etc/subgid, запустите команду podman system migrate, чтобы применить изменения.

  2. Подключитесь к пользователю:

    ssh firstuser@server.example.ru
    

Примечание

Не используйте команды su или su -, так как они не задают правильные переменные окружения.

  1. Извлеките образ контейнера <container image>:

    podman pull <container image>
    
  2. Запустите контейнер с именем 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