Từ cú sốc CentOS 8 EOL đến bước chuyển mình sang Podman
Khi CentOS 8 đột ngột dừng hỗ trợ (EOL), mình từng phải thức trắng đêm để chuyển đổi 5 cụm server production sang CentOS Stream 9. Trong quá trình đó, mình nhận ra Docker đã không còn là ưu tiên số một trên hệ sinh thái Red Hat. Thay vào đó, Podman được tích hợp sâu và trở thành công cụ mặc định. Ban đầu, việc thiếu vắng docker-compose khiến mình khá lúng túng. Tuy nhiên, sau khi làm chủ được Podman Compose và cơ chế Rootless, mình thấy hệ thống không chỉ nhẹ hơn mà còn bảo mật hơn hẳn.
So sánh thực tế: Docker Compose vs. Podman Compose
Sự khác biệt lớn nhất nằm ở kiến trúc vận hành. Docker dựa vào một Daemon chạy quyền root. Nếu hacker chiếm được quyền điều khiển Daemon, chúng sẽ có toàn quyền kiểm soát server của bạn. Ngược lại, Podman hoạt động theo mô hình daemonless. Mỗi container chỉ là một tiến trình người dùng bình thường.
Ưu điểm vượt trội của Podman Compose:
- Bảo mật Rootless: Bạn có thể chạy toàn bộ stack ứng dụng mà không cần
sudo. Điều này giúp giảm thiểu 90% nguy cơ leo thang đặc quyền từ container. - Tiết kiệm tài nguyên: Việc loại bỏ Daemon giúp giảm khoảng 50MB – 100MB RAM tiêu thụ tĩnh trên mỗi node.
- Tương thích SELinux: Podman tự động xử lý các nhãn bảo mật, thứ vốn là “cơn ác mộng” khi dùng Docker trên CentOS.
Tại sao Podman là lựa chọn số một cho CentOS Stream 9?
Trên CentOS Stream 9, SELinux luôn ở chế độ Enforcing. Docker thường xuyên bị chặn quyền truy cập file khi mount volume, buộc người dùng phải tắt SELinux – một hành động cực kỳ rủi ro. Podman thì ngược lại. Nó được thiết kế để hiểu và làm việc nhịp nhàng với các chính sách bảo mật của Red Hat. Thay vì phá bỏ lớp bảo vệ, Podman tận dụng nó để cô lập ứng dụng tốt hơn.
Hướng dẫn triển khai chi tiết
1. Cài đặt Podman và công cụ bổ trợ
Đầu tiên, hãy cập nhật hệ thống và cài đặt Podman cùng Python Pip. Trên CentOS Stream 9, các gói này luôn có sẵn trong kho phần mềm chính thức:
sudo dnf update -y
sudo dnf install podman python3-pip -y
Tiếp theo, cài đặt podman-compose qua pip để nhận được phiên bản mới nhất:
pip3 install podman-compose --user
Kích hoạt biến môi trường để hệ thống nhận diện lệnh:
echo 'export PATH=$PATH:$HOME/.local/bin' >> ~/.bashrc
source ~/.bashrc
2. Cấu hình quyền Rootless cho User
Để chạy container không cần root, user cần một dải ID riêng để định danh trong hệ thống. Hãy kiểm tra file cấu hình sau:
cat /etc/subuid
cat /etc/subgid
Nếu file trống, bạn hãy cấp dải ID (thường là 65536 ID) cho user bằng lệnh:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
3. Giải quyết bài toán SELinux khi Mount Volume
Đây là lỗi phổ biến nhất: Container báo lỗi “Permission Denied” dù bạn đã chmod 777. Nguyên nhân là do nhãn SELinux của thư mục host không khớp với container. Trong file docker-compose.yaml, bạn chỉ cần thêm hậu tố :Z vào sau đường dẫn volume.
Ví dụ cấu hình chạy Web Server an toàn:
version: '3.8'
services:
db:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: strong_password_here
volumes:
- ./db_data:/var/lib/mysql:Z # :Z giúp đổi nhãn sang container_file_t
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:Z
depends_on:
- db
4. Quản lý ứng dụng
Khởi động toàn bộ stack bằng lệnh quen thuộc:
podman-compose up -d
Để kiểm tra trạng thái các container đang chạy dưới quyền user:
podman ps
Kinh nghiệm xử lý Port thấp (80, 443)
Ở chế độ rootless, bạn không thể bind trực tiếp vào các port dưới 1024. Thay vì chạy quyền root, mình thường bind ứng dụng vào port cao (như 8080) rồi dùng firewalld để chuyển hướng traffic. Cách này vừa đảm bảo an toàn, vừa giúp hệ thống đạt chuẩn bảo mật khắt khe.
Lệnh forward port 80 về 8080:
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload
Chuyển từ Docker sang Podman có thể khiến bạn mất chút thời gian làm quen ban đầu. Tuy nhiên, sự ổn định và tính bảo mật mà nó mang lại cho CentOS Stream 9 là hoàn toàn xứng đáng. Chúc các bạn cấu hình thành công!

