
Podman vs Docker: So sánh chi tiết container cho developer hiện đại
Docker và Podman là hai động cơ container hàng đầu mà DevOps sử dụng để build, run và quản lý ứng dụng đóng gói container. Cả hai đều tuân thủ tiêu chuẩn OCI cho định dạng và runtime container, nghĩa là chúng có thể chạy cùng một hình ảnh và đạt được kết quả tương tự. Tuy nhiên, Docker Engine v28.x và Podman v5.x (đến giữa năm 2025) có những khác biệt quan trọng về kiến trúc và tính năng. Bài viết này so sánh Docker và Podman từ góc độ kiến trúc, rootless, bảo mật, orchestration, CLI/API, build ảnh và performance.

Kiến trúc và daemon: Docker là gì? Podman là gì?
Docker’s Daemon Architecture: Docker pioneered containerization hiện đại với kiến trúc client-server. Docker Engine bao gồm một quá trình daemon (dockerd) chạy nền quản lý toàn bộ vòng đời container. Khi dùng lệnh docker run, CLI gửi request tới daemon qua socket (Docker REST API). Daemon (chạy với root mặc định) tạo/điều khiển container bằng các thành phần runtime (containerd, runc). Thiết kế này tập trung kiểm soát nhưng tạo ra single point of failure: nếu daemon crash, container có thể dừng.
Podman’s Daemonless Architecture: Podman ngược lại là daemonless — không có dịch vụ nền liên tục. CLI Podman trực tiếp khởi chạy container như child process của session người dùng (mô hình fork/exec). Podman dùng tiến trình nhẹ (conmon) để giám sát, nhưng không có daemon nặng. Mỗi container độc lập, không có service root intermediary nào. Nếu CLI Podman thoát, container vẫn tiếp tục chạy (thường quản lý bằng systemd).

Rootless container: An toàn từ cốt lõi
Podman’s Rootless by Design: Đặc điểm nổi bật nhất của Podman là hỗ trợ rootless từ ngày đầu. Podman cho phép người dùng thường chạy container mà không cần root. Cơ chế user namespaces: trong container, process chạy dưới UID 0 (root) nhưng trên host được ánh xạ tới user ID không có đặc quyền, giới hạn quyền. Mỗi user có dải UID riêng, lưu trữ container/image riêng biệt, không ảnh hưởng user khác — phù hợp đa tenant.
Docker’s Rootless Mode: Docker trong lịch sử yêu cầu root (thông qua docker group). Từ Docker 19.03+, Docker hỗ trợ rootless mode. Daemon chạy dưới user không có đặc quyền (cũng dùng user namespaces). Tuy nhiên, rootless mode của Docker không phải mặc định và có giới hạn. Ví dụ, Docker Swarm không hoạt động trong rootless mode. Networking rootless còn hạn chế (phụ thuộc slirp4netns). Podman’s rootless “just works” mà không cần cấu hình đặc biệt.
Bảo mật mặc định
Daemon Attack Surface: Docker daemon chạy dưới root — một lỗ hổng có thể dẫn tới root trên host. Podman không có root daemon, không có tiến trình đặc quyền nào để khai thác, giảm bề mặt tấn công.
Linux Capabilities: Docker mặc định cấp ~14 capabilities cho container. Podman chặt chẽ hơn với ~11 capability, tuân thủ nguyên tắc least privilege.
SELinux/AppArmor: Podman tích hợp SELinux sẵn — mỗi container đều nhận nhãn SELinux mặc định trên hệ thống có SELinux. Docker cần cấu hình thủ công qua –security-opt.
Hỗ trợ OCI và chuẩn định dạng
Cả Docker và Podman đều tuân thủ OCI. Docker dùng OCI image format + runtime (containerd + runc). Podman dùng libpod + runc/crun. Các image Docker và Podman hoàn toàn tương thích — podman pull ubuntu:22.04 và docker pull ubuntu:22.04 tải về cùng một layer.
Orchestration: Swarm, Kubernetes, Compose
Docker: Hỗ trợ Swarm built-in cho multi-host, Docker Compose để định nghĩa multi-container trên một host. Docker Desktop cung cấp Kubernetes single-node.
Podman: Không có Swarm. Thay vào đó, Podman hỗ trợ pod — khái 개념 pod từ Kubernetes. Lệnh podman generate kube xuất Kubernetes YAML từ container hiện tại, podman play kube chạy YAML trên máy. Podman Compose (cộng đồng) hỗ trợ docker-compose.yml.
CLI và API
Podman được thiết kế để tương thích Docker CLI — chỉ cần thay docker bằng podman. Podman cung cấp Docker-compatible REST API qua podman system service. Docker API luôn sẵn sàng khi daemon chạy.
Performance so sánh
Cả hai đều đạt near-native performance. Podman không có daemon nên không tốn RAM/CPU khi idle. Dưới đây là bảng so sánh từ Uptrace (2024):
| Metric | Podman | Docker |
|---|---|---|
| Startup time | ~200–300ms | ~150–200ms |
| Memory idle | Lower (no daemon) | Higher (daemon) |
| CPU pattern | Spikier per container | Steadier |
| Scaling | Linear | Plateau at scale |
Trong benchmark scientific (CentOS 7, filesystem-intensive), Podman consistently nhanh hơn Docker một chút. Hiệu số nhỏ nhưng Podman có lợi thế khi chạy nhiều container đồng thời.
Khi nào chọn Docker, khi nào chọn Podman?
- Chọn Docker: Nếu dựa dẫm mạnh vào hệ sinh thái Docker (CI/CD, Docker Hub, Docker Desktop). Docker thích hợp cho dev laptop và workflow đã có sẵn.
- Chọn Podman: Nếu quan tâm tới rootless, bảo mật out-of-the-box, tích hợp SELinux. Podman thích hợp cho server multi-user, CI nơi không muốn chạy root daemon, và workflow Kubernetes (pod concept, play/generate kube).
