Chuyển đến nội dung chính

Podman Compose: Giải pháp thay thế Docker Compose không cần quyền root

Podman Compose là công cụ viết bằng Python, đọc các tệp Docker Compose và chạy ứng dụng đa container bằng kiến trúc không cần quyền root, không có daemon của Podman cho các môi trường phát triển chú trọng bảo mật.
· 12 phút đọc

Khám phá cùng AI

Giả sử bạn có một tệp docker-compose.yml đã chạy ổn định trong nhiều tháng. Nhưng giờ bạn được yêu cầu dùng Podman thay cho Docker và không chắc có cần chỉnh sửa tệp hay làm lại từ đầu. Môi trường phát triển cục bộ của bạn phụ thuộc vào tệp Compose đó, và xây dựng lại toàn bộ thiết lập rõ ràng không phải việc bạn có thời gian để làm ngay.

Tin tốt là Podman Compose cho phép bạn chạy các tệp Compose hiện có với Podman thay vì Docker. Đây là một lớp tương thích viết bằng Python, chuyển dịch các định nghĩa Compose của bạn thành lệnh Podman, để bạn có thể tiếp tục dùng quy trình làm việc đa container quen thuộc.

Trong bài viết này, tôi sẽ giới thiệu Podman Compose là gì, cách cài đặt, và cách chạy ứng dụng đa container đầu tiên với nó. Nếu bạn còn mới với một số khái niệm trong bài, hãy đăng ký khóa Containerization and Virtualization Concepts để nắm vững những điều cơ bản.

Podman Compose là gì?

Podman Compose là một công cụ viết bằng Python, đọc các tệp docker-compose.yml và chuyển chúng thành các lệnh Podman.

Bạn vẫn viết một tệp Docker Compose tiêu chuẩn với services, networks và volumes. Podman Compose phân tích tệp đó và chạy các lệnh podman tương đương để khởi động containers. Nó làm công việc chuyển dịch giúp bạn, để bạn không phải tự tay đổi cú pháp Compose sang lệnh CLI của Podman.

Lưu ý rằng Podman Compose không phải là bản thay thế hoàn toàn cho Docker Compose.

Nó là một lớp tương thích. Một số tính năng của Docker Compose chạy được ngay, số khác cần điều chỉnh, và một vài tính năng không hỗ trợ. Công cụ hướng tới tương thích, nhưng không sao chép mọi hành vi của Docker Compose.

Có thể hình dung thế này: Docker Compose nói chuyện trực tiếp với daemon của Docker. Podman Compose nói chuyện với CLI của Podman, và CLI này quản lý containers mà không cần daemon. Kết quả trông tương tự, nhưng cơ chế nền khác nhau.

Điều này có nghĩa bạn có thể tái sử dụng hầu hết các tệp Compose hiện có, nhưng cần hiểu rõ những điểm khác biệt sẽ xuất hiện ở đâu.

Vì sao dùng Podman Compose?

Podman Compose cho phép bạn chạy ứng dụng đa container mà không cần cài Docker.

So với Docker, bạn có containers không cần quyền root theo mặc định. Podman chạy containers mà không đòi quyền root. Nói đơn giản, rủi ro sẽ thấp hơn nếu container bị xâm nhập. Docker yêu cầu daemon chạy bằng root, ngay cả khi bạn chạy containers không cần root phía trên.

Điều này khiến Podman Compose phù hợp hơn cho môi trường ưu tiên bảo mật. Nếu bạn làm việc trên các máy chủ Linux bị khóa chặt hoặc nơi không cho phép chạy daemon cấp root, Podman Compose mang lại quy trình đa container mà bạn cần.

Nó cũng hữu ích cho phát triển và kiểm thử. Bạn có thể dựng môi trường cục bộ, thử nghiệm cấu hình container và kiểm tra tệp Compose mà không cần cài Docker. Rất lý tưởng cho triển khai gọn nhẹ nơi bạn không cần dàn nhạc điều phối đầy đủ.

Nhưng cũng cần lưu ý rằng Podman Compose không phù hợp với mọi tình huống.

Nếu bạn chạy khối lượng công việc sản xuất ở quy mô lớn, bạn sẽ muốn dùng Kubernetes hoặc Docker Swarm. Podman Compose cũng có hỗ trợ yếu hơn trên macOS và Windows so với Linux, nên trải nghiệm phát triển đa nền tảng sẽ không mượt bằng. Và nếu nhóm của bạn đã đầu tư vào hệ sinh thái Docker với plugin và công cụ tùy biến, chuyển sang Podman Compose đồng nghĩa phải xây dựng lại một phần quy trình đó.

Tóm lại, hãy dùng Podman Compose khi bạn cần containers không cần quyền root, môi trường ưu tiên bảo mật, hoặc thiết lập phát triển không phụ thuộc Docker.

Cài đặt Podman Compose

Podman Compose hoạt động tốt nhất trên Linux, nơi Podman chạy nguyên bản.

Bạn có thể cài trên macOS và Windows, nhưng cần chạy Podman trong máy ảo trước. Điều này làm tăng độ phức tạp và không mượt như trên Linux. Nếu dùng macOS hoặc Windows, hãy dự trù thêm các bước thiết lập và một số vấn đề mạng có thể phát sinh.

Cài đặt trên Linux

Cách dễ nhất để cài Podman Compose là qua pip.

pip install podman-compose

Cài đặt Podman compose trên Linux

Cài đặt Podman compose trên Linux

Lệnh này sẽ cài phiên bản mới nhất từ PyPI. Bạn không cần lo về quản lý phiên bản Python - chỉ cần có Python 3 là đủ.

Một số bản phân phối Linux cũng đóng gói Podman Compose trong kho của họ. Trên Fedora, RHEL và CentOS, bạn có thể dùng:

sudo dnf install podman-compose

Trên Ubuntu và các hệ Debian, chạy lệnh sau:

sudo apt install podman-compose

Phiên bản từ trình quản lý gói thường chậm hơn PyPI, nên bạn có thể không nhận được tính năng mới nhất ngay lập tức.

Cài đặt trên macOS và Windows

Trên macOS và Windows, trước tiên bạn cần thiết lập Podman Desktop hoặc dùng podman machine để tạo một máy ảo Linux. Khi máy ảo chạy, hãy cài Podman Compose bằng pip bên trong môi trường đó.

Vì vậy, bước đầu tiên là kết nối vào máy ảo:

podman machine ssh

SSH vào VM của Podman

SSH vào VM của Podman

Vì VM dựa trên Fedora, bạn có thể chạy lệnh này để cài Podman Compose:

sudo dnf install podman-compose

Cài đặt Podman Compose

Cài đặt Podman Compose

Quy trình hai bước này có nghĩa là bạn không chạy Podman Compose trực tiếp trên hệ điều hành máy chủ - mà chạy trong VM Linux do Podman tạo.

Xác minh cài đặt

Chạy lệnh này để kiểm tra Podman Compose đã cài đúng chưa:

podman-compose --version

Xác minh cài đặt Podman Compose

Xác minh cài đặt Podman Compose

Bạn sẽ thấy số phiên bản in ra terminal. Nếu gặp lỗi "command not found", hãy đảm bảo thư mục bin của Python nằm trong PATH của bạn.

Vậy là bạn đã sẵn sàng dùng Podman Compose.

Chạy tệp Compose với Podman Compose

Bạn đã cài Podman Compose - giờ tôi sẽ hướng dẫn chạy một ứng dụng thực tế.

Dùng tệp Docker Compose hiện có

Podman Compose đọc các tệp docker-compose.yml tiêu chuẩn. Bạn không cần đổi tên hay thay định dạng.

Đây là một ứng dụng FastAPI đơn giản được định nghĩa trong tệp Compose:

services:
  web:
    image: python:3.14-slim
    container_name: fastapi-app
    working_dir: /src
    volumes:
      - ./src:/src
    ports:
      - "8000:8000"
    command: bash -c "pip install fastapi uvicorn && uvicorn main:app --host 0.0.0.0 --port 8000"

Với mã ứng dụng trong src/main.py:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI"}

@app.get("/health")
def health_check():
    return {"status": "healthy"}

Hầu hết tính năng Docker Compose hoạt động ngay với Podman Compose. Bao gồm:

  • Kéo image và tạo container
  • Ánh xạ cổng
  • Gắn volumes (cả volumes được đặt tên và bind mounts)
  • Biến môi trường
  • Kết nối mạng cơ bản giữa các dịch vụ

Nhưng một số tính năng cần điều chỉnh. Nếu tệp Compose của bạn dùng plugin đặc thù của Docker, driver mạng tùy chỉnh hoặc tham số build nâng cao, bạn có thể sẽ phải sửa các phần đó.

Podman Compose cũng xử lý mạng khác biệt - các dịch vụ không tự động phân giải tên lẫn nhau theo cách Docker Compose làm.

Các lệnh cơ bản của Podman Compose

Giờ bạn có thể khởi động các dịch vụ bằng lệnh sau:

podman-compose up

Lệnh này kéo image, tạo container và khởi chạy mọi thứ trong tệp Compose. Thêm -d để chạy tách nền nếu bạn không muốn log hiển thị trên terminal.

Đầu ra của Podman

Đầu ra của Podman

Giờ bạn có thể mở ứng dụng trên cổng 8000 trên máy của bạn (hoặc trên máy Ubuntu từ xa như tôi đang dùng). Bạn sẽ thấy như sau:

Ứng dụng FastAPI chạy qua Podman

Ứng dụng FastAPI chạy qua Podman

Để dừng các dịch vụ đang chạy, thực hiện:

podman-compose down

Lệnh này dừng và xóa containers. Volumes sẽ được giữ lại trừ khi bạn thêm --volumes để xóa cả chúng.

Để kiểm tra log dịch vụ, chạy lệnh sau:

podman-compose logs

Thêm -f để theo dõi log thời gian thực, hoặc chỉ định tên dịch vụ để xem log của đúng container đó.

Để dọn dẹp mọi thứ, bao gồm containers, networks và volumes, chạy:

podman-compose down --volumes

Các lệnh này phản chiếu cú pháp của Docker Compose, nên nếu bạn đã quen với docker-compose, bạn sẽ thấy rất thân thuộc.

Podman Compose so với Docker Compose và các lựa chọn khác

Podman Compose và Docker Compose hướng tới cùng mục tiêu, nhưng hoạt động khác nhau ở tầng bên dưới. Để tôi giải thích.

Thực thi không cần quyền root

Docker Compose cần daemon của Docker chạy bằng quyền root. Ngay cả khi bạn cấu hình containers không cần root, bản thân daemon vẫn cần đặc quyền cao. Podman Compose chạy hoàn toàn không cần quyền root theo mặc định. Containers khởi chạy dưới người dùng của bạn, không phải một dịch vụ hệ thống, giúp giảm bề mặt tấn công và an toàn hơn trong môi trường nhiều người dùng.

Hành vi mạng

Docker Compose tạo một mạng bridge mặc định cho các dịch vụ của bạn. Containers có thể truy cập nhau bằng tên dịch vụ một cách tự động.

Podman Compose dùng mô hình mạng dựa trên pod. Tất cả containers trong tệp Compose của bạn được gom vào một pod của Podman và chia sẻ cùng namespace mạng. Điều này có nghĩa containers giao tiếp qua localhost thay vì tên dịch vụ, điều có thể gây bất ngờ cho người dùng Docker.

Nếu ứng dụng của bạn kỳ vọng kết nối đến cơ sở dữ liệu tại db:5432, bạn sẽ cần đổi thành localhost:5432 khi chạy với Podman Compose.

Gom nhóm theo pod

Docker Compose quản lý từng container riêng lẻ. Podman Compose tạo một pod, một nhóm lấy cảm hứng từ Kubernetes, nơi containers chia sẻ mạng và có thể chia sẻ lưu trữ. Mô hình pod này giúp Podman Compose tương thích với các mẫu của Kubernetes, dễ dàng hơn khi bạn muốn chuyển lên dàn điều phối sau này.

Tích hợp systemd

Podman tích hợp với systemd để quản lý containers như các dịch vụ hệ thống. Bạn có thể tạo file unit systemd từ containers đang chạy và quản lý chúng như các dịch vụ Linux khác. Docker không cung cấp tích hợp systemd gốc ở cấp độ container.

Các lựa chọn khác

Nếu Podman Compose không phù hợp với nhu cầu, bạn có các lựa chọn sau:

  • Podman nguyên bản với systemd cho phép bạn quản lý containers như dịch vụ mà không cần tệp Compose
  • Kubernetes cung cấp khả năng điều phối đầy đủ nếu bạn chạy sản xuất ở quy mô lớn, dù nặng nề hơn nhiều so với các công cụ kiểu Compose

Podman Compose nằm đâu đó giữa lệnh container đơn giản và hệ điều phối đầy đủ. Nó mang lại quy trình đa container mà không cần daemon của Docker.

Mạng và Volumes trong Podman Compose (Điểm khác biệt)

Người dùng Docker chuyển sang Podman Compose thường phàn nàn về hai điều: mạng và volumes. Phần này tôi sẽ trình bày các khác biệt.

Giao tiếp giữa các dịch vụ

Trong Docker Compose, bạn kết nối tới dịch vụ khác bằng tên dịch vụ. Nếu bạn có dịch vụ web và dịch vụ cơ sở dữ liệu tên db, ứng dụng sẽ kết nối tới db:5432.

Podman Compose gom tất cả dịch vụ vào một pod. Containers trong cùng một pod chia sẻ namespace mạng, tức là tất cả dùng localhost. Chuỗi kết nối cơ sở dữ liệu của bạn sẽ đổi từ db:5432 sang localhost:5432.

Điều này thường làm mọi người bất ngờ. Ứng dụng khởi động, cố kết nối tới db:5432 và thất bại vì hostname đó không phân giải được. Bạn sẽ cần cập nhật chuỗi kết nối hoặc biến môi trường để dùng localhost thay thế.

Mạng mặc định

Docker Compose tạo một mạng bridge cho các dịch vụ. Mỗi container có địa chỉ IP riêng trên mạng đó, và trình phân giải DNS của Docker xử lý tra cứu tên dịch vụ.

Podman Compose không tạo các mạng riêng biệt theo mặc định. Mô hình pod khiến containers chia sẻ mạng ở mức thấp hơn. Nếu bạn định nghĩa mạng tùy chỉnh trong tệp Compose, Podman Compose sẽ cố tạo chúng, nhưng hành vi có thể không khớp hoàn toàn với Docker.

Hành vi volume và bind mount

Volumes và bind mounts phần lớn hoạt động giống nhau giữa Docker Compose và Podman Compose. Bạn định nghĩa trong tệp Compose và Podman sẽ tạo chúng.

Nhưng có một điểm lưu ý về quyền truy cập.

Podman mặc định chạy không cần quyền root, nên quyền sở hữu và phân quyền tệp có thể khác. Một bind mount chạy ổn trong Docker có thể báo lỗi quyền trong Podman vì người dùng trong container không khớp UID của người dùng trên host.

Bạn cũng sẽ thấy vị trí volume khác nhau. Docker lưu volumes trong /var/lib/docker/volumes/ trong khi Podman lưu trong ~/.local/share/containers/storage/volumes/ đối với containers không cần root.

Cách khắc phục khá đơn giản nếu bạn hiểu vấn đề. Hãy điều chỉnh chuỗi kết nối cho mạng, và kiểm tra quyền tệp nếu gặp sự cố với volumes.

Giới hạn và lưu ý thường gặp

Podman Compose hoạt động tốt cho các thiết lập đa container cơ bản, nhưng có những giới hạn bạn nên biết trước khi quyết định dùng lâu dài.

Tính năng Compose không được hỗ trợ

Không phải mọi tính năng của Docker Compose đều chuyển dịch được sang Podman Compose. Các ngữ cảnh build với tham số phức tạp thường thất bại hoặc hành xử khác. Plugin và extension của Docker Compose sẽ không hoạt động. Những tính năng như truyền qua GPU, health check nâng cao và một số chế độ mạng hoặc không hỗ trợ hoặc cần giải pháp vòng vo.

Nếu tệp Compose của bạn dùng nhiều tính năng phiên bản 3.x của docker-compose.yml, hãy chuẩn bị tinh thần thử và sai.

Kỳ vọng về mạng khác Docker

Các dịch vụ không giao tiếp bằng tên dịch vụ - thay vào đó dùng localhost. Điều này làm hỏng các ứng dụng cố định tên dịch vụ trong chuỗi kết nối.

Mạng bridge tùy chỉnh không hành xử giống Docker. Phân giải DNS hoạt động khác vì mô hình pod.

Hãy dành thời gian cập nhật cấu hình và biến môi trường để phù hợp với mô hình mạng của Podman, nhưng đó chỉ là việc làm một lần.

Giới hạn nền tảng trên macOS/Windows

Podman Compose chạy tốt nhất trên Linux. Trên macOS và Windows, bạn chạy mọi thứ bên trong một VM Linux, làm tăng độ phức tạp. Đồng bộ tệp giữa host và VM có thể chậm hơn. Kết nối mạng giữa host và containers cần cấu hình bổ sung.

Nếu đội ngũ của bạn dùng máy macOS hoặc Windows để phát triển, Docker Compose thường là lựa chọn mượt mà hơn.

Độ chín muồi của công cụ và khoảng trống hệ sinh thái

Podman Compose còn trẻ hơn Docker Compose. Cộng đồng nhỏ hơn, nên tìm câu trả lời cho vấn đề cụ thể sẽ mất công hơn. Công cụ và tích hợp bên thứ ba ưu tiên Docker trước, Podman sau (nếu có). Hỗ trợ IDE và công cụ GUI thua kém hệ sinh thái Docker.

Bạn sẽ không thấy nhiều câu trả lời trên Stack Overflow hoặc issues GitHub cho vấn đề của Podman Compose.

Những hạn chế này không khiến Podman Compose không dùng được, nhưng là điều nên cân nhắc trước khi gắn bó. Người dùng Docker Compose không gặp các ma sát này.

Thực hành tốt khi dùng Podman Compose

Dưới đây là cách tránh những rắc rối thường gặp với Podman Compose.

  • Bắt đầu với tệp Compose đơn giản. Đừng di trú ngay thiết lập Docker phức tạp nhất của bạn. Bắt đầu với ứng dụng một dịch vụ, xác nhận chạy ổn, rồi thêm dần. Cách này giúp bạn cô lập vấn đề khi phát sinh.

  • Kiểm thử mạng không cần root sớm. Dựng một ứng dụng nhiều dịch vụ và xác nhận containers có thể giao tiếp qua localhost. Đổi chuỗi kết nối từ tên dịch vụ sang localhost. Nếu mạng không hoạt động như mong đợi, bạn sẽ biết ngay.

  • Rõ ràng với volumes và ports. Đừng dựa vào mặc định. Chỉ định đường dẫn đầy đủ cho bind mounts. Định nghĩa ánh xạ cổng. Thiết lập quyền tệp rõ ràng nếu bạn gắn thư mục host. Mô hình không cần root của Podman khiến các giả định từng đúng với Docker có thể thất bại ở đây.

  • Dùng Podman Compose chủ yếu cho phát triển và sản xuất gọn nhẹ. Nó xử lý tốt môi trường dev cục bộ và triển khai nhỏ. Với sản xuất quy mô lớn, bạn sẽ muốn Kubernetes hoặc nền tảng điều phối khác. Podman Compose không được thiết kế cho cụm HA hoặc service mesh phức tạp.

Kết luận

Podman Compose mang đến cách thực tế để chạy ứng dụng đa container với Podman thay vì Docker. Nó đọc các tệp Compose hiện có và chuyển thành lệnh Podman, vì vậy bạn không cần học một quy trình hoàn toàn mới. Nhưng nó không phải bản sao hoàn hảo của Docker Compose. Mạng hoạt động khác, một số tính năng không được hỗ trợ, và bạn sẽ cần điều chỉnh chuỗi kết nối và cấu hình để phù hợp với mô hình dựa trên pod của Podman.

Cuối cùng, tôi khuyến nghị bạn đọc thêm về sự khác nhau giữa Docker và Podman để hiểu rõ hơn cách tiếp cận kiến trúc và khả năng tương thích của từng bên.

Dario Radečić

Tác giả

Dario Radečić

Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

Câu hỏi thường gặp về Docker Compose

Podman Compose là gì?

Podman Compose là một công cụ viết bằng Python, đọc các tệp Docker Compose và chuyển chúng thành lệnh Podman. Nó cho phép bạn chạy ứng dụng đa container bằng Podman thay vì Docker, mang lại quy trình Compose tương tự mà không cần daemon hay đặc quyền root.

Tôi có thể dùng tệp Docker Compose với Podman Compose không?

Có, Podman Compose đọc các tệp docker-compose.yml tiêu chuẩn. Hầu hết tính năng cơ bản của Docker Compose hoạt động ngay, tuy nhiên bạn sẽ cần điều chỉnh chuỗi kết nối từ tên dịch vụ sang localhost do mô hình mạng dựa trên pod của Podman.

Khác biệt chính giữa Podman Compose và Docker Compose là gì?

Podman Compose mặc định chạy không cần quyền root và không yêu cầu daemon, trong khi Docker Compose cần daemon Docker chạy bằng root. Podman Compose cũng dùng mô hình mạng dựa trên pod, nơi containers chia sẻ localhost, còn Docker Compose gán cho mỗi dịch vụ một hostname riêng.

Vì sao các dịch vụ của tôi không kết nối được khi dùng Podman Compose?

Podman Compose đặt tất cả dịch vụ vào một pod dùng chung namespace mạng, vì thế containers giao tiếp qua localhost thay vì tên dịch vụ. Bạn sẽ cần đổi chuỗi kết nối như db:5432 thành localhost:5432 trong cấu hình ứng dụng.

Podman Compose có hoạt động trên macOS và Windows không?

Có, nhưng trước tiên bạn cần chạy Podman trong một VM Linux bằng Podman Desktop hoặc podman machine. Cách này phức tạp hơn so với Linux, nơi Podman chạy nguyên bản, và bạn có thể gặp đồng bộ tệp chậm hơn cùng một số vấn đề mạng.

Chủ đề

Liên quan