Сравнение Podman и Docker

Обычно Podman и Docker делают одно и то же. Однако между двумя контейнерными движками — Podman и Docker — есть некоторые различия.

Вот основные различия между Podman и Docker:

Архитектура: Podman имеет архитектуру без демонов.

Демон Docker — это фоновый процесс, отвечающий за управление всеми контейнерами на одном хосте. Он может обрабатывать все образы Docker, контейнеры, сети, хранилища и т. д. Демон Docker использует REST API для прослушивания запросов и выполнения соответствующих операций.

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

С другой стороны, Podman не нуждается в демоне. Он имеет (бездемонную архитектуру), которая помогает пользователям запускать контейнеры (без root). Другими словами, Podman не требует root-прав для управления контейнерами.

Корневые права

Поскольку Docker нужен демон для управления своими контейнерами, для запуска процессов ему потребуются права root.

Поскольку у Podman нет демона, у него есть (бесдемонная архитектура). Он не требует root-прав для своих контейнеров.

Rootless Execution

Сначала, когда вышел Docker, вы не могли запустить Docker без прав root. Однако режим без root-прав был представлен в Docker версии 19.03 и вышел из экспериментального режима в Docker Engine v20.10.

Однако Docker без root-прав не выходит сразу из коробки. Некоторые конфигурации и сторонние пакеты следует сначала установить на хост перед установкой Docker.

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

Ограничения Docker без root-доступа

Безрутовый режим в Docker не идеален, и при запуске контейнеров без root-прав возникают некоторые проблемы:

  • Невозможность запуска контейнеров на привилегированных портах, то есть на всех портах ниже 1024. В противном случае они не смогут запуститься.
  • Поддерживаются только следующие драйверы устройств хранения данных:
  • overlay2 (только при работе с ядром 5.11 или новее или ядром со вкусом Ubuntu).
  • fuse-overlayfs (только если работает с ядром 4.18 или новее и установлен Fuse-overlayfs).
  • btrfs (только если работает с ядром 4.18 или новее или ~/.local/share/docker монтируется с user_subvol_rm_allowed опцией монтирования).
  • Vfs.
  • Cgroup поддерживается только при работе с cgroup v2 и systemd.
  • Следующие функции не поддерживаются:
  • AppArmor
  • Checkpoint
  • Overlay network
  • Exposing SCTP ports
  • Чтобы использовать ping команду.
  • IPAddress отображается docker inspect и находится внутри сетевого пространства имен RootlessKit. Это означает, что IP-адрес недоступен с хоста без nsenter входа в сетевое пространство имен.
  • Хост-сеть ( docker run --net=host ) также находится в пространстве имен внутри RootlessKit.
  • NFS монтируется, поскольку «корневой каталог данных» докера не поддерживается. Это ограничение не относится только к безрутовому режиму.

Безопасность

Имеет ли Podman более высокий уровень безопасности, чем Docker? Ранее мы рассмотрели, как Podman может работать без root-прав, поскольку он имеет (бесдемонную архитектуру), а Docker не может работать без root-прав, поскольку для запуска контейнеров и управления ими требуется демон, сравнивая Podman и Docker.

Но почему это важно? Почему так важно не иметь демона и не иметь возможности запускать контейнеры без привилегий root? Ответ в том, что мы не даем root-права приложениям, которым не доверяем, но доверяем нашим контейнерам и приложениям.

Но это не так. Допустим, злоумышленник нашел способ получить доступ к одному из ваших контейнеров! Поскольку Docker может работать только с правами root, любой злоумышленник (т. е. злоумышленник) может предпринять неправильные действия на вашем сервере с этими правами root.

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

Создание изображений (images)

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

Podman, с другой стороны, предназначен только для запуска контейнеров, а не для их сборки. Вот тут-то и приходит на помощь Buildah. Buildah — это инструмент с открытым исходным кодом, который позволяет создавать образы контейнеров Open Container Initiative (OCI).

Podman с помощью Buildah может создавать образы контейнеров OCI.

Docker Swarm и docker-compose

Docker Swarm — это платформа оркестрации контейнеров, используемая для управления контейнерами Docker. С помощью Docker Swarm вы можете запустить кластер узлов Docker и развернуть масштабируемые приложения без необходимости использования других зависимостей.

Docker Swarm также может управлять несколькими контейнерами на нескольких хостах и ​​соединять их все. Docker Swarm, очевидно, можно без проблем использовать с Docker прямо из коробки.

Podman не поддерживает Docker Swarm, но с Podman можно использовать другие инструменты, например Nomad, который поставляется с драйвером Podman.

Docker-compose — это инструмент для управления приложениями с несколькими контейнерами. Основное различие между Docker Compose и Docker Swarm заключается в том, что Docker-Compose работает только на одном хосте, в то время как Docker Swarm соединяет различные хосты.

Docker автоматически совместим с docker-compose и может хорошо с ним работать прямо из коробки.

В предыдущих версиях Podman у Podman не было возможности имитировать демон Docker, необходимый для работы Docker Compose, поэтому использовался Podman Compose.

Теперь, в версии 3.0, Podman представил podman.socket сокет UNIX, который заменяет Docker Daemon.

Монолит против модульности

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

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

Вот краткое изложение сравнения Podman и Docker.

Докер Подман Использует демона. Имеет архитектуру без демонов. Он может работать только с правами root. Возможность запуска без рута. Менее безопасно, поскольку все контейнеры имеют права root. Более безопасно, поскольку контейнеры не имеют root-прав. Docker — самодостаточный инструмент, который самостоятельно создает образы. Podman не может создавать изображения самостоятельно. Для создания образов он использует другой инструмент под названием buildah. Он поддерживает Docker Swarm и Docker Compose прямо из коробки. Он не поддерживает Docker Swarm или Docker Compose. Docker — монолитный независимый инструмент. Podman полагается на другие сторонние инструменты.

Является ли Podman заменой Docker или они могут работать вместе?

Некоторые разработчики используют Podman для производства и Docker для разработки. Поскольку они оба совместимы с OCI, совместимость не будет проблемой. Однако, прежде чем двигаться дальше, лучше сравнить Podman и Docker.

Вы можете использовать Docker для разработки, чтобы упростить свою работу, и использовать Podman для производства, чтобы получить дополнительную безопасность, которую он обеспечивает, и сделать ваше приложение более эффективным.

Podman может стать основным вариантом технологии контейнеризации, если вы начинаете проект с нуля. Если проект продолжается и уже использует Docker, это зависит от специфики, но, возможно, оно не стоит затраченных усилий. Будучи родным приложением Linux, оно требует от разработчиков навыков работы с Linux.

Как перейти с Docker на Podman?

Миграция с Docker на Podman может быть довольно простой и простой в реализации. Те же команды, которые вы используете для использования Docker, можно использовать и для Podman, поэтому вам не придется беспокоиться о запоминании новых команд, что значительно упрощает миграцию.

Некоторые разработчики просто называют Docker псевдонимом Podman, и все работает точно так же, но процессы обрабатываются Podman, а не Docker.

Запуск контейнера Node.js с помощью Podman

Во-первых, на вашем компьютере должен быть установлен Podman. Если вы хотите следовать этому краткому руководству, вы можете загрузить пример приложения node.js из этого репозитория GitHub.

Поскольку и Podman, и Docker соответствуют стандарту контейнеров OCI, Podman также может создавать контейнеры из Dockerfile , поэтому, если вы можете создать и запустить контейнер из Dockerfile с помощью Docker, вы также можете запустить его с помощью Podman.

Давайте создадим контейнер на этом Dockerfile:

# Create app directory

WORKDIR /usr/src/app




# Install app dependencies

# A wildcard is used to ensure both package.json AND package-lock.json are copied

# where available (npm@5+)

COPY package*.json ./

RUN npm install

# If you are building your code for production

# RUN npm ci --only=production

# Bundle app source

COPY . .

EXPOSE 3000

CMD [ "node", "server.js" ]
FROM node:16

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

podman build -t my-node-app .

контейнер

После запуска команды Podman выполнит Dockerfile и создаст образ на вашем локальном компьютере.

Вы можете показать образы контейнеров, доступные на вашем локальном устройстве, запустив podman images.

«подман»: изображения

Мы создали только один образ под названием my-node-app, но, если вы заметили, у нас есть еще один дополнительный образ, поскольку контейнер, который мы пытаемся запустить, использует node:16. Podman автоматически загрузит этот образ для запуска контейнера, который мы хотим запустить.

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

podman run --name my-node-js-container -p 3000:3000 localhost/my-node-app

Укажет --name tag имя контейнера, -p сопоставит порт внутри контейнера с портом на хост-компьютере -p host:container.

Наконец, добавьте localhost/my-node-app в конце, чтобы указать образ контейнера, на котором мы хотим, чтобы наш новый контейнер работал.

локальный хост/мой-узел-приложение

Поздравляем, ваш сервер теперь работает на порту 3000 внутри контейнера, которым управляет Podman. Вы можете получить к нему доступ из своего браузера.

3000 изображений

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

Еще одна интересная особенность Podman заключается в том, что вы можете остановить или удалить все контейнеры с помощью —-all флага. С Docker вы не смогли бы это использовать.

Например, если вы хотите остановить все контейнеры с помощью Podman, вы можете запустить podman stop —-all. Если вы собираетесь сделать то же самое с Docker, вам придется запустить docker stop $(docker ps -a -q), который немного сложно запомнить.

Заключение

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

Если вас больше беспокоит безопасность ваших приложений или вы планируете использовать Kubernetes для оркестрации своих контейнеров, Podman — лучший выбор для вас.

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