Блог
Docker и Podman: что меняется и как перенести приложение

Docker и Podman: что меняется и как перенести приложение

Переход на Podman без потери данных: совместимость образов, Compose, rootless-режим и проверка приложения до переключения трафика.

5 мин чтения
#docker
#podman
#vps

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

Что действительно отличается

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

Rootless-режим позволяет запускать контейнеры от обычного пользователя. Он есть и у Podman, и у Docker. Пользователь внутри контейнера и пользователь на хосте при этом могут иметь разные числовые идентификаторы. Если приложение перестало писать в подключённый каталог, сначала проверьте отображение UID/GID и владельца файлов. Выдача прав 777 скрывает причину и открывает каталог всем локальным пользователям. Rootless Docker.

Docker и Podman: сравнение

Что сравниваемDocker EnginePodman
Управление контейнерамиCLI обращается к постоянно работающему демону DockerЛокальный CLI работает без общего управляющего демона; API-сервис включается отдельно
Запуск без rootЕсть rootless-режим, который нужно настроитьЕсть rootless-режим для работы от обычного пользователя; нужны подходящие настройки ОС
Образы приложенияОбразы из реестров и сборка из DockerfileТе же распространённые форматы образов; можно использовать Dockerfile или Containerfile
ComposeКоманда docker compose с установленным плагином Composepodman compose вызывает внешний провайдер; совместимость проекта нужно проверить
Автозапуск в LinuxПолитики перезапуска контейнеров и запуск Docker при загрузкеМожно описать сервисы через Quadlet и управлять ими через systemd
ДанныеСобственные контейнеры, тома и хранилище DockerОтдельное хранилище; тома Docker автоматически не появляются
Первый шаг при выбореПроверить, что текущий проект и инструменты работают с DockerПроверить rootless, Compose и работу сервисов на копии данных

Переход сам по себе не обещает прироста скорости. Для VPS чаще важнее совместимость конкретного приложения, права на файлы и способ эксплуатации. Описание механизмов: Docker rootless, Podman, провайдер Compose и Quadlet.

Как установить Podman

На Linux начните с пакета из репозитория своего дистрибутива. Версия в нём может отличаться от последнего выпуска Podman; доступные функции сверяйте с документацией установленной версии.

Для Ubuntu и Debian:

bash
sudo apt-get update
sudo apt-get install podman
podman --version

Для Fedora:

bash
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 изменения можно посмотреть без установки:

bash
sudo apt-get --simulate install podman

Для тестового контейнера выберите свободный порт, например 127.0.0.1:18080, пока Docker продолжает обслуживать основной сайт. Не подключайте одновременно обе копии базы к одному каталогу данных и не меняйте глобальный DOCKER_HOST для инструментов, которые должны продолжать работать с Docker. Хранилища движков остаются раздельными; Podman также разделяет хранилища root и обычного пользователя.

Сначала соберите описание работающего приложения

Сохраните Compose-файл, версии образов, список портов, переменные окружения и сведения о подключённых томах. Эти команды ничего не меняют:

bash
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

После установки запустите независимый пример рядом с рабочими сервисами:

bash
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. Параметры запуска.

Локальный образ, которого нет в реестре, можно перенести архивом:

bash
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 и старые тома можно после того, как приложение прошло рабочий цикл, а восстановление из резервной копии проверено.