Выбор среды выполнения контейнеров#

Runc и crun - среды выполнения контейнеров. Они могут использоваться взаимозаменяемо, поскольку осущетвляют спецификацию OCI. Среда crun имеет несколько преимуществ перед runc, поскольку она быстрее и требует меньше памяти. Именно она рекомендуется к использованию.

Среда выполнения контейнеров runc#

Runc - это облегченная переносимая реализация контейнерной среды выполнения Open Container Initiative (OCI). Она поддерживает пространства имен Linux, динамическую миграцию и содержит переносимые профили производительности.

Данная среда обеспечивает полную поддержку функций безопасности Linux, таких как, cgroups, seccomp и прочих. Также позволяет создавать и запускать образы и работать с OCI-совместимыми образами.

Среда выполнения контейнеров crun#

Crun - это быстрая, занимающая небольшой объем памяти, среда выполнения. Она поддерживает работу с OCI и написана на языке C. Двоичный файл crun примерно в 50 раз меньше и до двух раз быстрее чем runc. При использовании crun можно установить минимальное количество процессов при запуске контейнера. Среда выполнения crun также поддерживает OCI hooks.

Дополнительные возможности crun:

  • Совместное использование файлов группой контейнеров без полномочий администратора;

  • Управление stdout и stderr OCI hooks;

  • Работа старых версий systemd с cgroup v2;

  • Библиотека языка С, используемая другими программами;

  • Расширяемость;

  • Переносимость.

Запуск контейнеров с помощью runc и crun#

В runc или crun контейнеры настраиваются с помощью комплектов (bundles). Bundle контейнера — это каталог, включающий файл спецификации с именем config.json и корневую файловую систему, в которую входит содержимое контейнера.

Примечание

Во всех примерах кода \<runtime> может принимать значение либо crun, либо runc.

  1. Извлеките образ контейнера registry.example.ru/ubi9/ubi:

    podman pull registry.example.ru/ubi9/ubi
    
  2. Экспортируйте его в архив slo.tar:

    podman export $(podman create registry.example.ru/ubi9/ubi) > slo.tar
    
  3. Создайте каталог bundle/rootfs:

    mkdir -p bundle/rootfs4. 
    
  4. Извлеките архив slo.tar в каталог bundle/rootfs:

    tar -C bundle/rootfs -xf rhel.tar4
    
  5. Создайте новый файл спецификации с именем config.json для bundle:

    <runtime> spec -b bundle
    

    Опция -b указывает каталог bundle. Значение по умолчанию - текущий каталог.

  6. Опционально: Измените настройки:

    vi bundle/config.json
    
  7. Создайте экземпляр контейнера с именем myubi для bundle:

    <runtime> create -b bundle/ myubi7
    
  8. Запустите контейнер myubi:

    <runtime> start myubi
    

Примечание

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

<runtime> start <container_name>

Проверка#

Выведите список контейнеров <runtime>:

<runtime> list

Пример вывода команды:

ID               PID         STATUS      BUNDLE            CREATED                          OWNER
myubi            0           stopped     /root/bundle      2021-09-14T09:52:26.659714605Z   root

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

Для изменения среды выполнения контейнера используйте команду podman run с опцией --runtime.

  1. Извлеките образ контейнера registry.example.ru/ubi9/ubi:

    podman pull registry.example.ru/ubi9/ubi
    
  2. Измените среду выполнения, используя опцию --runtime:

    podman run --name=myubi -dt --runtime=<runtime> ubi9 bashe4654eb4df12ac031f1d0f2657dc4ae6ff8eb0085bf114623b66cc664072e69b
    
  3. Опционально: Выведите список всех образов:

    podman ps -a
    

    Пример вывода команды:

    CONTAINER ID  IMAGE                                   COMMAND  CREATED        STATUS            PORTS   NAMES
    e4654eb4df12  registry.example.com/ubi9:latest        bash     4 seconds ago  Up 4 seconds ago          myubi
    

Проверка#

Убедитесь, что для среды выполнения OCI установлено значение <runtime> в контейнере myubi:

podman inspect myubi --format "{{.OCIRuntime}}"
<runtime>

Постоянное изменение среды выполнения контейнера#

Можно установить среду выполнения контейнера и ее параметры в файле конфигурации /etc/containers/containers.conf от имени пользователя с административными полномочиями или в файле конфигурации $HOME/.config/containers/containers.conf от имени пользователя без административных полномочий.

  1. Измените среду выполнения в файле /etc/containers/containers.conf:

    vim /etc/containers/containers.conf
    

    Пример вывода команды:

    [engine]
    runtime = "<runtime>"
    
  2. Запустите контейнер с именем myubi:

    podman run --name=myubi -dt ubi9 bash
    

    Пример вывода команды:

    Resolved "ubi9" as an alias (/etc/containers/registries.conf.d/001-rhel-shortnames.conf)
    Trying to pull registry.example.ru/ubi9:latest...
    ...
    Storing signatures
    

Проверка#

Убедитесь, что в контейнере myubi для среды выполнения OCI установлено значение <runtime>:

podman inspect myubi --format "{{.OCIRuntime}}"

Пример вывода значения:

<runtime>