Podman vs Docker

Podman vs Docker
Photo by Ian Taylor from Unsplash

Các công cụ đóng gói container ngày càng phổ biến hơn, nhất là trong công việc phát triển web với rất nhiều công nghệ được tích hợp trong đó.

Docker là một công cụ đã phổ biến từ lâu, được công đồng các lập trình viên tin dùng trong hơn 10 năm qua. Còn Podman là một sản phẩm mới nổi của công ty Red Hat, được thiết kế theo hướng tiếp cận giống với Kubernetes gần đây cũng được cộng đồng đánh giá rất cao.

Trong bài viết này tôi sẽ trình bày một số so sánh hai công cụ này. Chúng có nhiều điểm khác nhau khá lớn (do cách tiếp cận khác nhau) và mỗi công cụ sẽ phát huy tác dụng tốt nhất cho những bài toán cụ thể.

Container, Docker, Podman là gì?

Container

Container là một môi trường ảo được đóng gói để chạy độc lập, trong đó bao gồm tất cả những gì cần thiết: code, các thư viện, công cụ và các thiết lập cần thiết. Với những lợi ích mà nó mang lại, các lập trình viên nhanh chóng chấp nhận nó và sử dụng rộng rãi kiểu kiến trúc đóng gói container. Sử dụng container giúp phát triển nhanh hơn, ổn định hơn và thống nhất hơn giữa các môi trường (local, staging, v.v…)

Container rất gọn nhẹ, bảo mật và dễ dàng di chuyển sang hệ thống khác. Bằng việc đóng gói tất cả trong một container, môi trường phát triển được tách biệt mới phần còn lại của máy tính, giúp nó chạy độc lập và không phụ thuộc vào hệ điều hành. Điều này giúp nó có thể dễ dàng di chuyển từ hệ thống này sang hệ thống khác (ví dụ từ Linux sang Windows), tránh được các lỗi phát sinh do sử dụng hệ điều hành hoặc thư mục khác nhau.

Một số công cụ đóng gói và quản lý container phổ biến Docker, Docker Swarm, Kubernetes.

Docker

Docker là một công cụ quản lý các container. Nó phổ biến tới mức gần như là công cụ tiêu chuẩn khi làm việc với container. Khi nói đến container, rất nhiều người nghĩ ngay đến Docker.

Docker rất mạnh mẽ, nó có rất nhiều tính năng đi trước thời đại mà ngày nay nhiều công cụ khác vẫn phải học theo. Nó dần dần phát triển trở thành một công cụ độc lập với khả năng đáp ứng mọi nhu cầu của lập trình viên về việc quản lý và vận hành các container.

Một công cụ đi kèm của Docker là Docker Swarm có khả năng lên lịch cho Docker Engine, một công cụ khác cũng của Docker để tạo và quản lý nhiều container cùng lúc. Docker và các công cụ đi kèm của nó xử lý hầu như toàn bộ các yêu cầu liên quan đến container, kể cả việc cân bằng tải trong mạng, khiến nó là lựa chọn hàng đầu cho các công việc liên quan. Không những thế, sự phổ biến còn khiến nó trở thành tiêu chuẩn khi so sánh với các công cụ khác.

Tuy nhiên, việc nó chạy tất cả trong một công cụ cũng có vấn đề của nó. Mặc dù là một công cụ rất mạnh để tạo và chạy các container cho bất cứ môi trường nào, nhưng các công cụ khác lại khó giao tiếp với các container này. Điều đó cũng là chỗ để nhiều công cụ khác được phát triển để bù đắp vào điểm yếu này. Tuy nhiên, Docker vẫn là lựa chọn tốt cho những người mới bắt đầu.

Podman

Podman là một công cụ mã nguồn mở, Linux-native được thiết kế để phát triển, quản lý và chạy các container và pod theo tiêu chuẩn Open Container Initiative (OCI). Được phát triển bởi công ty Red Hat, thiết kế với giao diện thân thiện, Podman là công cụ quản lý container mặc định trên các hệ điều hành RedHat 8 và CentOS 8.

Podman là một tập các công cụ (chủ yếu là command line) được thiết kế để xử lý nhiều công việc khác nhau liên quan đến đóng gói container:

  • Podman: Quản lý pod và container image
  • Buildah: Container builder
  • Skopeo: Trình quản lý để kiểm tra container image
  • runc: Container runner và cung cấp tính năng builder cho Podman và Buildah
  • crun: Môi trường thực thi giúp tăng cường sự mềm dẻo, kiểm soát và bảo mật hơn cho các container rootless.

Những công cụ cũng có thể hoạt động với các công cụ tương thích với OCI như Docker, giúp cho người dùng dễ dàng chuyển đổi từ Docker sang Podman và tái sử dụng lại các cấu hình của Docker. Kubernetes cũng có thể dùng Podman. Trên thực tế, Podman và Kubernetes chia sẻ nhiều quan điểm chung.

Podman có một cách tiếp cận khác với Docker về container. Như tên của nó (khả năng là viết tắt của pod manager), Podman có thể tạo các container pod làm việc cùng nhau, tính năng tương tự như pod của Kubernetes. Các pod quản lý các container riêng biệt cùng với nhau như một đơn vị duy nhất.

Lợi ích lớn nhất của cách làm này là các lập trình viên có thể chia sẻ tài nguyên, sử dụng các container khác nhau cho ứng dụng bên trong 1 pod. Ví dụ 1 container cho frontend, 1 cho backend và 1 container khác cho database. Định nghĩa của pod của thể trích xuất dưới dạng YAML hoàn toàn tương thích với Kubernetes và có thể áp dụng vào các cluster của Kubernetes, cho phép container được triển khai nhanh hơn trên production.

Một đặc trứng khác của Podman là nó không cần đến daemon. Daemon là một chương trình chạy dưới nền để xử lý các service, các tiến trình và các truy vấn khác mà không hề có giao diện cho người dùng. Podman là công cụ duy nhất được dùng cho container engine, nó không phụ thuộc vào daemon mà chạy các container và pod bằng các tiến trình con.

Podman vs Docker

Podman và Docker có nhiều tính năng chung, nhưng chúng khác nhau rất nhiều về bản chất (do cách tiếp cận vấn đề khác nhau). Thực ra hai công cụ này hoàn toàn có thể tồn tại và được sử dụng song song. Không có công cụ nào thay thế công cụ nào mà mỗi công cụ sẽ phù hợp cho từng tình huống cụ thể. Trong phần này tôi sẽ trình bày sự khác nhau giữa chúng để mọi người có thể dễ lựa chọn hơn khi cần thiết.

Kiến trúc

Docker sử dụng daemon, một chương trình chạy dưới nền để tạo image và chạy các container. Pod sử dụng kiến trúc không cần daemon, có nghĩa là mọi container sẽ được chạy với quyền của user khởi tạo container đó. Docker sử dụng logic kiểu client-server với daemon làm trung gian, Podman thì không cần trung gian nào cả.

Root

Podman, bởi không sử dụng daemon để quản lý các hoạt động, do đó không cần quyền root cho các container. Docker gần đây đã có rootless mode, tuy nhiên Podman rõ ràng đã tiếp cận theo hướng này trước và là một trong những điểm cơ bản của nó. Sự khác biệt trong việc cần quyền root hay không dẫn đến điều bên dưới.

Bảo mật

Podman không yêu cầu quyền root để chạy các container. Các container này được cho là an toàn hơn so với các container cần quyền root. Với Docker, daemon cần quyền root để chạy, khiến nó có thể là một lỗ hổng bảo mật có thể bị khai thác. Tuy nhiên, cần lưu ý rằng Podman có thể chạy dưới quyền root hoặc không, còn Docker gần đây cũng đã bổ sung rootless mode.

Systemd

Không có daemon, Podman cần một công cụ khác để quản lý các service và hỗ trợ việc chạy các container. Systemd là một công cụ như thế, nó cho phép quản lý các container có sẵn cũng như tạo container mới. Systemd có thể được tích hợp với Podman để chạy các container dưới nền mặc định mà không cần thay đổi cấu hình.

Build image

Docker, với tư cách là một bộ công cụ hoàn chỉnh có thể tự build các image. Podman cần một công cụ khác (Buildah) khiến Podman trở thành một công cụ để chạy container chứ không phải để build.

Docker Swarm

Podman không hỗ trợ Docker Swarm (dù Podman hỗ trợ hầu hết các lệnh khác của Docker), điều này khiến các dự án chạy Docker Swarm bị lỗi nếu chuyển sang dùng Podman. Podman gần đây có hỗ trợ Docker Compose để làm việc với swarm, tuy chưa thật đầy đủ. Còn Docker thì không cần nói, nó hoàn toàn tương thích với Swarm.

Một công cụ vs module hóa

Đây là điểm khác biệt rất quan trọng. Docker là một công cụ thống nhất và mạnh mẽ, một công cụ độc lập xử lý tất cả thao tác liên quan đến container. Podman có cách tiếp cận dạng module, tức là nó cần đến nhiều công cụ bên ngoài cho từng công việc cụ thể.

Làm việc với Podman và Docker

Podman được nhiều người coi là sự thay thế cho Docker. Người dùng có thể alias Podman thành Docker và sử dụng các lệnh quen thuộc mà không hề có vấn đề gì. Podman có vẻ có nhiều tính năng hơn cho các công việc container nhờ cách tiếp cận module hóa.

Podman có thể thay thế Docker

Podman có thể là một lựa chọn tốt khi mà dự án mới bắt đầu. Còn với các dự án đang chạy và đã sử dụng Docker, việc chuyển sang Podman cần phải xem xét nhiều yếu tố (và thường là không đáng). Podman là công cụ Linux-native, nó yêu cầu kỹ năng Linux nhất định để sử dụng.

Lập trình viên có thể kết hợp cả hai công cụ, ví dụ sử dụng Docker trong quá trình phát triển và sau đó dùng Podman trên production, nhờ đó thu được lợi ích về bảo mật của nó. Cả hai công cụ để tương thích với OCI nên việc này thường không gây vấn đề gì về tương thích.

Docker và Podman có thể dùng song song?

Đương nhiên là được. Như đã nói ở trên, nhiều lập trình vẫn đang sử dụng Docker và Podman trong việc phát triển phần mềm (nhất là phát triển web). Hai công cụ có nhiều tính năng chung khiến việc sử dụng một trong hai hoặc kết hợp cả hai đều không gặp trở ngại gì.

Tôi xin lỗi nếu bài viết có bất kỳ typo nào. Nếu bạn nhận thấy điều gì bất thường, xin hãy cho tôi biết.

Nếu có bất điều gì muốn nói, bạn có thể liên hệ với tôi qua các mạng xã hội, tạo discussion hoặc report issue trên Github.