Hướng Dẫn Chuyển Đổi Từ Docker Sang Podman Trên Fedora: An Toàn Hơn, Hiệu Quả Hơn Cho Dev

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Giới Thiệu: Container Hóa, Bước Tiến Của Phát Triển Phần Mềm

Container đã trở thành công nghệ quan trọng trong phát triển và vận hành phần mềm ngày nay. Chúng giúp đóng gói ứng dụng cùng mọi thứ cần thiết, đảm bảo môi trường nhất quán từ máy phát triển đến môi trường production.

Docker là cái tên quen thuộc, gần như là tiêu chuẩn công nghiệp khi nhắc đến container. Tuy nhiên, trên Fedora, có một lựa chọn khác đáng cân nhắc, thậm chí được ưu tiên hơn: Podman.

Tôi đã sử dụng Fedora làm máy phát triển chính trong hai năm. Rất hài lòng với tốc độ cập nhật gói cũng như sự ổn định của nó. Trong thời gian đó, tôi cũng có dịp thử nhiều công nghệ container khác nhau, và Podman thực sự nổi bật. Với người dùng Fedora muốn tối ưu hóa môi trường phát triển, việc chuyển sang Podman là một lựa chọn hợp lý.

Bài viết này sẽ cùng bạn khám phá sự khác biệt giữa Docker và Podman, những lợi ích khi dùng Podman trên Fedora, và quan trọng nhất, hướng dẫn từng bước để chuyển đổi mượt mà.

Container Runtime: Docker và Podman – Hai Cách Tiếp Cận Khác Nhau

Cả Docker và Podman đều cho phép tạo và quản lý container, nhưng kiến trúc bên trong của chúng khác biệt đáng kể. Nắm rõ điều này sẽ giúp bạn chọn công cụ phù hợp với nhu cầu.

Docker: Kiến Trúc Client-Server Truyền Thống Với Daemon Root

Kiến trúc Docker sử dụng một daemon (dockerd) chạy ngầm với quyền root. Daemon này chịu trách nhiệm quản lý mọi thứ liên quan đến container: image, network và volumes.

Khi chạy lệnh docker run, bạn đang tương tác với Docker client. Client này gửi yêu cầu đến dockerd qua API, và daemon sẽ thực hiện việc tạo cũng như chạy container.

# Cấu trúc của Docker
+-----------------------+
|    Docker Client      |
| (e.g., docker run)    |
+-----------+-----------+
            |
            |  API Calls
            |
+-----------v-----------+
|    Docker Daemon      |
| (runs as root, manages|
|  all containers)      |
+-----------------------+
            |
            | Container Operations
            |
+-----------v-----------+
|  Container Runtime    |
|   (e.g., containerd)  |
+-----------------------+

Việc dockerd luôn chạy với quyền root mang lại tiện lợi nhưng tiềm ẩn rủi ro bảo mật lớn. Nếu daemon bị tấn công, kẻ xấu có thể giành quyền kiểm soát toàn bộ hệ thống.

Podman: Container Không Cần Daemon, Linh Hoạt Hơn

Podman (POD MANager) được thiết kế theo triết lý không cần daemon. Khi chạy một container, Podman khởi tạo nó trực tiếp như một tiến trình con của chính bạn, không thông qua dịch vụ nền chạy root.

# Cấu trúc của Podman
+-----------------------+
|    Podman Client      |
| (e.g., podman run)    |
+-----------+-----------+
            |
            |  Direct System Calls
            |
+-----------v-----------+
|   Your User Process   |
| (manages its own pods |
|  and containers)      |
+-----------------------+
            |
            | Container Operations
            |
+-----------v-----------+
|  Container Runtime    |
|   (e.g., runc, crun)  |
+-----------------------+

Mỗi container Podman chạy dưới quyền người dùng gọi lệnh, còn gọi là Rootless Containers. Đây là lợi thế bảo mật đáng kể, vì nó giới hạn phạm vi tác động của container trong tài khoản người dùng đó.

Điều thú vị là Podman có thể sử dụng gần như y hệt các lệnh Docker. Nhờ đó, việc chuyển đổi trở nên rất dễ dàng.

Tại Sao Nên Cân Nhắc Chuyển Từ Docker Sang Podman trên Fedora?

Mặc dù Docker vẫn là một công cụ rất tốt, nhưng trên Fedora, Podman mang lại những lợi ích đáng kể mà bạn nên xem xét.

Ưu Điểm Nổi Bật Của Podman

  • Bảo Mật Vượt Trội Với Rootless Containers: Đây là ưu điểm lớn nhất của Podman. Không có daemon chạy root giúp giảm thiểu rủi ro bảo mật đáng kể. Các container chạy dưới quyền người dùng thông thường sẽ không thể truy cập hay phá hoại các phần quan trọng của hệ thống khi bị xâm nhập.

    Ví dụ: Nếu một ứng dụng trong container bị khai thác, kẻ tấn công chỉ có quyền hạn như người dùng hiện tại, không thể leo thang đặc quyền lên toàn hệ thống.

    # Ví dụ chạy container rootless
    podman run --rm docker.io/hello-world
    
    # Kiểm tra user ID bên trong container (thường là 0, nhưng bên ngoài là user của bạn)
    podman run --rm alpine id
    # uid=0(root) gid=0(root) groups=0(root)  <-- bên trong container
    # Tuy nhiên, ánh xạ ra bên ngoài, nó là user ID của bạn
  • Tích Hợp Tốt Với Hệ Sinh Thái Linux: Podman do Red Hat, công ty phát triển Fedora, tạo ra. Nó tích hợp chặt chẽ với các công nghệ nền tảng Linux như systemd (quản lý dịch vụ) và SELinux (tăng cường bảo mật). Nhờ đó, hệ thống hoạt động mượt mà và an toàn.

  • Tương Thích Lệnh Docker: Để hỗ trợ người dùng chuyển đổi dễ dàng, Podman có CLI tương thích với Docker. Hầu hết các lệnh docker đều có thể thay thế trực tiếp bằng podman mà không cần thay đổi.

  • Quản Lý Tài Nguyên Hiệu Quả Hơn: Podman không có daemon chạy nền liên tục. Nó chỉ tiêu tốn tài nguyên khi container hoạt động. Nhờ đó, máy bạn có thể tiết kiệm RAM và CPU hơn khi không có container nào chạy.

Một Vài Nhược Điểm Cần Lưu Ý

  • Hệ Sinh Thái Công Cụ: Docker có lịch sử lâu hơn, nên sở hữu hệ sinh thái công cụ và tích hợp bên thứ ba rộng lớn. Docker Compose đặc biệt phổ biến trong việc định nghĩa và chạy các ứng dụng đa container.

    Dù vậy, Podman cũng có các giải pháp thay thế. Ví dụ: podman-compose hoặc khả năng tạo file Kubernetes YAML từ container.

  • Đường Cong Học Hỏi Nhỏ: Dù có khả năng tương thích lệnh cao, vẫn tồn tại vài điểm khác biệt nhỏ. Bạn sẽ cần tìm hiểu cách Podman xử lý networking hoặc volumes với rootless containers. Tuy nhiên, nhìn chung, quá trình chuyển đổi khá thuận lợi.

Fedora và Podman: Sự Kết Hợp Tự Nhiên

Với tôi, việc Fedora ưu ái Podman đã là một tín hiệu rõ ràng. Là một dev dùng Fedora, tôi thấy việc này rất hợp lý, vừa tăng bảo mật, vừa tối ưu hệ thống.

Từ Fedora 31, Podman đã thay thế Docker làm container runtime mặc định trong tài liệu và khuyến nghị. Gói podman-docker cũng có sẵn để tạo một symlink docker trỏ đến podman, giúp việc chuyển đổi gần như trong suốt.

# Kiểm tra xem symlink 'docker' đã trỏ đến 'podman' chưa sau khi cài podman-docker
ls -l /usr/bin/docker

Sự kết hợp này không chỉ dừng lại ở bảo mật. Nó còn kiến tạo một hệ sinh thái đồng nhất, nơi các công cụ được thiết kế để làm việc hiệu quả cùng nhau trên một trong những bản phân phối Linux hiện đại và tiên tiến nhất.

Hướng Dẫn Chuyển Đổi Từ Docker Sang Podman trên Fedora

Bây giờ, chúng ta sẽ bắt tay vào việc. Quá trình này khá đơn giản, ngay cả khi bạn chưa từng dùng Podman.

Bước 1: Kiểm Tra và Gỡ Bỏ Docker (Nếu Đã Cài)

Nếu Docker đang chạy trên hệ thống, hãy gỡ bỏ nó để tránh xung đột và giải phóng tài nguyên. Nếu chưa từng cài Docker, bạn có thể bỏ qua bước này.

# Dừng Docker daemon
sudo systemctl stop docker

# Vô hiệu hóa Docker khỏi khởi động cùng hệ thống
sudo systemctl disable docker

# Gỡ bỏ các gói Docker
# (Tùy thuộc vào cách bạn cài đặt Docker, các gói có thể khác nhau)
sudo dnf remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Xóa các cấu hình, images, volumes còn sót lại (TÙY CHỌN, CẨN THẬN TRƯỚC KHI THỰC HIỆN)
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker

Bước 2: Cài Đặt Podman và Các Công Cụ Hỗ Trợ

Đây là phần quan trọng nhất. Podman đã có sẵn trong repository chính thức của Fedora, nên việc cài đặt rất dễ dàng.

# Cài đặt Podman
sudo dnf install podman

# Kiểm tra phiên bản Podman đã cài đặt
podman --version

# Cài đặt podman-docker để có symlink 'docker' trỏ đến 'podman'
# Điều này giúp bạn không cần sửa các script hoặc thói quen gõ lệnh cũ
sudo dnf install podman-docker

# Kiểm tra xem lệnh 'docker' đã hoạt động với Podman chưa
docker --version

# (Tùy chọn) Nếu bạn dùng Docker Compose, hãy cài podman-compose
# Nó cố gắng bắt chước hành vi của Docker Compose
sudo dnf install podman-compose

Bước 3: Cấu Hình Rootless Containers (Quan Trọng)

Để tận dụng tối đa lợi thế bảo mật của Podman, cần đảm bảo rootless containers hoạt động chính xác. Podman cần biết user của bạn có thể sử dụng dải UID/GID ảo nào để chạy container.

Fedora thường cấu hình sẵn /etc/subuid/etc/subgid cho mỗi user. Bạn có thể kiểm tra:

grep $(whoami) /etc/subuid /etc/subgid

Output sẽ tương tự như:

/etc/subuid:yourusername:100000:65536
/etc/subgid:yourusername:100000:65536

Nếu không có, bạn có thể tự thêm vào hoặc kiểm tra lại việc cài đặt Podman.

Để các container rootless của bạn tiếp tục chạy sau khi logout, bạn cần bật tính năng linger cho user của mình. Tính năng này giúp các process của user chạy ngầm ngay cả khi không có session hoạt động.

loginctl enable-linger $(whoami)

# Bạn có thể kiểm tra trạng thái linger
loginctl show-user $(whoami) | grep Linger
# Output sẽ là: Linger=yes

Cuối cùng, khởi tạo hoặc kiểm tra môi trường Podman của bạn:

# Khởi tạo user-level storage cho Podman (nếu lần đầu chạy)
podman system migrate

# Kiểm tra thông tin môi trường Podman (bao gồm trạng thái rootless)
podman info --debug

Bước 4: Chuyển Đổi Các Lệnh Từ Docker Sang Podman

Đây là phần dễ nhất! Nhờ có gói podman-docker, hầu hết các lệnh của bạn sẽ hoạt động ngay lập tức.

  • Chạy Container:

    # Thay thế:
    docker run -p 8080:80 --name mynginx -d nginx
    
    # Bằng:
    podman run -p 8080:80 --name mynginx -d nginx
    

    Nếu bạn đã cài podman-docker, bạn vẫn có thể gõ docker run ... và nó sẽ tự động được chuyển hướng sang Podman. Cá nhân tôi thì thích gõ podman cho rõ ràng hơn.

  • Build Image:

    # Thay thế:
    docker build -t myapp:latest .
    
    # Bằng:
    podman build -t myapp:latest .
    
  • Quản lý Image, Container, Network, Volume: Các lệnh tương tự như images, ps, network, volume cũng hoạt động tương tự.

    podman ps
    podman images
    podman network ls
    
  • Docker Compose (thay thế bằng Podman Compose):

    Nếu bạn có file docker-compose.yaml, bạn có thể dùng podman-compose (sau khi đã cài ở Bước 2).

    # Thay thế:
    docker-compose up -d
    
    # Bằng:
    podman-compose up -d
    

    Lưu ý: podman-compose không phải là công cụ chính thức của Podman và có thể không tương thích 100% với mọi tính năng phức tạp của Docker Compose. Với tôi, phần lớn các trường hợp cơ bản nó đều xử lý tốt.

Những Lưu Ý Quan Trọng Khi Dùng Podman

Volumes và Quyền Hạn Trong Rootless Containers

Khi chạy rootless container, các volume bạn map vào container sẽ sử dụng quyền của người dùng hiện tại trên host. Điều này có nghĩa là container không thể tự ý ghi vào các thư mục mà người dùng của bạn không có quyền ghi. Đây là một lớp bảo mật hữu ích, nhưng đôi khi bạn cần điều chỉnh quyền trên host nếu gặp lỗi.

Networking và Podman

Podman quản lý networking cho rootless containers hơi khác một chút so với Docker mặc định. Mặc dù nó vẫn cung cấp các tính năng tương tự, bạn có thể cần tìm hiểu thêm về cách tạo và quản lý custom networks với podman network createpodman network connect nếu dự án của bạn có yêu cầu networking phức tạp.

Tích Hợp Với Systemd: Chạy Container Như Dịch Vụ

Một trong những điểm mạnh của Podman trên Fedora là khả năng tích hợp sâu với systemd. Bạn có thể dễ dàng tạo ra một unit file của systemd để quản lý container như một dịch vụ hệ thống thông thường. Điều này rất tiện lợi cho các ứng dụng cần chạy liên tục hoặc khởi động cùng hệ thống.

# Chạy một container ví dụ
podman run --name myapp-container -d nginx

# Tạo systemd unit file từ container đang chạy
podman generate systemd --name myapp-container --new --files
# Lệnh này sẽ tạo ra 2 file: myapp-container.service và myapp-container-init.service
# Chúng thường được tạo trong thư mục ~/.config/systemd/user/

# Bật và khởi động dịch vụ (chạy dưới quyền user)
systemctl --user enable myapp-container.service
systemctl --user start myapp-container.service

# Kiểm tra trạng thái
systemctl --user status myapp-container.service

Với cách này, container của bạn sẽ được quản lý bởi systemd, tự động khởi động khi máy boot hoặc khi user login (nếu đã bật linger).

Thay Thế Docker Compose Bằng Kubernetes YAML

Nếu podman-compose không đáp ứng đủ nhu cầu, hoặc bạn muốn làm quen với Kubernetes, Podman có một tính năng rất mạnh: tạo file Kubernetes YAML từ các Pod và Container của nó.

# Tạo một pod chứa nhiều container (ví dụ: web + db)
podman pod create --name mypod -p 80:80
podman run -d --pod mypod --name myweb nginx
podman run -d --pod mypod --name mydb postgres

# Tạo file Kubernetes YAML từ pod này
podman generate kube mypod > myapp.yaml

# Sau đó, bạn có thể dùng 'podman play kube' để chạy lại từ file YAML
podman play kube myapp.yaml

Đây là một cầu nối tuyệt vời để chuyển từ môi trường phát triển cục bộ sang Kubernetes mà không cần học quá nhiều công cụ mới cùng một lúc.

Kết Luận

Việc chuyển từ Docker sang Podman trên Fedora không chỉ là thay đổi công cụ. Nó còn là bước nâng cấp về bảo mật và hiệu quả làm việc, đặc biệt với kiến trúc rootless container cùng sự tích hợp sâu với hệ thống.

Mặc dù có thể có một vài điểm nhỏ cần điều chỉnh, nhưng sự tương thích lệnh cao và những lợi ích mà Podman mang lại trên Fedora là rất đáng giá. Tôi tin rằng, một khi đã làm quen, bạn sẽ thấy Podman không chỉ là một sự thay thế xứng đáng, mà còn là một bước tiến về bảo mật và tích hợp hệ thống. Hãy thử trải nghiệm Podman trên máy Fedora của bạn, và bạn sẽ thấy sự khác biệt.

Share: