Приложение в Docker обычно можно запустить в Podman из того же образа. Больше внимания требуют данные, сетевые настройки и способ запуска после перезагрузки. Начинать перенос лучше с одного сервиса на отдельном порту: так проще проверить результат и сохранить работающий вариант для отката.
Что действительно отличается
Docker Engine управляет контейнерами через постоянно работающий демон. У Podman локальные команды обходятся без общего управляющего демона; для программ, которым нужен API, можно отдельно включить сокет. Оба инструмента работают с контейнерными образами, поэтому переписывать приложение ради смены движка обычно не требуется. Установка Podman сама по себе не переносит образы и тома из Docker. Устройство и режимы Podman.
Rootless-режим позволяет запускать контейнеры от обычного пользователя. Он есть и у Podman, и у Docker. Пользователь внутри контейнера и пользователь на хосте при этом могут иметь разные числовые идентификаторы. Если приложение перестало писать в подключённый каталог, сначала проверьте отображение UID/GID и владельца файлов. Выдача прав 777 скрывает причину и открывает каталог всем локальным пользователям. Rootless Docker.
Docker и Podman: сравнение
| Что сравниваем | Docker Engine | Podman |
|---|---|---|
| Управление контейнерами | CLI обращается к постоянно работающему демону Docker | Локальный CLI работает без общего управляющего демона; API-сервис включается отдельно |
| Запуск без root | Есть rootless-режим, который нужно настроить | Есть rootless-режим для работы от обычного пользователя; нужны подходящие настройки ОС |
| Образы приложения | Образы из реестров и сборка из Dockerfile | Те же распространённые форматы образов; можно использовать Dockerfile или Containerfile |
| Compose | Команда docker compose с установленным плагином Compose | podman compose вызывает внешний провайдер; совместимость проекта нужно проверить |
| Автозапуск в Linux | Политики перезапуска контейнеров и запуск Docker при загрузке | Можно описать сервисы через Quadlet и управлять ими через systemd |
| Данные | Собственные контейнеры, тома и хранилище Docker | Отдельное хранилище; тома Docker автоматически не появляются |
| Первый шаг при выборе | Проверить, что текущий проект и инструменты работают с Docker | Проверить rootless, Compose и работу сервисов на копии данных |
Переход сам по себе не обещает прироста скорости. Для VPS чаще важнее совместимость конкретного приложения, права на файлы и способ эксплуатации. Описание механизмов: Docker rootless, Podman, провайдер Compose и Quadlet.
Как установить Podman
На Linux начните с пакета из репозитория своего дистрибутива. Версия в нём может отличаться от последнего выпуска Podman; доступные функции сверяйте с документацией установленной версии.
Для Ubuntu и Debian:
sudo apt-get update
sudo apt-get install podman
podman --version
Для Fedora:
sudo dnf install podman
podman --version
Пошаговые инструкции проекта: Debian, Ubuntu, Fedora и RHEL. Для первого запуска от обычного пользователя есть отдельное руководство по rootless Podman.
На macOS и Windows контейнеры Podman работают в Linux-ВМ. Используйте официальные инструкции для этих систем; пример ниже рассчитан на Linux-VPS.
Можно ли поставить Podman рядом с Docker
Да, на Linux их можно использовать параллельно. Установите обычный пакет podman, оставьте Docker работающим и вызывайте движки по отдельности: docker ps и podman ps. Каждый покажет свои контейнеры. Podman не подхватит рабочие контейнеры или тома Docker после установки.
Для такого запуска не устанавливайте пакет podman-docker и не добавляйте alias docker=podman. Этот пакет создаёт команду docker, которая вызывает Podman, и может конфликтовать с установленным Docker CLI. Назначение podman-docker в Fedora.
Перед подтверждением установки просмотрите список действий пакетного менеджера. Если он предлагает удалить или заменить компоненты работающего Docker, сначала разберите конфликт зависимостей. В Debian/Ubuntu изменения можно посмотреть без установки:
sudo apt-get --simulate install podman
Для тестового контейнера выберите свободный порт, например 127.0.0.1:18080, пока Docker продолжает обслуживать основной сайт. Не подключайте одновременно обе копии базы к одному каталогу данных и не меняйте глобальный DOCKER_HOST для инструментов, которые должны продолжать работать с Docker. Хранилища движков остаются раздельными; Podman также разделяет хранилища root и обычного пользователя.
Сначала соберите описание работающего приложения
Сохраните Compose-файл, версии образов, список портов, переменные окружения и сведения о подключённых томах. Эти команды ничего не меняют:
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
docker volume ls
docker inspect app > app-inspect.json
Замените app именем своего контейнера. Файл inspect может содержать секреты из окружения: храните его с ограниченными правами и не отправляйте в публичный репозиторий. Отдельно запишите, какие сервисы обращаются к Docker socket. Панель развёртывания или система сборки может зависеть от конкретных методов Docker API.
Для базы данных сделайте согласованный дамп её собственным инструментом. Каталог с загруженными файлами копируйте после остановки записи либо способом, который гарантирует согласованность приложения. docker export не сохраняет данные подключённых томов. Ограничения export.
Проверьте простой контейнер в Podman
После установки запустите независимый пример рядом с рабочими сервисами:
podman --version
podman run --rm -d --name podman-web-check \
-p 127.0.0.1:18080:80 docker.io/library/nginx:stable
curl --fail http://127.0.0.1:18080/
podman stop podman-web-check
Порт доступен только на самом VPS. Для просмотра со своего компьютера используйте SSH-туннель. Полное имя образа с реестром избавляет от неоднозначности при поиске. Тег stable удобен в примере; для рабочего переноса зафиксируйте проверенную версию или digest. Параметры запуска.
Локальный образ, которого нет в реестре, можно перенести архивом:
docker image save -o app-image.tar myapp:release
podman load -i app-image.tar
Так переносятся слои образа. Данные томов нужно восстановить отдельно. Загрузка образов в Podman.
Как быть с Compose
podman compose вызывает внешний провайдер Compose, например podman-compose или docker-compose. Проверьте, какой провайдер установлен у вас, и протестируйте фактически используемые возможности: сети, healthcheck, secrets, порядок запуска, сборку образов. Наличие команды ещё не доказывает совместимость всего проекта. Документация podman compose.
Для пробного запуска используйте отдельное имя проекта, другие порты и копию данных. Не подключайте одну рабочую базу одновременно к двум независимым экземплярам приложения, если оба могут выполнять миграции или фоновые задания.
Переключение и откат
Проверьте вход в приложение, загрузку файлов, фоновые задачи и сохранение данных после перезапуска. Затем остановите запись в старый экземпляр, перенесите финальные изменения данных и переключите reverse proxy на новый порт. Старые контейнеры и резервную копию оставьте до завершения проверки.
После начала записи в новой системе простой возврат прокси на старую базу приведёт к потере новых изменений. Для такого отката нужен отдельный план переноса данных назад. Удалять Docker и старые тома можно после того, как приложение прошло рабочий цикл, а восстановление из резервной копии проверено.
