Podman — один из множества инструментов для контейнеризации. Но в отличие от Docker, используется он не часто, даже в тестировании или хотя бы pet-проектах. 

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

Но Podman, будучи на 4 года младше Docker, а также, в теории, фундаментально безопаснее, подобного приёма не получил. Быть может, он его всё-таки заслуживает?
Возможно, к ужасу ваших DevOps и SRE-инженеров, вам стоит уже сейчас бежать и громить выстроенные пайплайны оркестрации кластеров Docker-контейнеров, чтобы менять всё на Podman?!

Не повторяйте в домашних условиях

Привет Хабр, с вами снова Матвей Мочалов из cdnnow!, и, как можно догадаться из лида, я бы хотел продолжить тему контейнеризации, начавшейся со статьи — Docker — не то, чем кажется

Маленький дисклеймер к лиду:

Возможно, к ужасу ваших DevOps и SRE-инженеров, вам стоит уже сейчас бежать громить выстроенные пайплайны оркестрации кластеров Docker-контейнеров?

Во избежание проклятий и угроз страшной расправы со стороны тех, кто пострадает от принявших это за команду к действию. Не надо, не делайте так. Если что-то работает — не трогай, а если трогать и очень хочется, то делай это аккуратно, постепенно и на тестовом сервере, а не сразу в продакшен. 

На этом дисклеймер закончен.

Podman, the voyage to the corner of the globe

…Is a real trip. Пожалуй, идеальное звуковое сопровождение для тематики контейнеров, так привязавшейся к морской стилистике.

Как мы уже выяснили, за множеством «магических» слов про контейнеризацию и Docker (где полёт фантазии доходит до того, что контейнеры — это как виртуальные машины и даже круче) — кроется суровая реальность в виде базового функционала UNIX-подобных систем, появившегося ещё аж в конце 70-х.

Мем с просторов гугла, на деле chroot, функционал которого лежит в основе всех контейнеров, был ещё в 7 версии UNIX, в 1979. Первый выпуск Linux состоялся только в 1991.
Мем с просторов гугла, на деле chroot, функционал которого лежит в основе всех контейнеров, был ещё в 7 версии UNIX, в 1979. Первый выпуск Linux состоялся только в 1991.

А что же у нас такое Podman? Первый коммит в репозитории проекта был сделан ещё 1 ноября 2017 года, а версия 1.0 только 16 января 2019 года (Docker к тому моменту отметил шестилетие). Наверное, в этом новом, свежем инструменте для контейнеризации какой-то другой рантайм вместо runс, возможно, написан на Rust, он сам себя деплоит на сервер, заваривает кофе, переписывает за вас .yaml конфиги и вместо вас выходит на созвоны с коллегами? 

В рантайме под капотом Podman использует runc. Потом, в 2020 добавился crun (да, очень оригинально) вместо Go, написанный Ред Хатовцами на C. Но в целом же, основа осталась на Go, никаким Rust тут и не пахнет. На созвоны его тоже, увы, не пошлёшь.

Ну и зачем же он тогда нужен?

Как и у любой внезапно появившейся разработки от крупной корпорации, в этом случае Red Hat, ответ на реальную первопричину начала проекта и вопрос {Зачем?} — всегда один:

Если кто-то думает, что я преувеличиваю, то почитайте самих же  Red Hat, у которых основная аргументация — потому что можем и хотим. Гугл V8 сделала зачем-то, значит и мы можем контейнерами командовать. Чтобы все знали, где контейнеры — там это лицо с красной федорой.

Если же переходить от первопричин к тому, чем конкретно оправдывали жизнеспособность этой затеи — это в первую очередь легковесность и простота проекта. Docker относительно Podman представляет из себя махину размером с кита не только на логотипе, но и по сути. Ведь он несёт в себе целую экосистему, необходимую не только для создания и запуска контейнеров, но и для их оркестрации — Docker Swarm, который некоторые зачем-то используют вместо Kubernetes и OpenShift.
Podman же изначально разрабатывался так, что он будет использоваться в комбинации с  k8s и OpenShift. 

Правда, по иронии, остальная индустрия окромя Red Hat про это оказалась не в курсе и по сей день продолжила использовать Docker в связке с k8s и OpenShift. Это при том, что в RHEL 8, вышедшей ещё в 2019, Podman сменил Docker, а в k8s от поддержки Docker отказались ещё в 2020.

Стоп, отказались от Docker?

Но… каким же образом тогда все продолжают его и дальше использовать с k8s и OpenShift?
Во-первых, Podman, который должен был прийти на замену Docker в деле создания и тестирования контейнеров, которые уже дальше скармливаются инструментам их оркестрирования — почти полностью совместим с Docker, начиная от синтаксиса консольных команд и заканчивая непосредственно контейнерами, которые зачастую из коробки запускаются без дополнительных изменений в них.

Во-вторых, прекращение поддержки коснулось только рантайма — модуля, который непосредственно запускает контейнеры в работу, в его роли выступает CRI-O. И нет, он не заменил рантаймы runc и crun. Опустим лингвистические злоключения термина рантайм с его применением, но runc и его собрат crun — это более низкоуровневые рантаймы, которые используются рантаймами и контейнерными движками по типу CRI-O и ему подобными.

Но отчего же всё-таки то одно, то другое называют то tool, то runtime, то engine, как на картинке ниже? Потому что. Просто, потому что.

Почему Docker победил?

Для начала, не смотря на любовь мира IT сломя голову бежать использовать всё новое, а также по чистой случайности накачивать стоимость акций новинки (точно-точно не по стратегии pump- and-dump, не привлекая внимания санитаров регулирующих органов) рынок — есть рынок. IT или не IT, а преимущество первопроходца (FMA) есть везде.
COBOL, до сих пор живущий в фундаменте мировой банковской системы ещё с начала 60х годов прошлого века — передаёт привет в напоминание об этом.

Компьютерный департамент General Electric 1961-1965 год.
Компьютерный департамент General Electric 1961-1965 год.

Да, концептуально Docker не был первым решением, но он был первым инструментом, что объединил в себе целую экосистему для контейнеризации под одной оберткой. Удобной, как для отдельно взятого разработчика, так и для интернациональной мегакорпорации зла добра, у которой один дата-центр может потреблять электричества и воды, как небольшое африканское государство. И вот, с появления Docker в 2013 до первого релиза Podman v0.3.5, прошло уже 5 лет, а к 1.0 в 2019, аж 6.

И в который раз сделаю акцент на том, что Docker — это экосистема. Экосистема сервисов построенных вокруг него, экосистема сборки и деплоя, экосистема множества образов на все случаи жизни, которые пусть в большинстве своём и будут совместимы с Podman, но зачем заморачиваться, если и так работает? Да, кодовая база у него побольше из-за того, что к проекту привинчен Docker Swarm для оркестрации контейнерами, но это проблема по большей части разработчиков Docker, а не их конечных пользователей. Которые под Windows, MacOS и FreeBSD готовы мириться даже с тем, что он запускается в виртуалке. А как мы выяснили в прошлом посте, в MacOS на ARM устройствах до недавнего времени запускался в виртуалке внутри виртуалки.

К тому же, Podman, банально не предлагает ничего радикально нового относительно Docker.. Чем-то “модным”, как тот же Rust, или выходящие из его тени Zig c Nim, он тоже не щеголяет. Разве что с FreeBSD отношения у него получше, только вот у сообщества Фряхи, со всем, что называется контейнеры, а не «jail» - отношения не очень.

Эээксперименты

Взаимоотношения SRE-инженера с контейнерами, обвалившими ему половину микросервисов.
Взаимоотношения SRE-инженера с контейнерами, обвалившими ему половину микросервисов.

Попробуем запустить для примера Docker-контейнер с помощью Podman, для этого нам потребуется совершение следующих, чрезвычайно сложных и опасных для жизни действий:

```bash
podman pull docker.io/library/hello-world
podman run --rm docker.io/library/hello-world
```

Как можно заметить на практике, синтаксис Docker и Podman практически идентичен.

И да, зачастую больше ничего не требуется, чтобы запустить Docker-образ в Podman. Просто скачать и никаких дополнительных телодвижений. И да, я знаю, что за пределами «Hello World», в крупном проекте может и возникнет множество проблем и «сюрпризов», но они неизбежны и в рамках использования Docker-контейнеров с самим же Docker.

И кажется что-то мы упускаем, ах да, безопасность! Podman позиционируется как более безопасный, потому что у него нет собственного демона для его запуска и поддержания работы. А ещё по умолчанию ему не требуются рут-права. Но как же тогда он запускается, сам себе демон, что-ли? Нет, просто, в отличие от Docker, Podman использует не демона, а ДЕМОНЮГУ, на миллион+ строк кода, имя которому Сот… SystemD.

И который имеет рут-права по умолчанию, ещё и как PID1 процесс, но зато это тоже разработка Red Hat! А поэтому, мы будем это решение гордо называть rootless!

Кроме того, отсутствие необходимости в рут-правах обусловлено использованием пространств имён. За этим мистическим шаманским словосочетанием из мира Линуксоидов кроется такая же простая концепция, как у chroot и pivot-root. Но вместо того, чтобы сделать абстракцию и внутри файловой системы хоста создать ещё одну, изолированную корневую папку, пространства имён заходят ещё дальше. Они создают также своё древо процессов, позволяют отдельно регулировать выделяемую для запускаемых из-под них процессов память, нагрузку на процессор, сеть и т.д.
В общем, чтобы запустить контейнер, Podman для начала сам запускается в контейнере пространств имён, который если говорить ещё проще, представляет из себя создание временной папки, только в рамках которой у него есть свои собственные рут-права.

Правда, фишка эта уже давно не уникальна, и в 2020 с версии 20.10 Docker также получил возможность запускаться в rootless режиме. И да, точно так же через использование пространств имён.

Из хорошего можно отметить, что Podman, на удивление, неплохо себя чувствует под FreeBSD, в то время как Docker для FreeBSD в нативном-виде скорее мёртв, чем жив. Подтверждением этому являются безуспешные попытки несчастных экспериментаторов запустить на нём что-то актуальное, а также рассылка внутри проекта Фряхи где, как оказывается, на 2023 год команды двух проектов даже не контактировали друг с другом.

Выводы

Docker, несмотря на все старания Red Hat как был, так и остаётся предпочтением большинства пользователей инструментов контейнеризации. Куда чаще можно встретить любителей поедать кактус Docker Swarm, чем тех, кто хотя бы в домашних условиях использует Podman. 
Мы, в cdnnow! — не исключение из этого правила, работа с контейнерами у нас ведётся с помощью привычного всем Docker, а дальше они уже бороздят просторы интернета под управлением k8s. Да и честно говоря, из всего моего опыта общения с коллегами, я ещё не встречал тех, кто бы использовал Podman, хотя я старался и спрашивал напрямую при первой же возможности.
Если такие есть — отзовитесь, пожалуйста, в комментариях. Дайте знак, что вы реальны. А также вопрос к тем, кто использует Docker Swarm вместо k8s и OpenShift — зачем?

Комментарии (19)


  1. vanzhiganov
    01.07.2024 13:11
    +3

    На мой взгляд проблема перехода с docker на podman как раз в отсутствии строить кластер встроенными средствами, как docker swarm.
    Так и получается, у тебя ничего (просто контейнер), либо чугунный мост в виде кубера - что как бы не очень удобно.


    1. cdnnow_writer
      01.07.2024 13:11
      +1

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


      1. Wendor
        01.07.2024 13:11

        Подскажите, а в чем кривость swarm?

        Использую его как простой и легковесный способ поднять кластер и настроить деплой с хелфчеками.


  1. nalgeon
    01.07.2024 13:11
    +13

    Если бы автор так яростно не кривлялся, статья была бы лучше.


    1. cdnnow_writer
      01.07.2024 13:11
      +4

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


  1. benjik
    01.07.2024 13:11
    +1

    Пол года пользуюсь podman + podman desktop (компания получила "письмо счастья" от Docker inc с просьбой купить подписочку всем сотрудникам с Docker Desktop и все пересели на альтернативы).

    Есть ещё некоторые шероховатости в запуске yaml'ов docker-compose через podman compose, но в целом для большинства задач подходит отлично.

    Самый жырный минус пока что - не получится запустить в podman проект docker compose, в котором контейнерам назначены gpu-ресурсы. Просто не умеет в такой формат. Так что приходится извращаться с общими сетями для запуска какой-нибудь ollama и open-webui локально.


    1. cdnnow_writer
      01.07.2024 13:11
      +3

      Вечное проклятие UNIX-подобных систем, GPU-вычисления. Надеюсь что в скором времени это допилят и прокинуть доступ к GPU будет также просто и на Docker, чтобы окончательно забыть про "письма счастья".


  1. Johan_Palych
    01.07.2024 13:11
    +1

    в то время как Docker для FreeBSD в нативном-виде скорее мёртв, чем жив

    Использование Docker с FreeBSD через bhyve(реализация, аналогичная MacOS/xhyve, но на FreeBSD/bhyve)
    https://www.bsdstore.ru/ru/articles/docker_on_freebsd.html
    Podman желательно использовать с buildah и skopeo
    Когда в конце мая заблокировали Docker Hub, я и не заметил. Настроено проксирование через mirror.gcr.io.
    https://github.com/containers/podman/blob/main/test/registries.conf


    1. cdnnow_writer
      01.07.2024 13:11

      Да, по сути решение получается и как под Виндой, и МакОСью, но я скорее о полностью нативном решение, в виртуалке не нуждавшемся.
      Впрочем, если bhyve и так удовлетворяет потребности большинства для развёртывания Docker, то не удивительно, почему нативная версия в не самом живом состояние.


  1. leahch
    01.07.2024 13:11

    Freebsd, увы, мертв уже лет 15 как.

    А podman я пользую, есть некоторые моменты неприятностей, запуск systemd внутри контейнера, но вроде бы сейчас все нормально.


  1. jsirex
    01.07.2024 13:11

    А мне очень понравилась их новая интеграция контейнеров с systemd - пишешь systemd unit который запускает контейнер: https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html


  1. blindmen
    01.07.2024 13:11

    Держу на подмане пачку домашних контейнеров(ha+обвязка,minecraft, и прочее) хорошая штука когда для k3s ресурсов маловато.


  1. greengo_go
    01.07.2024 13:11
    +2

    Ceph на podman прекрасно бегает. Не то чтоб осознанный выбор, просто на момент первого знакомства, самый актуальный вариант был именно по такому варианту запуска.


  1. amironov
    01.07.2024 13:11

    Но как же тогда он запускается, сам себе демон, что-ли? Нет, просто, в отличие от Docker, Podman использует не демона, а ДЕМОНЮГУ, на миллион+ строк кода, имя которому Сот… SystemD.

    Как это относится к скачиванию и запуску контейнеров? Для работы podman под пользователем не нужно дополнительных сервисов и прав.

    я ещё не встречал тех, кто бы использовал Podman

    Для разработки использую и на линукс, и на виндовс, потому как проще поставить.


  1. DieSlogan
    01.07.2024 13:11

    Использую на домашнем Docker, потому что у него есть в комплекте тот же Scout и есть docker compose. Не знаю аналогов Docker compose в Podman. Вот чтобы compose, но без swarm


  1. man4j
    01.07.2024 13:11

    swarm отличная и удобная штука для небольших проектов. Особенно в условиях, когда кубер начал сдуваться в России с огромной скоростью. Иностранных компаний которые его пушали нет, спецы разбежались, короче кубер остался в прошлом на мой взгляд.


  1. Resursator
    01.07.2024 13:11

    По мелочи пробовал запускать всякое в подмане, столкнулся с тем, что не работает проброс портов средствами самого подмана. Приходилось использовать виндовую утилиту netsh для этого, пока я не столкнулся с тем, что она не может пробрасывать udp траффик.. в итоге пришлось городить велосипед с использованием опенсорсной утилиты sudpipe. В общем, в итоге всё работало довольно некрасиво (но работало, да), так в итоге докером и пользуюсь.


  1. Tony-Sol
    01.07.2024 13:11

    Недавно как раз на macos переехал с Docker Desktop (который homebrew cask) на docker (который formula) в связке с podman и limactl, и Podman Desktop в качестве «красивого окошка» (к моему сожалению Podman Companion как будто перестали развивать).

    В целом полет нормальный, потерял разве что в каких-то свистелках, типа cli-plugins (и то их можно доставить дополнительно (можно добавить их в homebrew-core и станет сильно проще)), но и не сказать чтобы прям выиграл.

    Могу сказать что стало удобнее делить окружения и управлять выделенными ресурсами - например minikibe/kind запускаю только в podman или например авторизацию в приватные registry храню только в lima машине.

    В целом, как по мне, это было в довольно развлекательно-образовательно, потраченного времени не жалею.


  1. Tony-Sol
    01.07.2024 13:11

    Недавно как раз на macos переехал с Docker Desktop (который homebrew cask) на docker (который formula) в связке с podman и limactl, и Podman Desktop в качестве «красивого окошка» (к моему сожалению Podman Companion как будто перестали развивать).

    В целом полет нормальный, потерял разве что в каких-то свистелках, типа cli-plugins (и то их можно доставить дополнительно (можно добавить их в homebrew-core и станет сильно проще)), но и не сказать чтобы прям выиграл.

    Могу сказать что стало удобнее делить окружения и управлять выделенными ресурсами - например minikibe/kind запускаю только в podman или например авторизацию в приватные registry храню только в lima машине.

    В целом, как по мне, это было в довольно развлекательно-образовательно, потраченного времени не жалею.