Thay thế Docker Compose: Quản lý Container HomeLab bằng Podman Quadlets

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Chuyển dịch từ Docker Compose sang các dịch vụ Systemd gốc

Docker Compose từng là công cụ đắc lực của tôi trong nhiều năm. Nó đơn giản, cú pháp YAML trực quan và hoạt động rất hiệu quả. Tuy nhiên, khi hệ thống lab của tôi mở rộng lên hơn 15 dịch vụ, tôi đã gặp phải những giới hạn. Việc quản lý Docker như một daemon ở cấp root tạo ra những rủi ro bảo mật không đáng có. Tệ hơn nữa, việc đảm bảo các container khởi động đúng thứ tự sau khi mất điện thường đòi hỏi các đoạn mã shell thiếu ổn định và các lệnh “sleep”.

Cuối cùng, tôi đã chuyển sang Podman và “vũ khí bí mật” của nó: Quadlets. Khác với Docker, Podman không cần daemon (daemonless). Nó cực kỳ xuất sắc trong việc chạy các container “rootless”, nghĩa là các dịch vụ của bạn chạy dưới một tài khoản người dùng tiêu chuẩn mà không cần quyền quản trị. Quadlets đơn giản hóa việc này bằng cách cho phép bạn định nghĩa các container bằng cú pháp mà Systemd có thể hiểu một cách tự nhiên. Bạn chỉ cần viết một file cấu hình ngắn gọn, và Systemd sẽ đảm nhận các công việc nặng nhọc—từ ghi nhật ký (logging), tự động khởi chạy, cho đến ánh xạ các phụ thuộc phức tạp.

Sau khi áp dụng giải pháp này vào hệ thống của mình, sự ổn định đã đến ngay lập tức. Thời gian khởi động Raspberry Pi 4 của tôi đã giảm gần 15 giây vì Systemd thực hiện song song hóa việc khởi động dịch vụ hiệu quả hơn nhiều so với Docker daemon. Việc tích hợp với các công cụ giám sát Linux tiêu chuẩn giờ đây cũng trở nên liền mạch.

Cài đặt Podman trên hệ thống của bạn

Hầu hết các bản phân phối Linux hiện đại đều bao gồm Podman trong kho lưu trữ chính thức. Nếu bạn đang sử dụng Ubuntu 22.04, Fedora hoặc Debian, bạn đã sẵn sàng để bắt đầu. Tôi khuyên bạn nên sử dụng Podman phiên bản 4.4 trở lên. Phiên bản này, được phát hành vào đầu năm 2023, đã mang lại những cập nhật quan trọng về độ ổn định cho Quadlets.

# Cho Ubuntu/Debian
sudo apt update
sudo apt install podman -y

# Cho Fedora
sudo dnf install podman -y

Kiểm tra phiên bản sau khi quá trình cài đặt hoàn tất:

podman --version

Để chạy container theo “phong cách HomeLab” (không dùng quyền root), hãy xác minh rằng người dùng của bạn có dải subuid và subgid. Các dải này cho phép Podman ánh xạ người dùng bên trong container sang các ID cụ thể trên máy chủ mà không bị trùng lặp với người dùng hệ thống.

cat /etc/subuid
cat /etc/subgid

Nếu kết quả hiển thị tên người dùng của bạn theo sau là một dải như 100000:65536, môi trường của bạn đã được cấu hình đúng.

Chuyển đổi Docker Compose sang file Quadlet

Trong thiết lập Docker Compose, bạn thường dựa vào file docker-compose.yml. Với Quadlets, chúng ta chuyển sang các file .container. Hãy xem xét một cấu hình máy chủ web Nginx tiêu chuẩn với một volume lưu trữ dữ liệu.

Cấu hình Compose cơ bản

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:Z
    restart: always

Cấu hình Quadlet tương đương: nginx.container

Các file Quadlet rootless nằm trong thư mục ~/.config/containers/systemd/. Hãy tạo thư mục đó và thêm một file có tên nginx.container:

[Unit]
Description=Máy chủ Web Nginx
After=network-online.target

[Container]
Image=docker.io/library/nginx:latest
PublishPort=8080:80
Volume=%h/html:/usr/share/nginx/html:Z

[Install]
WantedBy=default.target

Phần [Container] kết hợp logic của Systemd với các đối số của Podman. Tôi đã sử dụng biến định danh %h ở đây, nó sẽ trỏ động đến thư mục home của bạn. Điều này giúp các file cấu hình có thể di chuyển linh hoạt giữa các tài khoản người dùng khác nhau. Nếu bạn sử dụng Fedora hoặc RHEL, cờ :Z là cực kỳ quan trọng; nó yêu cầu SELinux dán lại nhãn (relabel) các file để container thực sự có thể đọc được chúng.

Quản lý Network và Volume

Đôi khi bạn cần các mạng cô lập để tách biệt cơ sở dữ liệu khỏi internet công cộng. Bạn có thể định nghĩa các mạng chúng bằng các file .network. Đối với một mạng backend, hãy tạo file db-net.network:

[Network]
NetworkName=backend-network

Liên kết nó với dịch vụ của bạn bằng cách thêm Network=db-net.network vào bên trong file .container. Cách làm này rất sạch sẽ và mang tính module.

Chạy và giám sát các dịch vụ mới

Quy trình làm việc ở đây có một chút thay đổi. Bạn không còn sử dụng podman run một cách thủ công nữa. Thay vào đó, bạn yêu cầu Systemd xử lý các file Quadlet và tạo ra các đơn vị dịch vụ chạy ngầm.

Tải lại daemon người dùng để ghi nhận các thay đổi:

systemctl --user daemon-reload

Bây giờ nginx.container của bạn đã là một dịch vụ tiêu chuẩn. Bạn có thể điều khiển nó bằng các lệnh tương tự như bất kỳ tiến trình Linux nào khác:

# Khởi chạy container
systemctl --user start nginx

# Thiết lập tự động khởi chạy cùng hệ thống
systemctl --user enable nginx

# Kiểm tra xem dịch vụ có đang chạy không
systemctl --user status nginx

Việc quản lý nhật ký tập trung là lợi ích lớn nhất. Vì đây là các đơn vị gốc, tất cả nhật ký sẽ chảy trực tiếp vào journald. Bạn không cần các lệnh Docker riêng biệt để xem điều gì đã xảy ra. Chỉ cần sử dụng journalctl:

journalctl --user -u nginx -f

Duy trì dịch vụ luôn hoạt động

Các dịch vụ rootless thường sẽ dừng khi bạn thoát khỏi phiên SSH. Để giữ cho HomeLab của bạn hoạt động 24/7, bạn phải bật tính năng “lingering” cho tài khoản người dùng của mình. Điều này cho phép thực thể Systemd của người dùng khởi động cùng hệ thống và duy trì hoạt động.

loginctl enable-linger $USER

Kiểm tra và xử lý sự cố

Nếu một dịch vụ bị lỗi, hãy kiểm tra file unit được tạo ra trước tiên. Quadlet chuyển đổi cấu hình cấp cao của bạn thành một unit Systemd thực thụ nằm trong /run/user/1000/systemd/generator/. Để xem trước kết quả chuyển đổi mà không áp dụng nó, hãy sử dụng công cụ dry-run:

/usr/libexec/podman/quadlet -dryrun -user

Lệnh này là “cứu cánh” để phát hiện các lỗi cú pháp hoặc đường dẫn file bị hỏng trước khi chúng gây ra rắc rối. Để theo dõi tài nguyên trong thời gian thực, lệnh podman stats vẫn cung cấp cái nhìn nhanh về mức sử dụng CPU và RAM trên tất cả các container đang chạy.

Việc chuyển sang Quadlets giúp coi các container của bạn như các dịch vụ gốc của hệ điều hành. Bạn nhận được khả năng quản lý phụ thuộc mạnh mẽ của Systemd—chẳng hạn như đảm bảo ứng dụng của bạn đợi cơ sở dữ liệu sẵn sàng—kết hợp với kiến trúc bảo mật của Podman. Đây là một sự nâng cấp chuyên nghiệp giúp bất kỳ HomeLab nào cũng trở nên kiên cố hơn đáng kể.

Share: