Podman против Docker: что выбрать?
Опубликовано: 2022-11-23Если вы знакомы с миром виртуализации и контейнеризации, вы, вероятно, сталкивались с Podman и Docker, и вам может быть интересно, чем они отличаются друг от друга.
В этом посте мы рассмотрим различия между Docker и Podman и попытаемся найти, какой из них будет для вас правильным выбором!
Докер

Docker — это технология контейнеризации, упрощающая управление зависимостями внутри проекта на всех уровнях (разработка и развертывание).
Механизм Docker, доступный в Linux, Windows и Mac OS, основан на контейнерах и их оркестровке, и именно этим контейнеризация отличается от виртуализации.
Docker состоит из двух основных строительных блоков: Docker CLI и Docker Daemon.
Демон Докера:
Это постоянный фоновый процесс, который помогает управлять образами Docker, контейнерами, сетями и томами хранилища. Docker использует свой REST API Docker Engine для взаимодействия с демоном Docker, доступ к которому осуществляется по протоколу HTTP.
Интерфейс командной строки докера:

Это клиент командной строки Docker для взаимодействия с демоном Docker. Это то, что вы используете, когда запускаете любую команду Docker.
Работа Docker основана на ядре Linux и функциях этого ядра, таких как контрольные группы и пространства имен. Эти функции разделяют процессы, чтобы они могли работать независимо, поскольку цель контейнеров — запускать несколько процессов и приложений по отдельности.
Именно это позволяет оптимизировать использование инфраструктуры без снижения уровня безопасности по сравнению с отдельными системами.
Все инструменты контейнеров, такие как Docker, поставляются с моделью развертывания на основе образов. Эта модель упрощает совместное использование приложения или набора служб в нескольких средах.
Кроме того, Docker помогает автоматизировать развертывание приложений в контейнерной среде. С помощью этих различных инструментов пользователи получают полный доступ к приложениям и могут ускорить развертывание, контролировать версии и назначать их.
Подман
Podman (POD MANager) создает, запускает и управляет контейнерами OCI и образами контейнеров. Он был разработан Red Hat и изначально предназначался для ее корпоративной Linux 8. Он используется для управления контейнерами и выступает в качестве официального преемника Docker.

Следовательно, Red Hat прекратила поддержку Docker, но заверила, что переход будет простым для пользователей, поскольку Podman основан на Docker, хотя изначально он предназначался только как инструмент отладки.
Он управляет всей экосистемой контейнеров с помощью библиотеки libpod. Поскольку Podman работает только на платформах Linux, в настоящее время разрабатываются REST API и клиенты, позволяющие системам Mac и Windows вызывать службу.
Однако, в настоящее время существует удаленный клиент на основе Varlink, который работает на платформах Mac или Windows и позволяет осуществлять удаленную связь с сервером Podman на базе Linux. Библиотека libpod поддерживает несколько методов безопасной загрузки изображений, включая доверие и проверку изображений.
Он также поддерживает модули для совместного управления группами контейнеров и несколькими форматами образов, включая форматы образов OCI и Docker.
В очень небольших и управляемых средах Podman может даже служить предшественником Kubernetes. Он устраняет разрыв между единым управлением отдельными экземплярами из первых лет ажиотажа вокруг контейнеров и современной оркестровкой с Kubernetes.
Амбициозные пользователи контейнеров уже могут наслаждаться модулями следующего уровня. Построение и эксплуатация кластера Kubernetes больше не нужны. В простейшем случае вновь разработанные модули можно тестировать и улучшать в отдельных операциях. Возможен даже последующий перенос в Kubernetes.
Команда podman generate kube
предоставляет соответствующие файлы конфигурации. Затем они служат входными данными для инструмента Kubernetes kubectl.
Текущие версии Podman могут даже создавать файлы конфигурации для systemd — удовольствие для всех, кто использует вездесущий преемник инициализации для оркестровки контейнеров.

Подман против Докера: различия
Docker быстро зарекомендовал себя как хобби для управления контейнерами. Однако у Docker есть множество преимуществ и, прежде всего, быстро растущий репертуар образов, а также недостатки и возможные риски безопасности. Более того, Docker больше не поддерживается в качестве контейнера для Kubernetes.
Тот факт, что контейнеры, в отличие от виртуальных систем, не требуют своего ядра, обычно рассматривается как одно из больших преимуществ. Однако при использовании Docker это представляет серьезную угрозу безопасности, поскольку контейнеры Docker можно запускать только с привилегиями root.
Это позволяет процессам, работающим в контейнерах, получать доступ к ядру с привилегиями root и, таким образом, атаковать хост-систему.

Первое различие становится очевидным при первом использовании. В то время как Docker требует, чтобы сначала был запущен демон Docker, контейнер Podman можно запустить непосредственно из командной строки. Таким образом, нет фонового процесса, и приложение выполняется только тогда, когда это необходимо.
С точки зрения безопасности это хорошо, потому что Podman менее уязвим для атак, если демону не нужно работать круглосуточно и без выходных с привилегиями суперпользователя. Podman не требует фонового процесса благодаря архитектуре, принципиально отличной от Docker.
В то время как Docker следует модели клиент-сервер, где клиент Docker взаимодействует с демоном Docker через API, Podman следует модели fork-exec. Каждый контейнер работает как дочерний процесс Podman.
Пространство имен пользователя создается при первом использовании, когда Podman запускается с правами обычного пользователя. В пространстве имен пользователя Podman запускается с привилегиями root и имеет права на монтирование файловых систем и создание контейнеров.
Соответственно, контейнер Podman имеет только те права, которые есть у исполняющего пользователя. Использование пространств имен пользователей означает, что каждый пользователь может создавать свои собственные контейнеры и управлять ими, но они не видны другим пользователям и суперпользователю.
Поскольку Podman работает независимо от Docker, разработчики имеют большую свободу действий и могут реагировать на пожелания сообщества. Интересные дополнения к Podman включают команду mount/unmount и интеграцию с systemd.
Хост может использовать команду mount/unmount для монтирования файловой системы контейнера, например, для доступа или изменения файлов, а затем снова их размонтировать.
Хотя мониторинг контейнеров с помощью systemd не работает из-за демона в Docker с Podman, контейнеры можно запускать, отслеживать и даже перезапускать через systemd.
Кроме того, Podman предоставляет команду podman generate systemd
, которая создает соответствующую службу systemd для соответствующего контейнера и, таким образом, освобождает пользователя от создания служб systemd, что означает, что интеграция в хост-систему доступна.
Еще одно важное различие между Podman и Docker заключается в том, что последний не меняет правила брандмауэра или текущую установку dnsmasq из-за его способности создавать внутреннюю сеть. Напротив, Docker должен перезаписать правила брандмауэра, чтобы обеспечить взаимодействие между контейнерами.
Подман | Докер | |
Архитектура | Демон | Демон меньше |
Управление услугами | Системд | Докер Двигатель |
Совместимость с брандмауэром | Перезаписывает правила брандмауэра | Соблюдает правила брандмауэра |
Платформа | Встроенная поддержка линукса | Linux, Windows и Mac |
Когда следует переходить с Docker на Podman
Если вы развертываете контейнеры в среде на основе RHEL, в этом случае у вас не так много вариантов, кроме как использовать Podman, поскольку он является родным для RHEL. Вы также можете перейти на Podman или выбрать Podman вместо Docker, если у вас небольшие развертывания с небольшим количеством контейнеров.
Однако, если вы хотите получить что-то более сложное, используйте несколько контейнеров и стек координирующих контейнеров с docker-compose/podman-compose по сети. Лучше использовать Docker, так как он намного лучше справляется с сетью.
Точно так же, если вы только начинаете входить в мир контейнеров, в этом случае Docker является лучшим вариантом, поскольку он стабилен, хорошо зарекомендовал себя с надлежащей документацией и имеет неглубокую кривую обучения по сравнению с Podman, которому все еще не хватает стабильности и не имеет четко определенной документации.
Миграция с Podman на Docker
Если вы работаете в командной строке, довольно легко переключиться с Docker Engine на Podman. В простейшем случае команда $ alias docker=podman
в большинстве случаев.
Конечно, это предполагает, что в системе установлено соответствующее программное обеспечение. В случае с Linux это тоже не проблема; готовые программные пакеты доступны для коммерческих дистрибутивов.
Windows или macOS не входят в число поддерживаемых операционных систем. Подход с псевдонимом работает, потому что многие команды Docker имеют эквивалент Podman.
Но есть и исключения, поскольку некоторые команды Docker не имеют аналога в мире Podman. Точно так же некоторые команды ведут себя в Docker иначе, чем во вселенной Podman. На данный момент это влияет только на обработку уже настроенных томов.
Переключиться немного сложнее, когда используются графические инструменты, такие как Docker Desktop. Особенно это должно коснуться тех разработчиков, которые работают с Windows или macOS.
Пользователям Docker Desktop придется привыкнуть к командной строке, то же самое относится и к Docker compose. Однако есть проект podman-compose. Программное обеспечение, написанное на Python, служит заменой Docker compose.
Заключительные слова
Замену Docker на Podman можно считать практически завершенной. Для пользователей и администраторов большинство аспектов этого изменения просты. Многие функции Docker имеют идентичные эквиваленты в Podman.
Настоящим преимуществом является отсутствие единого процесса демона и привилегий root, не говоря уже о естественном использовании групп контейнеров. Тем не менее, стоит отметить, что Docker остается основной технологией в отношении контейнеров, но это, скорее всего, изменится в долгосрочной перспективе.
Вы также можете изучить некоторые команды Docker для управления контейнерами.