Chuyển đến nội dung chính
Kỹ thuật Dữ liệu
Docker

Docker vs. Podman: Công cụ đóng gói vùng chứa nào phù hợp với bạn

Khám phá điểm giống và khác nhau giữa Docker và Podman, và hiểu cách chúng vận hành phần mềm của thế giới.
Jake Roach's photo
Jake Roach
Đã cập nhật · 9 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.

Vùng chứa (container) vận hành các ứng dụng và khối lượng công việc dữ liệu của thế giới. Được hình thành từ những năm 1970, vùng chứa cung cấp một cách đóng gói mọi thứ cần thiết để chạy một ứng dụng hoặc khối lượng công việc trong một đối tượng duy nhất. Vùng chứa giúp giải quyết vấn đề “chạy được trên máy tôi” bằng cách cung cấp giải pháp cô lập và di động cho việc phát triển, kiểm thử và triển khai mã. Các công cụ như Kubernetes dựa rất nhiều vào vùng chứa như một thành phần cốt lõi trong kiến trúc của chúng. Hiện tại, vùng chứa vẫn sẽ còn ở đây lâu dài.

Để chạy các vùng chứa này, bạn sẽ cần một giải pháp quản lý vùng chứa. Và đó là lúc Docker và Podman xuất hiện.

Docker và Podman được dùng để xây dựng, quản lý và triển khai vùng chứa. Cùng nhau, chúng ta sẽ mổ xẻ các điểm tương đồng và khác biệt giữa Docker và Podman, cùng với các chức năng riêng của từng công cụ. Chúng ta sẽ khám phá các khía cạnh như kiến trúc dựa trên daemon và không dùng daemon, quản lý đa vùng chứa và tích hợp đa nền tảng. Đến cuối bài, bạn sẽ có đủ thông tin để chọn giải pháp vùng chứa hoàn hảo cho nhu cầu của mình. 

Nếu bạn mới làm quen với các công cụ này, bạn cũng có thể xem Introduction to Docker và Introduction to Podman for Machine Learning.

Podman và Docker là gì?

Hãy bắt đầu với phần tổng quan về các công cụ này để khởi động so sánh: 

Tổng quan về Docker

Docker là tiêu chuẩn mặc định để xây dựng, chạy và chuyển giao vùng chứa. Vùng chứa là các đối tượng kết hợp phụ thuộc ở cấp hệ điều hành và một số loại mã ứng dụng nhằm đóng gói và chạy những thứ như ứng dụng full-stack hoặc đường ống ETL trong môi trường riêng, cách ly. Vùng chứa giống như những “máy tính tí hon” chỉ có các thành phần thiết yếu để chạy một loại mã nào đó. 

Docker còn khá trẻ và lần đầu ra mắt dưới dạng dự án mã nguồn mở vào năm 2013. Kể từ đó, dự án đã phát triển bùng nổ.

Khi vận hành vùng chứa trong môi trường doanh nghiệp, hầu như mọi đội ngũ phần mềm và dữ liệu đều lựa chọn Docker. 

Nhà phát triển có thể chạy Docker trên ba hệ điều hành chính và nó tích hợp tốt với hầu hết công nghệ hiện đại. Điều này có nghĩa là một Data Engineer có thể viết và đóng gói một đường ống dữ liệu bằng vùng chứa Docker trên máy Mac cá nhân, rồi chuyển vùng chứa đó để chạy trên AWS ECS. 

Các công cụ như Docker CLI, Docker Desktop và Docker Hub giúp lập trình viên ở mọi trình độ dễ dàng bắt đầu. 

Nếu bạn muốn học Docker theo cách thực hành hơn, chúng tôi có nhiều dự án Docker và thông tin về chứng chỉ Docker để giúp bạn nâng tầm kỹ năng Docker!

Tổng quan về Podman

Tương tự Docker, Podman là công cụ mã nguồn mở để phát triển và quản lý vùng chứa. Podman ban đầu được Red Hat phát triển như một lựa chọn thay thế gốc Linux cho Docker và phát hành vào năm 2019. 

Điểm đáng chú ý nhất là kiến trúc nền tảng của hai trình chạy vùng chứa khác nhau; trong khi Docker tận dụng daemon, Podman vận hành theo kiểu không dùng daemon (sẽ nói thêm ở phần sau). 

Không như Docker, Podman không yêu cầu quyền root trên máy nơi các pod do nó quản lý chạy; điều này khiến Podman trở thành lựa chọn chú trọng bảo mật hơn cho các nhóm dùng vùng chứa để chạy ứng dụng và khối lượng công việc của họ.

Người dùng Podman có trải nghiệm tương tự Docker; nhà phát triển có thể dùng CLI hoặc GUI (Podman Desktop) để tương tác với Podman trong môi trường cục bộ. 

Người dùng Linux, Mac và Windows đều có thể dùng Podman để xây dựng và kiểm thử vùng chứa cục bộ trước khi triển khai lên môi trường từ xa nào đó, như Kubernetes.

Những khác biệt chính giữa Podman và Docker

Kiến trúc dùng daemon và không dùng daemon

Khác biệt lớn nhất giữa Docker và Podman nằm ở kiến trúc nền tảng mà mỗi công cụ được xây dựng. Docker phụ thuộc nhiều vào một daemon, trong khi Podman không dùng daemon. 

Bạn có thể coi daemon là một tiến trình chạy nền trên hệ điều hành máy chủ. Trong trường hợp của Docker, daemon chịu trách nhiệm quản lý các đối tượng Docker (ảnh và vùng chứa) và giao tiếp với các hệ thống khác. Để chạy daemon của mình, Docker dùng gói có tên dockerd.

Tại sao điều này quan trọng? Trước hết, daemon thường yêu cầu quyền root trên máy mà chúng chạy. Điều này có thể dẫn đến các lỗ hổng bảo mật — nếu kẻ xấu truy cập được vào daemon, họ có thể chiếm quyền trên toàn bộ máy.

Kiến trúc không dùng daemon của Podman mang lại vài lợi ích. Vì chạy daemon hầu như luôn cần đặc quyền root, kiến trúc không daemon có thể coi là “không cần root”. Điều này có nghĩa là người dùng không có quyền cấp hệ thống trên máy chạy vùng chứa vẫn có thể dùng Podman; điều này không phải lúc nào cũng đúng với Docker. 

Thay vì daemon, Podman dùng một gói Linux gọi là systemd. Vì systemd là thành phần gốc của hệ điều hành Linux, Podman thường được coi là “nhẹ” hơn Docker; người dùng Podman thường thấy thời gian khởi động vùng chứa nhanh hơn so với khi dùng Docker.

Xây dựng ảnh và vùng chứa

Bất chấp sự khác biệt cơ bản về kiến trúc, cả Docker và Podman đều có mục đích cốt lõi giống nhau — tạo và chạy ảnh (image) và vùng chứa (container). Tuy nhiên, cách tiếp cận của chúng có đôi chút khác biệt.

Với Docker, một ảnh được xây dựng bằng cách thêm các lệnh vào Dockerfile. Sau đó, thực thi lệnh như docker build. Lệnh này gọi lần lượt từng câu lệnh trong Dockerfile, và cuối cùng tạo ra một ảnh. Ảnh sau đó có thể được “chạy” thành vùng chứa. Như bạn đoán, điều này được thực hiện bằng lệnh docker run và chỉ định ID hoặc thẻ ảnh. Để xây dựng và chạy nhiều vùng chứa, chúng ta sẽ dùng một công cụ đặc biệt gọi là docker-compose, mà chúng ta sẽ khám phá ở phần sau.

Quy trình xây dựng ảnh và chạy chúng thành vùng chứa trong Podman gần như giống hệt. Thay vì Dockerfile (mặc dù tên tệp này vẫn dùng được), người dùng Podman sẽ tạo Containerfile. Cú pháp để tạo ảnh là như nhau. Khi đã thêm các lệnh phù hợp vào Containerfile, ảnh có thể được xây và chạy bằng Podman CLI.

Về cơ bản, Podman tương thích với hầu hết các thành phần của Docker. Vẫn có khác biệt lặt vặt, nhưng phần lớn, có thể thay thế Docker CLI bằng Podman CLI mà không gặp trở ngại.

Nguồn

Podman so với Docker Desktop

Docker Desktop để đơn giản hóa truy cập đa nền tảng

Có vài cách để làm việc với Docker. Những người có kinh nghiệm về phần mềm và dữ liệu thường dựa vào Docker CLI (còn gọi là Docker client) để tương tác với ảnh và vùng chứa Docker của họ. 

Tuy nhiên, còn có một cách dễ dàng hơn để bắt đầu, đó là dùng Docker Desktop. 

Docker Desktop là công cụ miễn phí dựa trên GUI, cung cấp giao diện để người dùng xây dựng và quản lý ảnh, vùng chứa chạy ứng dụng hoặc khối lượng công việc của họ. Một data engineer có thể dùng Docker Desktop để xem các ảnh hiện có trên máy và khởi tạo ảnh đó thành vùng chứa. Tương tự, một lập trình viên có thể kéo một ảnh từ Docker Hub về để bắt đầu dự án tiếp theo. 

Giao diện trực quan, dễ dùng nhưng vẫn giữ quyền kiểm soát và khả năng quan sát đầy đủ vào môi trường Docker của bạn.

Tuy nhiên, Docker Desktop không chỉ dừng ở việc xem và quản lý các đối tượng Docker.

Người dùng có thể làm những việc như quản lý (đến từng byte) tài nguyên cấp cho các đối tượng Docker, đính kèm vào một vùng chứa đang chạy, hoặc khởi chạy một cụm Kubernetes trên máy cục bộ. Người dùng Docker Desktop có thể chọn từ hàng trăm tiện ích mở rộng, hoặc bắt đầu hành trình Docker với các hướng dẫn và môi trường mẫu hữu ích. May mắn thay, Docker Desktop khả dụng rộng rãi và chạy trên Mac, Windows hoặc Linux.

Tính năng và hạn chế của Podman Desktop

Podman Desktop trông và hoạt động khá giống với đối tác Docker. Từ giao diện Podman Desktop, người dùng có thể xem và quản lý vùng chứa, ảnh, pod và volume. Tương tự Docker, Podman hỗ trợ plugin và tích hợp để thực hiện các việc như chạy cụm Red Hat OpenShift cục bộ hoặc làm việc với LLM thông qua Podman AI Lab.

Nếu bạn có một plugin tùy chỉnh muốn sử dụng, thật tuyệt — bạn có thể cài đặt nó ngay từ Podman Desktop.

Nếu bạn vừa là người dùng Docker vừa là người dùng Podman, bạn có thể ngạc nhiên khi thấy cả đối tượng Docker và Podman từ giao diện Podman Desktop. Điều này không phải ngẫu nhiên! Chúng ta sẽ xem kỹ ý nghĩa của điều này ngay sau đây. Trước mắt, điều đó có nghĩa là người dùng có thể tương tác với cả đối tượng Podman VÀ Docker qua một cửa sổ duy nhất.

Trường hợp sử dụng phổ biến nhất của vùng chứa là chạy chúng qua Kubernetes. Dù Docker là tiêu chuẩn công nghiệp cho công nghệ vùng chứa, Podman lại mang đến trải nghiệm Kubernetes mạnh mẽ hơn trên Podman Desktop. 

Khả năng xem và quản lý tài nguyên Kubernetes như node, pod, deployment (và nhiều hơn nữa) khiến việc quản trị và phát triển Kubernetes trở thành công dân hạng nhất trên Podman Desktop. Những công cụ này, cùng các plugin như tích hợp Red Hat OpenShift đã nêu, giúp Podman nổi bật như một công cụ hướng đến các tổ chức dùng Kubernetes.

Podman Compose so với Docker Compose

Định nghĩa và quản lý ứng dụng đa vùng chứa với Docker

Một số ứng dụng và khối lượng công việc có thể đóng gói trong một vùng chứa. Một số thì không. Để đơn giản hóa quản lý đa vùng chứa, Docker cung cấp công cụ Docker Compose. Docker Compose dùng một tệp YAML duy nhất để định nghĩa các thành phần của ứng dụng. 

Sau đó, dùng CLI docker-compose, các vùng chứa và dịch vụ này có thể được khởi chạy, dừng hoặc xây dựng lại. Một tệp YAML Docker Compose có thể trông như sau:

yaml
version: '3'
services:
	app:
		image: python:3.10
		container_name: app
		command: run app --host=0.0.0.0
	database:
		image: postgres:13
		container_name: database
		ports: 5432
		volumes:
			- postgres_data:/var/lib/postgresql/data
volumes:
	postgres_data

Có khá nhiều thứ, nhưng điều Docker Compose cho phép là định nghĩa một tệp YAML với hai dịch vụ và một volume. Sau đó, lệnh docker-compose up sẽ khởi chạy các vùng chứa này, và chúng ta sẽ có một ứng dụng đang chạy. 

Đối với các nhóm phần mềm và dữ liệu vận hành ứng dụng và khối lượng công việc lớn, Docker Compose giúp việc phát triển cục bộ cũng như triển khai và chạy mã trong môi trường sản xuất trở nên dễ dàng.

Cách tiếp cận của Podman với ứng dụng đa vùng chứa

Chạy ứng dụng đa vùng chứa với Podman trông và cảm nhận giống hệt khi làm việc với Docker. Podman thực hiện điều này thông qua Podman Compose. Giống Docker Compose, Podman Compose dùng các tệp YAML để định nghĩa các thành phần của ứng dụng theo cách khai báo. 

Sau đó, CLI podman-compose có thể được dùng để khởi chạy, dừng hoặc khởi động lại các dịch vụ được định nghĩa trong tệp YAML. 

Về cơ bản, podman-compose có thể thay cho docker-compose (vẫn có vài điểm không tương thích). Giống Docker, dùng Podman Compose cho phép quản lý linh hoạt và độc lập các ứng dụng đa vùng chứa.

Bên dưới là bảng so sánh Docker và Podman. 

Tính năng/Khía cạnh

Docker

Podman

Kiến trúc

Docker tận dụng daemon như một thành phần kiến trúc cốt lõi.

Kiến trúc không dùng daemon.

Bảo mật

Yêu cầu đặc quyền root để xây dựng, chạy và quản lý vùng chứa.

Bản chất không dùng daemon trong kiến trúc của Podman khiến nó trở thành công cụ quản lý vùng chứa chú trọng bảo mật hơn.

Công cụ cho người dùng

Docker Desktop, docker CLI

Podman Desktop, podman CLI

Tương thích

Windows, Mac, Linux

Gốc Linux, khả dụng cho Windows và Mac.

Mức độ phổ biến

Tiêu chuẩn công nghiệp cho điều phối vùng chứa với cộng đồng khổng lồ và khả năng tương thích gần như phổ quát.

Lựa chọn thay thế Docker với cộng đồng nhỏ hơn nhưng đang phát triển.

Trường hợp sử dụng và kịch bản phù hợp cho Podman so với Docker

Giờ hãy đi vào câu hỏi chính mà bạn có thể đang đặt ra — khi nào nên dùng Docker và khi nào nên dùng Podman? Cùng xem kỹ hơn.

Khi nào dùng Docker

Docker là tiêu chuẩn mặc định để xây dựng, chạy và chuyển giao vùng chứa. Nếu bạn mới bắt đầu với công nghệ vùng chứa (đặc biệt trên máy cá nhân), hãy thử Docker. 

Thật đơn giản để đưa vùng chứa đầu tiên (hoặc thứ năm mươi) vào hoạt động bằng các công cụ như Docker Desktop hoặc Docker CLI. Docker có cộng đồng rất lớn, và khả năng cao là điều bạn muốn làm đã có người thực hiện. Điều này giúp việc khắc phục sự cố trở nên dễ dàng hơn.

Docker mang lại tính nhất quán đa nền tảng tốt hơn Podman. Quan trọng nhất, Docker tích hợp với gần như mọi dịch vụ dựa trên vùng chứa, bao gồm AWS ECS, Azure AKS và Google Cloud Run. 

Điều này có nghĩa là khi đến lúc chạy vùng chứa trong môi trường sản xuất, bạn có thể dễ dàng tích hợp với dịch vụ mà bạn lựa chọn. Khả năng chuyển từ phát triển cục bộ sang sản xuất là một trong những lợi thế mạnh nhất của việc đóng gói mã bằng Docker.

Không chỉ các nhóm Kỹ thuật Phần mềm và Dữ liệu dùng Docker. Kỹ sư AI và ML, Nhà khoa học dữ liệu, và thậm chí cả Nhà phân tích dữ liệu cũng dùng Docker để hỗ trợ công việc!

Khi nào dùng Podman

Đối với nhà phát triển làm việc trong môi trường nhạy cảm về bảo mật hoặc chịu quy định nghiêm ngặt, Podman có thể là trình quản lý vùng chứa phù hợp. Hãy nhớ rằng, Podman là không cần root, nghĩa là người dùng chạy Podman cục bộ không cần quyền root trên máy để xây dựng và quản lý vùng chứa cục bộ. Dưới đây là vài lý do nữa khiến bạn có thể nghiêng về Podman hơn Docker.

  • Bạn phát triển cục bộ trên máy Linux.
  • Bạn coi trọng mức sử dụng tài nguyên nền tảng và thời gian khởi động vùng chứa.
  • Bạn dự định chuyển vùng chứa lên cụm Kubernetes hoặc muốn mô phỏng môi trường Kubernetes trên máy cục bộ.

Cũng cần lưu ý điều này: về cơ bản, Podman và Docker có thể hoán đổi cho nhau. Nghĩa là nếu bạn bắt đầu với Docker và nhận ra Podman phù hợp hơn, việc chuyển đổi giữa hai công cụ này khá dễ dàng.

Kết luận

Chạy vùng chứa đòi hỏi một công cụ để quản lý các đối tượng này. Cùng nhau, chúng ta đã khám phá hai công cụ vùng chứa phổ biến nhất: Docker và Podman.

Là tiêu chuẩn công nghiệp cho công nghệ vùng chứa, Docker được hàng triệu người dùng để vận hành các ứng dụng và khối lượng công việc dữ liệu trên toàn thế giới. Kiến trúc của Docker được xây dựng trên daemon Docker, vốn yêu cầu quyền root trên hệ thống nơi vùng chứa chạy. 

Để tương tác với Docker, nhà phát triển có thể dùng Docker CLI hoặc Docker Desktop, cả hai đều cho phép quản lý các thành phần như ảnh, vùng chứa và volume. Việc Docker được chấp nhận rộng rãi đồng nghĩa với cộng đồng lớn, sôi động, cũng như hỗ trợ trên cả ba hệ điều hành lớn và gần như mọi dịch vụ dựa trên vùng chứa.

Podman mang đến một giải pháp quản lý vùng chứa thay thế. Podman không dùng daemon và không cần root, nghĩa là người dùng không cần quyền root trên máy để chạy Podman. Điều này hấp dẫn với các nhóm đòi hỏi công cụ quản lý vùng chứa chú trọng bảo mật hơn. Giống Docker, Podman cung cấp cả CLI và UI để xây dựng và quản lý vùng chứa. Dù là gốc Linux, Podman vẫn có thể chạy trên Windows và Mac, và tích hợp khá tốt với các công cụ như AWS ECS và Azure AKS.

Bất kể bạn chọn công cụ nào, học cách “đóng gói vùng chứa” cho mã bạn viết là một trong những cách nhanh nhất để nâng cao kỹ năng phát triển. Nếu bạn muốn tìm hiểu thêm về Docker và Podman, đừng ngần ngại bắt tay thực hành với các khóa như Introduction to Docker hoặc Containerization and Virtualization Concepts. Chúc bạn may mắn và code vui vẻ!

Podman vs Docker FAQs

Container là gì?

Vùng chứa là một đối tượng chứa mọi thứ cần thiết để chạy một ứng dụng hoặc khối lượng công việc dữ liệu. Bạn có thể hình dung vùng chứa như những “máy tính tí hon” chỉ có các thành phần thiết yếu để chạy một loại mã nào đó. May mắn thay, chúng ta có thể chạy các vùng chứa này trên máy cục bộ cũng như trên máy chủ để đưa giải pháp ra toàn thế giới.

Tại sao tôi nên dùng vùng chứa trong dự án?

Dùng vùng chứa trong dự án cho phép bạn đóng gói mã của mình trong một đối tượng duy nhất. Tại sao điều này quan trọng? Điều đó có nghĩa là bạn có thể dễ dàng chia sẻ mã với các nhà phát triển khác hoặc thậm chí chuyển mã vào sản xuất mà không phải dựng lại toàn bộ môi trường cục bộ.

Tại sao tôi cần dùng trình quản lý vùng chứa như Docker hoặc Podman?

Để xây dựng, chạy và quản lý một vùng chứa, bạn cần dùng trình quản lý vùng chứa. Docker và Podman cung cấp các công cụ để tạo và kiểm thử vùng chứa trước khi triển khai giải pháp của bạn. Không có công cụ như Docker hoặc Podman, những tác vụ này sẽ khá khó khăn.

“Không dùng daemon” nghĩa là gì?

Daemon là một tiến trình luôn chạy nền. Không dùng daemon có nghĩa là công cụ tồn tại mà không cần luôn có một tiến trình chạy nền.

Có công cụ quản lý vùng chứa nào khác ngoài Docker hoặc Podman không?

Containerd và LXC đều là các hệ thống quản lý vùng chứa phổ biến giúp xây dựng, chạy và quản lý vùng chứa ở quy mô lớn.


Jake Roach's photo
Author
Jake Roach
LinkedIn

Jake là một kỹ sư dữ liệu chuyên xây dựng hạ tầng dữ liệu có tính bền bỉ và khả năng mở rộng cao bằng Airflow, Databricks và AWS. Jake cũng là giảng viên của khóa học Introduction to Data Pipelines và Introduction to NoSQL trên DataCamp.

Chủ đề
Kỹ thuật Dữ liệu
Docker

Các khóa học hàng đầu trên DataCamp

Khóa học

Nhập môn Docker

4 giờ
52.8K
Tìm hiểu về Docker và khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu. Tìm hiểu về Docker container, Docker image và nhiều nội dung khác.
Xem chi tiếtBắt Đầu Khóa Học

Tạo tài khoản miễn phí của bạn

Luyện tập và Lộ trình tiến trình của bạn.

Tiếp Tục Với Google
Bằng cách tiếp tục, bạn chấp nhận Điều khoản sử dụng, Chính sách bảo mật và việc dữ liệu của bạn được lưu trữ tại Hoa Kỳ.
Xem thêm
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêm