· docker / podman / containers
Docker vs Podman — daemonless thật sự thắng không?
Docker cho workflow nặng về Compose và ecosystem phong phú. Podman cho bảo mật rootless, CI, và team trả $24/user Docker Business. Phân tích 2026.
Bởi Ethan
1.901 từ · 10 phút đọc
Cài Docker nếu bạn muốn onboarding thuận lợi nhất, ecosystem phong phú nhất, và những Compose file phức tạp chạy được ngay từ đầu. Cài Podman nếu team bạn ưu tiên bảo mật theo mặc định, đang chạy container trong CI, hoặc đang nhìn chằm chằm vào hóa đơn Docker Business $24/user/tháng. Đó là câu trả lời ngắn. Phần còn lại giúp bạn biết mình thực sự thuộc phe nào.
Bài này dành cho ai
Developer đã dùng Docker nhiều năm và đang tự hỏi liệu Podman có thật sự đáng chuyển sang không. Cũng hữu ích cho platform engineer đang chọn runtime cho CI rootless. Nếu bạn deploy lên Kubernetes, podman kube play sẽ liên quan hơn ở phần sau — nhưng bài này chủ yếu về local dev và CI, không phải production orchestration.
Chúng tôi thử nghiệm gì
Docker Engine 29.5.0 và Podman 5.8.2 (bản stable mới nhất tính đến tháng 5/2026), cùng Docker Desktop 4.73.1 và Podman Desktop 1.27.1 ở phía GUI.
Benchmark lấy từ Uptrace (2025) và Morph (2026); cả hai đều không công bố phương pháp đầy đủ — xem các con số mang tính định hướng, không phải cấp độ lab. Ở đâu dẫn số liệu, chúng tôi đều dẫn nguồn.
Kiến trúc: “daemonless” thật ra có nghĩa gì
Chuỗi process của Docker là: CLI → dockerd → containerd → runc. Một daemon chạy với quyền root (dockerd) đứng giữa bạn và mọi thao tác container. Nó giữ cache nóng, quản lý trạng thái tuần tự, và sở hữu /var/run/docker.sock. Khi nó crash, mọi thứ dừng lại.
Chuỗi của Podman là: CLI → fork-exec → crun. Không có daemon. Mỗi podman run là một process spawn trực tiếp. Container là user process với toàn bộ audit lineage từ systemd.
Trong thực tế, sự khác biệt thể hiện ở ba chỗ:
Bộ nhớ khi nhàn rỗi. Daemon của Docker tốn 140–180 MB khi idle. Podman tốn 0 MB. Ở quy mô lớn hơn — 10 container — Docker dùng 420–550 MB so với 280–350 MB của Podman, chênh lệch 35%. Ở 100 container: 3.2–4.1 GB so với 2.1–2.6 GB.
Khởi động ở quy mô lớn. Cold-start một container: Docker thắng với ~150ms so với ~180ms của Podman. Chuyển sang 50 container chạy song song, daemon trở thành điểm nghẽn: Podman nhanh hơn 12–15%, một lợi thế thực sự ở quy mô lớn (Morph, 2026).
Rootless theo mặc định. Daemon rootful của Docker là opt-out (rootless mode có nhưng không phải mặc định). Podman rootless theo mặc định — container chạy với user của bạn, không phải root. Sự khác biệt này quan trọng khi bạn gặp CVE.
Hiệu năng: thời gian build và cold-start
Build image
Build multi-stage Node.js, BuildKit so với Buildah:
| Cold build | |
|---|---|
| Docker 29.x / BuildKit | 11.8s |
| Podman 5.8 / Buildah | 12.3s |
Cold build chênh nhau trong vùng noise: 4%. Khẳng định “Podman nhanh gấp 6×” trong các bài cũ không có cơ sở; ngay cả maintainer của Podman cũng phủ nhận điều này.
Mạng
Từ Podman 4.0, backend pasta mặc định đạt ~97% throughput mạng native cho rootless container — không có penalty đáng kể.
macOS: nơi Docker Desktop vẫn vượt trội về trải nghiệm
Docker Desktop 4.73.1 trên macOS: /var/run/docker.sock có ngay từ đầu. Testcontainers, VS Code Dev Containers, và bất kỳ thứ gì giả định có Docker socket đều hoạt động mà không cần cấu hình thêm. GUI đi kèm Docker Scout để scan lỗ hổng image và Build Cloud để offload build.
Vấn đề giá. Docker Desktop miễn phí cho cá nhân, sinh viên, và team nhỏ (dưới 250 nhân sự, doanh thu dưới $10M). Pro là $9–11/user/tháng. Team là $15–16/user/tháng. Business — tier thêm SSO, hardened desktop, và enhanced isolation — là $24/user/tháng. Một team 30 người ở mức Business trả $720/tháng chỉ cho một desktop wrapper.
Podman Desktop 1.27.1 trên macOS bật Docker API compatibility theo mặc định, nên các tool Docker bên thứ ba định tuyến qua Podman socket một cách minh bạch. Điểm trừ: Podman chạy bên trong QEMU VM trên macOS (podman machine). Cài đặt:
podman machine init && podman machine start
export DOCKER_HOST="unix://$(podman machine inspect --format '{{.ConnectionInfo.PodmanSocket.Path}}')"
VM cold boot mất ~15 giây. Docker Buildx multi-platform cần cài QEMU thủ công. Sự bất tiện này có thật, dù UI của Podman Desktop 1.27 đã tự động hóa một phần.
OrbStack đáng nhắc đến như một lựa chọn dành riêng cho Mac: đây là thay thế trực tiếp cho Docker socket, khởi động container nhanh hơn Docker Desktop đến 10× với ít tốn RAM hơn. Giá: miễn phí cho cá nhân, $8/user/tháng cho thương mại. Không có chương trình affiliate nên chúng tôi không có động cơ gì khi nhắc đến — chỉ đơn giản là một số Mac dev sẽ thấy đây là lựa chọn thực dụng nhất, tốt hơn cả hai.
Bảo mật: hai CVE thay đổi cán cân
CVE-2025-9074 — Docker Desktop container escape (CVSS 9.3)
Ảnh hưởng: Docker Desktop cho Windows và macOS trước 4.44.3. Một container độc hại có thể kết nối đến Docker Engine API tại 192.168.65.7:2375 mà không cần xác thực, POST đến /containers/create, và bind-mount filesystem của host. Trên Windows, đó là toàn quyền kiểm soát host. Trên macOS, ứng dụng Docker Desktop bị xâm phạm (isolation bổ sung giới hạn việc chiếm toàn bộ host). Linux không bị ảnh hưởng. Cách khắc phục: nâng cấp lên 4.44.3.
CVE-2026-34040 — Docker Engine AuthZ bypass (CVSS 8.8)
Request body vượt 1 MB bị loại bỏ trước khi đến authorization plugin, nhưng daemon vẫn xử lý nó. Một user thuộc nhóm docker có thể nhồi thêm dữ liệu vào container-create request vượt 1 MB, plugin AuthZ không thấy gì để chặn, và một privileged container có quyền truy cập filesystem của host được tạo ra. Mitigation rootless phát huy tác dụng ở đây: ngay cả root của privileged container cũng ánh xạ đến một host UID không có đặc quyền, nên blast radius thu hẹp từ toàn quyền kiểm soát host xuống còn một tài khoản bị xâm phạm không có đặc quyền.
Lợi thế cấu trúc của Podman: không có daemon nghĩa là không có socket cố định thuộc sở hữu của root. Container là user process. Systemd ghi lại toàn bộ audit lineage.
Tương thích Compose và CI
podman-compose (Python, Podman-native) bao phủ Compose spec cơ bản nhưng còn thiếu sót:
depends_onvới điều kiện health-check: hỗ trợ một phần- Docker Buildx multi-platform: chưa hỗ trợ
- Docker Swarm: chưa hỗ trợ
- Phân quyền volume: UID mapping rootless gây lỗi
permission deniedkhi mount từ host; khắc phục bằng label:Zhoặcuserns_mode: keep-id - DNS giữa các service: cần khai báo block
networks:tường minh
Cách giải quyết thực tế là chạy Docker Compose v2 qua Podman socket bằng DOCKER_HOST. Tài liệu của chính Red Hat khuyến nghị cách này cho team cần tương thích đầy đủ tính năng.
Trong CI, lợi thế cấu trúc của Podman lại thể hiện rõ: chạy rootless nghĩa là không cần runner privileged: true. Runner của GitHub Actions đi kèm Docker sẵn; docker-in-docker cần privileged mode. Podman trong CI không cần cả hai.
Khác biệt CLI hay gây nhầm lẫn
Các lệnh quan trọng không có ánh xạ 1:1:
# Docker: build với Dockerfile cụ thể
docker build -f Dockerfile.prod -t myapp:prod .
# Podman tương đương (--file, không phải -f — cùng flag nhưng lưu ý kế thừa từ Buildah)
podman build -f Dockerfile.prod -t myapp:prod .
# Docker: compose up
docker compose up -d
# Podman: hai lựa chọn
podman compose up -d # podman-compose (có thể thiếu tính năng)
DOCKER_HOST=unix://... docker compose up -d # Docker Compose v2 qua Podman socket (an toàn hơn)
# Docker: rootless qua flag
docker run --userns=host ...
# Podman: rootless theo mặc định, rootful là opt-in
podman run --userns=keep-id ... # ánh xạ user trong container sang UID của bạn
# macOS: kiểm tra đang nói chuyện với socket nào
docker context ls
podman machine inspect --format '{{.ConnectionInfo.PodmanSocket.Path}}'
Kết luận
| Trường hợp dùng | Chọn | Ghi chú |
|---|---|---|
| Cold image build | Docker (+4%) | Trong vùng noise |
| Cold-start một container | Docker (~150ms) | Chênh lệch nhỏ |
| 50+ container song song | Podman (nhanh hơn 12–15%) | Không bị nghẽn do daemon |
| Bộ nhớ khi nhàn rỗi | Podman (0 MB) | Không có daemon tax |
| Trải nghiệm macOS | Docker Desktop | Podman Desktop đang thu hẹp khoảng cách |
| Tương thích Compose | Docker | podman-compose còn thiếu sót |
| Bảo mật rootless | Podman | Mặc định vs opt-in |
| CI không cần privileged runner | Podman | Không cần daemon |
| Phát triển Kubernetes-native | Podman | podman kube play, pods |
| Chi phí cho team thương mại | Podman ($0) | Docker Business: $24/user/tháng |
| Ecosystem / plugin | Docker | Scout, Build Cloud, cộng đồng lớn |
Chọn Docker nếu: bạn phụ thuộc vào tính năng GUI của Docker Desktop, Compose file của bạn dùng tính năng nâng cao, hoặc bạn đang onboard developer và muốn mọi thứ hoạt động ngay từ đầu.
Chọn Podman nếu: bảo mật hoặc compliance là ưu tiên, bạn đang chạy CI rootless, bạn là team thương mại trên 25 người đang trả phí Docker Business, hoặc bạn đang phát triển ứng dụng Kubernetes-native.
Chọn OrbStack (chỉ Mac) nếu: bạn muốn Docker API compatibility với khởi động nhanh hơn 10× và ít tốn RAM hơn ở mức $8/user/tháng cho thương mại. Không có affiliate, đây là khuyến nghị trung thực.
Nếu serverless nằm trong danh sách cân nhắc thay vì container runtime, Cloudflare Workers vs AWS Lambda so sánh trực tiếp hai mô hình triển khai. Đội chạy Kubernetes-native cần kết hợp Podman với monitoring: Sentry vs Datadog phân tích chi phí observability theo quy mô team.
Lưu ý
Cả Docker lẫn Podman đều không cung cấp kernel isolation. Cả hai chia sẻ host kernel. Nếu bạn chạy code không tin cậy — container do người dùng gửi lên, bất cứ thứ gì bạn không dám chạy trực tiếp như một process — bạn cần MicroVM: Docker sbx, Kata Containers, hoặc libkrun. Rootless mode giảm blast radius; nó không tạo thêm security boundary.
Hỗ trợ Compose của Podman đang cải thiện nhanh. Khoảng cách mô tả ở đây chính xác cho Podman 5.8.2 và podman-compose 1.x; kiểm tra changelog của podman-compose trước khi giả định nó vẫn còn đúng.
Benchmark được trích dẫn (Uptrace, Morph) không công bố cấu hình phần cứng. Kết quả trên ARM có thể khác so với các số liệu trên.
Tham khảo
- Docker Engine 29.x release notes
- Podman 5.8.2 releases (GitHub)
- Docker Desktop pricing
- OrbStack pricing
- Podman installation & macOS machine docs
- Podman Desktop Docker compatibility
- Official Podman performance docs
- Podman image build performance — maintainer discussion
- CVE-2025-9074 Docker Desktop container escape (CVSS 9.3)
- CVE-2026-34040 Docker Engine AuthZ bypass (CVSS 8.8)
- Red Hat: Podman Compose vs Docker Compose
- Uptrace: Podman vs Docker benchmarks 2025
- Morph: Docker vs Podman 2026