- Docker từ lâu bị chỉ ra các vấn đề về lỗ hổng bảo mật và tiêu tốn tài nguyên do cấu trúc daemon nền (
dockerd)
- Podman áp dụng kiến trúc không daemon, cho phép container chạy trực tiếp dưới quyền người dùng, giảm bề mặt tấn công và tăng cường độ ổn định
- Nhờ hỗ trợ tích hợp systemd, thiết kế thân thiện với Kubernetes và bộ công cụ tách biệt theo triết lý Unix như Buildah/Skopeo, hiệu quả vận hành được nâng cao
- Giữ mức tương thích cao với Docker CLI, nên chỉ với
alias docker=podman là hầu hết quy trình làm việc hiện có vẫn hoạt động nguyên vẹn
- Ngay cả trong môi trường vận hành thực tế, bảo mật và quản lý tài nguyên cũng trở nên đơn giản hơn, và với các dự án mới, Podman đang trở thành lựa chọn hợp lý và hướng đến tương lai hơn
Giới hạn và vấn đề bảo mật của Docker
- Docker có cấu trúc trong đó daemon
dockerd luôn chạy với quyền root
- Nếu phát hiện lỗ hổng trong daemon, toàn bộ máy chủ có thể bị đặt vào tình thế rủi ro
- Một số ví dụ về sự cố bảo mật lớn
- 2019: thoát container runC (CVE-2019-5736)
- 2022: lỗ hổng Linux Dirty Pipe, thoát cgroups v1
- 2024: runC “Leaky Vessels”, lỗ hổng BuildKit
- 2024: chiến dịch cryptojacking thông qua việc lộ Docker API
- Khi những sự cố như vậy lặp lại, rủi ro mang tính nền tảng của kiến trúc dựa trên daemon ngày càng lộ rõ
Kiến trúc không daemon của Podman
- Podman không sử dụng daemon nền
- Khi chạy
podman run, container hoạt động như tiến trình con trực tiếp của tiến trình gọi lệnh
- Vì chạy ở chế độ rootless, ngay cả quyền root trong container trên máy chủ cũng chỉ tương đương quyền người dùng thông thường
- Ưu điểm
- Tăng cường bảo mật: nếu xảy ra thoát container thì phạm vi thiệt hại được thu hẹp
- Bảo đảm ổn định: một container chết cũng không ảnh hưởng đến các container khác
- Hiệu quả tài nguyên: không có daemon không cần thiết thường trú nên giảm mức dùng bộ nhớ
Các tính năng khác biệt của Podman
- Tích hợp systemd
- Tự động tạo file unit systemd bằng
podman generate systemd
- Có thể quản lý dịch vụ bằng lệnh
systemctl tiêu chuẩn
- Thân thiện với Kubernetes
- Khái niệm Pod được tích hợp sẵn, thuận tiện cho việc phát triển ứng dụng đa container
- Có thể tạo trực tiếp Kubernetes YAML bằng
podman generate kube
- Triết lý Unix
- Podman tập trung vào chạy container, còn build image dùng Buildah, quản lý registry dùng Skopeo
- Có thể tận dụng các công cụ được tối ưu theo từng mục đích
Quá trình chuyển đổi và khả năng tương thích
- Việc chuyển từ Docker sang Podman gần như không gián đoạn
- CLI tương thích nên có thể dùng nguyên cách gọi cũ, chỉ thay
docker bằng podman
- Dockerfile hiện có cũng vẫn hoạt động như cũ
- Điểm khác biệt
- Ở chế độ rootless không thể bind cổng nhỏ hơn 1024 → khuyến nghị dùng reverse proxy
- Cần quản lý quyền của volume
- Các công cụ phụ thuộc vào Docker socket có thể dùng chế độ tương thích Docker API của Podman
Ứng dụng thực tế và lợi ích
- Sau khi dùng Podman trong môi trường vận hành
- Giảm gánh nặng kiểm tra bảo mật, mặc định đã áp dụng bảo mật rootless
- Mô hình sử dụng tài nguyên trở nên đơn giản và dễ dự đoán hơn
- Docker vẫn rất phổ biến, nhưng nếu là dự án mới hoặc có quyền tự do lựa chọn công nghệ thì Podman phù hợp hơn
- Tích hợp tự nhiên với hệ thống quản trị Linux
- Kiến trúc định hướng Kubernetes
- Cung cấp môi trường chạy container an toàn và hợp lý hơn
Tóm tắt hướng dẫn chuyển FastAPI
- Có thể dùng nguyên Dockerfile hiện có
- Chỉ cần thay bằng
podman build, podman run
- Dùng
podman generate systemd để đăng ký dịch vụ systemd
- Hỗ trợ môi trường đa dịch vụ như DB bằng cách tận dụng Pod
- Quy trình Docker Compose có thể xử lý bằng
podman-compose hoặc chuyển đổi qua kompose
8 bình luận
Ở đây có viết rằng có thể chuyển đổi không gián đoạn, nhưng trong môi trường vận hành thực tế lại có khá nhiều thứ kỳ lạ. Ví dụ, trên môi trường mac, do dùng nén zstd theo thiết lập mặc định nên image đã build che phủ registry khá nhiều, v.v..
Cả Docker lẫn podman đều....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
Thực tế là khả năng tương thích với Docker không tốt nên tính tiện dụng cũng không cao lắm...
Tôi từng chuyển sang Podman vì nghĩ đến chế độ rootless, rồi lại quay về Docker.
Như người khác đã nói, nếu dùng với Kubernetes thì cứ dùng
containerdlà xong.Tôi hơi có thắc mắc là nếu
Docker composekhông hoạt động tốt, còn ưu điểm là tương thích với Kubernetes, thì chẳng phải dùng luôn Kubernetes ngay từ đầu sẽ hợp lý hơn sao?Tôi cũng định thử dùng, nhưng vì nó không chạy được ngay một lần là xong và cũng không thể tự map các cổng dưới 1024, nên cuối cùng tôi dùng kết hợp k3s với
nerdctlđể build image.Tôi vẫn luôn muốn chuyển đổi vào một lúc nào đó, nhưng khi đã thử trước đây thì trái với những gì các lập trình viên nói, có quá nhiều dự án
docker composekhông hoạt động đúng cách...Docker còn chẳng hỗ trợ network mà.
Theo mình biết thì nó cũng hỗ trợ tính năng mạng tương tự Docker.
Hiện vẫn còn phần nào chưa hoạt động ổn đúng không?
Ý kiến Hacker News
chrootvà jail. Mã triển khai của tôi chạy phần mềm bên ngoài môi trường jail, rồi dùngptraceđể theo dõi các file mà tiến trình mở. Từ đầu ra này tôi trích xuất danh sách phụ thuộc để đóng gói. Kết quả là bản phân phối nhỏ, giữ được tính bất biến và còn tăng cường bảo mật. Khi Docker xuất hiện, nó làm tôi nhớ lại cách cũ đó, và tôi tự hỏi liệu có công cụ tương tự nào theo dõi mức sử dụng file của container Docker để cắt gọn bản phân phối hay khônggit push. Chỉ cầngit push live masterlà triển khai xong. Tôi đã dùng Docker rất nhiều, nhưng đây vẫn là cách deploy dễ nhất. Tôi hiểu lợi ích của Docker, nhưng thiết lập HTTP trên Ubuntu hay OpenBSD thực ra không khó đến vậy. Tôi vẫn nghi ngờ liệu tính tái lập riêng của Docker có thật sự đáng để chấp nhận mức overhead quản trị đó khôngLiên kết mã liên quan
--connection. Khi cần, Podman còn có thể tự tạo VM (dùng lima). Podman Desktop cũng có lớp tương thích Docker để giảm vấn đề tương thíchpodman generate systemdđược nhắc trong bài giờ đã bị deprecated. Giải pháp thay thế là Podman Quadlets, hoạt động giống như mộtdocker-compose.yamlđược định nghĩa bên trong file unit của systemdcrunuidmap, userns) thì không hoạt động tốt. Tôi nghi ngờ tính hiệu quả thực sự của việc ánh xạ secondary ID/devcần thiết và chỉ phơi ra những chương trình cực kỳ hạn chế trên mạng cô lậptại đây,
tại đây,
tại đây