Cài Docker Engine trên CentOS Stream 9: ‘Trị’ triệt để lỗi SELinux và Xung đột Podman

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Khi Docker và CentOS Stream 9 ‘lệch pha’ nhau

Vừa nâng cấp server từ CentOS 7 lên Stream 9, mình đã “ăn hành” ngay lập tức. Hệ thống CI/CD báo lỗi liên tục khi deploy. Dev than phiền: “Máy em chạy Mac vẫn ngon mà anh?”. Kiểm tra log, mình thấy Docker không thể khởi động. Tệ hơn, container chạy được nhưng lại không ghi được log vào volume do bị SELinux chặn đứng.

Câu chuyện này cực kỳ phổ biến khi các doanh nghiệp migrate sang RHEL-based distro mới. Hiện tại, Red Hat đang ưu tiên Podman. Nếu bạn vẫn muốn dùng Docker Engine chính chủ, việc cài đặt không còn đơn giản là yum install docker như trước. Bạn sẽ phải đối mặt với các rào cản về repo và cơ chế bảo mật mới của nhân Linux.

Tại sao Docker vẫn cần thiết trên CentOS Stream 9?

Podman rất mạnh mẽ và bảo mật. Tuy nhiên, Docker vẫn giữ vị thế riêng nhờ hệ sinh thái Docker Swarm và Docker Compose đã quá lâu đời. Đội ngũ developer thường đã quen tay với workflow của Docker. Việc thay đổi sang Podman có thể gây trễ tiến độ dự án hoặc làm hỏng các script automation cũ.

Rào cản lớn nhất là sự xung đột giữa Docker và các package podman, buildah có sẵn. Nếu không dọn dẹp kỹ, hệ thống sẽ báo lỗi dependency Error: Transaction test error. Điều này dẫn đến tình trạng treo service cực kỳ khó chịu trên môi trường production.

Bước 1: Quét sạch các package gây xung đột

Trước khi cài đặt, bạn cần dọn sạch “chiến trường”. CentOS Stream 9 mặc định cài sẵn Podman. Docker Engine sẽ không thể hoạt động ổn định nếu các thành phần này còn tồn tại.

sudo dnf remove -y podman buildah skopeo runc

Lệnh này đảm bảo rằng khi bạn gõ docker, hệ thống sẽ gọi đúng Docker daemon. Bạn sẽ tránh được tình trạng các alias của Podman gây nhầm lẫn trong quá trình vận hành.

Bước 2: Thiết lập Repository chuẩn từ Docker Inc

Đừng dùng repo mặc định của OS nếu bạn cần sự ổn định cho production. Hãy trỏ thẳng về server của Docker Inc. Đầu tiên, hãy cài công cụ quản lý repo:

sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Nhiều bạn thắc mắc vì sao file repo vẫn để đường dẫn /linux/centos/. Đừng lo, nó tương thích 100% với CentOS Stream 9. Mình đã test trên cụm 10 server và chưa gặp lỗi mismatch nào.

Bước 3: Cài đặt Docker Engine

Bây giờ là lúc cài đặt “bộ sậu” gồm Engine, CLI và Runtime. Đây là những thành phần cốt lõi để container có thể thực thi.

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Mẹo nhỏ: Nếu dnf báo lỗi về package runc, hãy thêm flag --allowerasing. Nó sẽ giúp dnf tự động gỡ bỏ các bản build cũ để nhường chỗ cho bản chuẩn từ Docker.

Bước 4: Cấu hình Systemd để tự cứu hộ

Trên CentOS Stream 9, quản lý service qua systemd là tiêu chuẩn bắt buộc. Bạn nên cấu hình Docker tự khởi động. Việc này giúp hệ thống tự phục hồi sau khi reboot, tránh cảnh server online mà service vẫn “ngỏm”.

sudo systemctl enable --now docker

Hãy kiểm tra lại bằng lệnh sudo systemctl status docker. Nếu thấy dòng active (running) màu xanh, bạn đã đi được 80% chặng đường.

Bước 5: Xử lý SELinux – Đừng tắt, hãy cấu hình đúng

Nhiều Sysadmin thường chọn cách setenforce 0 để Docker chạy nhanh. Đây là sai lầm chết người về bảo mật. Khi bạn mount một thư mục từ host vào container, SELinux sẽ báo lỗi Permission Denied ngay lập tức.

Thay vì tắt SELinux, hãy dùng cờ :Z khi mount volume. Đây là cách làm chuyên nghiệp và an toàn nhất.

# Chạy Nginx với SELinux label chuẩn
docker run -d \
  --name my-web \
  -v /opt/data:/usr/share/nginx/html:Z \
  nginx

Hậu tố :Z yêu cầu Docker tự động gán lại nhãn (label) SELinux cho thư mục host. Nhờ đó, container có quyền đọc/ghi mà không làm hỏng lớp phòng thủ của hệ điều hành.

Bước 6: Cấp quyền cho User (Tùy chọn)

Để không phải gõ sudo liên tục, bạn có thể thêm user vào group docker. Tuy nhiên, hãy cẩn thận. User trong group này có quyền hạn tương đương root trên hệ thống.

sudo usermod -aG docker $USER
newgrp docker

Kiểm tra kết quả cuối cùng

Hãy chạy thử container “hello-world” để chốt hạ quá trình cài đặt:

docker run hello-world

Nếu thấy thông báo “Hello from Docker!”, nghĩa là mọi thứ đã thông suốt. Docker đã cài đúng, Systemd quản lý tốt và SELinux không còn chặn quyền truy cập nữa.

Kinh nghiệm thực tế từ phòng máy

Cài Docker trên CentOS Stream 9 không khó, cái khó là để nó “sống chung” với các cơ chế bảo mật của RHEL. Qua nhiều đợt migrate, mình rút ra bài học: Luôn tôn trọng SELinux. Đừng bao giờ tắt nó đi chỉ để giải quyết vấn đề tạm thời.

Nếu bạn quản lý hàng chục server, hãy đóng gói các lệnh trên vào một file Bash script hoặc Ansible playbook. Chúc các bạn cấu hình thành công và có những đêm trực server yên bình!

Share: