Сравнение 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. Вы можете получить к нему доступ из своего браузера.
Все команды, которые мы использовали в этом руководстве, были такими же, как команды 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 — лучший вариант для вас.