Оба инструмента нужны, чтобы запускать контейнеры в Linux. Контейнер - это процесс с отдельными namespace и cgroup, которому «кажется», что у него есть свой собственный хост, сеть и файловая система. Но у Docker и Podman архитектура работы разная.
Как устроен Docker:
Docker устроен по модели «демон + клиент». На машине работает сервис dockerd с root-правами, который управляет всеми контейнерами. Когда вы пишете команду docker run nginx, CLI отправляет её демону, дальше запускается цепочка:
dockerd → containerd → containerd-shim → runc → PID 1 контейнера
Контейнерные процессы видны в ps, но родитель у них containerd-shim.
Как устроен Podman:
Podman демона не имеет. Команда podman run nginx сразу создаёт отдельный процесс-контейнер, за которым следит маленький монитор conmon:
podman → conmon → runc/crun → PID 1 контейнера
В дереве процессов видно сам контейнер, а не один общий демон.
Rootless режим:
С rootless режимом тоже разница. Docker может работать без root через rootlesskit и slirp4netns, но этот режим появился позже и имеет ограничения (например, не все сетевые возможности доступны). Podman изначально задумывался как rootless-friendly:
podman run --userns=keep-id -d alpine sleep 1000
Сеть:
Сеть у Docker в rootful-режиме - это мост docker0 и правила iptables:
ip link show docker0
В rootless - slirp4netns. У Podman начиная с версии 4.x сеть делает связка netavark + aardvark-dns, в rootless тоже используется slirp4netns или pasta.
Оркестрация:
Для Docker есть официальный docker compose. У Podman - podman-compose (комьюнити) и поддержка pods:
podman pod create --name mypod
podman run --pod mypod -d nginx
podman run --pod mypod -d redis
Ещё Podman умеет работать с Kubernetes-манифестами: podman play kube и podman generate kube.
Вывод:
Оба запускают одни и те же OCI-образы, но Docker работает через демон и привычен для большинства DevOps-пайплайнов, а Podman - без демона, с изначальной поддержкой rootless и pods, ближе к модели Kubernetes.
LinuxCamp | #docker #devops