Hướng dẫn sử dụng Podman, Dockerfile và Ubuntu: Quản lý container hiện đại cho lập trình viên

目次

1. Giới thiệu

Sự phát triển của công nghệ container và lý do được quan tâm

Gần đây, công nghệ container ngày càng trở nên quan trọng trong phát triển và vận hành ứng dụng. Đặc biệt, việc đồng nhất môi trường phát triển với môi trường production giúp đảm bảo tính nhất quán khi chạy ứng dụng, điều này nhận được sự ủng hộ lớn từ nhiều kỹ sư.

Trong số đó, Docker là công cụ tiêu biểu, nhưng gần đây Podman đang thu hút sự chú ý như một lựa chọn thay thế. Podman cung cấp CLI (giao diện dòng lệnh) gần như giống hệt Docker, đồng thời nổi bật với tính năng không cần daemon, nhẹkhông cần quyền root (rootless).

Tại sao chọn “Podman + Dockerfile + Ubuntu”?

Bài viết này kết hợp ba yếu tố: Podman, DockerfileUbuntu để giải thích cách vận hành container hiện đại trên môi trường Linux.

  • Ubuntu là bản phân phối Linux phổ biến, dễ sử dụng cho cả người mới và chuyên gia,
  • Dockerfile như bản thiết kế để xây dựng image container,
  • Và Podman là công cụ thế hệ mới giúp quản lý container linh hoạt và bảo mật hơn.

Đặc biệt, cùng với ý thức bảo mật ngày càng cao, việc sử dụng Podman trên Ubuntu với Dockerfile đang được áp dụng rộng rãi trong cả phát triển cá nhân và doanh nghiệp.

Mục đích và đối tượng của bài viết

Mục tiêu của bài viết là hướng dẫn chi tiết từng bước tạo container thực tế bằng cách build Dockerfile với Podman trên Ubuntu.

Đối tượng đọc giả được giả định gồm:

  • Người có kinh nghiệm Docker, muốn tìm hiểu về Podman
  • Người dùng Ubuntu muốn vận hành container an toàn
  • Kỹ sư muốn áp dụng công nghệ container vào công việc
  • Người mới muốn thử viết Dockerfile và build bằng Podman

Bài viết sẽ bao gồm hướng dẫn cơ bản, mẹo phòng tránh lỗi, điểm khác biệt với Docker và cách di chuyển từ Docker sang Podman.

年収訴求

2. Podman là gì?

Tổng quan cơ bản về Podman

Podman (Pod Manager) là công cụ quản lý container thế hệ mới do cộng đồng dẫn đầu bởi Red Hat phát triển. Giống như Docker, Podman xây dựng, chạy và quản lý container tuân thủ chuẩn OCI (Open Container Initiative), tuy nhiên thiết kế và kiến trúc có nhiều điểm khác biệt lớn.

Điểm nổi bật nhất là Podman không cần daemon. Nhờ đó, bạn có thể vận hành linh hoạt và an toàn hơn. Ngoài ra, Podman hỗ trợ chế độ rootless, cho phép người dùng thông thường vận hành container mà không cần nâng quyền. CLI cũng tương thích cao, phần lớn lệnh giống với Docker.

Những đặc điểm chính của Podman

Một số đặc điểm tiêu biểu của Podman như sau:

Cấu trúc không cần daemon

Podman không có tiến trình daemon chạy nền để quản lý container, giúp tiết kiệm tài nguyên và không chạy các tiến trình không cần thiết.

Hỗ trợ rootless (người dùng không đặc quyền)

Podman cho phép người dùng thông thường khởi động và quản lý container. Điều này phù hợp cho môi trường nhiều người dùng hoặc server, giảm thiểu rủi ro bảo mật đáng kể.

CLI tương thích với Docker

Podman sử dụng hệ lệnh gần giống hệt với Docker. Ví dụ, các lệnh Docker sau có thể sử dụng tương tự trên Podman:

podman build -t myimage .
podman run -it myimage bash

Do đó, người đã quen Docker sẽ chuyển sang Podman mà không gặp trở ngại.

Tính năng pod (Pod)

Podman áp dụng khái niệm “Pod” của Kubernetes, cho phép quản lý nhiều container như một đơn vị logic duy nhất. Nhờ đó, tương thích tốt với Kubernetes, dễ dàng chuyển đổi môi trường phát triển sang cloud.

Tương thích với Ubuntu

Podman chủ yếu được sử dụng trên Fedora, RHEL, nhưng hoạt động ổn định trên Ubuntu. Bạn có thể cài đặt từ kho chính thức và cấu hình đơn giản. Đặc biệt từ Ubuntu 20.04 LTS trở đi, các gói Podman được hoàn thiện tốt, giúp cài đặt dễ dàng.

3. Cách cài đặt Podman trên Ubuntu

Lưu ý trước khi cài đặt

Khi cài đặt Podman trên Ubuntu, trước tiên hãy kiểm tra phiên bản Ubuntu bạn đang sử dụng. Podman được khuyến nghị chạy trên Ubuntu 20.04 LTS trở lên. Các bản cũ có thể thiếu gói trong kho chính thức.

Dùng lệnh sau để kiểm tra phiên bản Ubuntu:

lsb_release -a

Bạn cần quyền sudo để cài đặt Podman. Ngay cả khi dùng chế độ rootless, bạn vẫn cần quyền quản trị trong quá trình cài đặt, hãy chuẩn bị sẵn tài khoản sudo.

Các bước cài đặt Podman (kho chính thức Ubuntu)

Trên Ubuntu 20.04, 22.04 trở lên, bạn có thể cài đặt Podman dễ dàng bằng APT.

sudo apt update
sudo apt install -y podman

Sau khi cài xong, hãy xác nhận phiên bản để đảm bảo cài đặt thành công:

podman --version

Cài đặt bản mới nhất (thêm PPA chính thức)

Gói Podman trong kho tiêu chuẩn thường không phải bản mới nhất. Nếu muốn dùng tính năng mới, hãy thêm PPA (Personal Package Archive) chính thức như sau:

. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt update
sudo apt install -y podman

Với cách này, bạn có thể dùng bản Podman mới nhất tương tự như các hệ Red Hat/Fedora.

Kiểm tra cơ bản sau cài đặt

Sau khi cài đặt, hãy thử chạy lệnh sau để kiểm tra:

podman info

Lệnh này cho biết phiên bản, cấu hình và tính năng hỗ trợ (ví dụ rootless).

Tiếp theo, kiểm tra khả năng chạy container Alpine Linux chính thức:

podman run --rm -it alpine sh

Nếu shell khởi động thành công, nghĩa là Podman đã hoạt động ổn định.

4. Tổng quan về Dockerfile và cách dùng với Podman

Dockerfile là gì?

Dockerfile là bản thiết kế để xây dựng image container. Được viết dưới dạng file text, mô tả image nền, các gói sẽ cài đặt, file cần copy, lệnh cần chạy…

Dựa trên file này, các công cụ container như Podman hoặc Docker sẽ tự động xây dựng môi trường nhất quán.

Một số lệnh tiêu biểu:

FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]

Như vậy, image Ubuntu gốc sẽ được cài thêm curl, copy script vào và đặt script đó làm lệnh thực thi mặc định.

Cách sử dụng Dockerfile với Podman

Với Podman, bạn hoàn toàn có thể build image từ Dockerfile. Cách sử dụng tương tự Docker.

1. Chuẩn bị thư mục làm việc

Chuẩn bị file theo cấu trúc sau:

project/
├── Dockerfile
└── app.sh

app.sh là script đơn giản như sau:

#!/bin/bash
echo "Hello from Podman container!"

Cấp quyền thực thi cho script:

chmod +x app.sh

2. Build với Podman

Ở thư mục có Dockerfile, chạy:

podman build -t mypodmanapp .

Lệnh này sẽ tạo image tên mypodmanapp.

3. Kiểm tra kết quả build

Kiểm tra image vừa tạo:

podman images

4. Khởi động container từ image vừa build

Chạy container từ image vừa build:

podman run --rm mypodmanapp

Nếu cấu hình đúng, sẽ xuất hiện: Hello from Podman container!

Sự khác biệt với Containerfile

Podman cho phép dùng file tên Containerfile với cú pháp giống Dockerfile. Đây là xu hướng dùng tên trung lập, không phụ thuộc Docker. Tuy nhiên, cách viết và hoạt động không khác biệt. Bạn có thể dùng Dockerfile hoặc Containerfile đều được.

podman build -f Containerfile -t myimage .

Dùng option -f để chỉ định tên file bất kỳ.

5. Thực hành: Tạo container dựa trên Ubuntu

Tạo Dockerfile dựa trên Ubuntu

Bây giờ, hãy tạo Dockerfile dựa trên Ubuntubuild/run image với Podman từng bước.

Trước tiên, tạo Dockerfile như sau:

FROM ubuntu:22.04

RUN apt update &&     apt install -y curl &&     apt clean

COPY hello.sh /usr/local/bin/hello.sh
RUN chmod +x /usr/local/bin/hello.sh

CMD ["/usr/local/bin/hello.sh"]

Dockerfile này thực hiện:

  • Dùng image Ubuntu 22.04 chính thức
  • Cài package curl
  • Copy hello.sh từ host vào container
  • Đặt hello.sh làm script thực thi mặc định

Tiếp theo, tạo script hello.sh như sau:

#!/bin/bash
echo "Xin chào từ Podman container!"

Đừng quên cấp quyền thực thi:

chmod +x hello.sh

Các bước build image với Podman

Sau khi đã có file, build bằng lệnh:

podman build -t ubuntu-hello .

-t ubuntu-hello là gán tên tag cho image, . là chỉ thư mục chứa Dockerfile.

Nếu thành công, image mới sẽ được lưu local.

podman images

Kiểm tra danh sách image đã build.

Chạy và kiểm tra image vừa build

Để chạy container từ image mới, dùng lệnh:

podman run --rm ubuntu-hello

Kết quả ví dụ:

Xin chào từ Podman container!

Thêm option --rm để tự động xóa container sau khi chạy, phù hợp để test.

Lưu ý: Khởi động container dạng tương tác

Nếu muốn thao tác bên trong container, có thể dùng option -it để vào Bash:

podman run -it ubuntu-hello bash

Cách này giúp tạo môi trường phát triển dựa trên Ubuntu nhẹ nhàng.

6. Những tính năng hữu ích và mẹo với Podman

Điểm mạnh của Podman: Linh hoạt & bảo mật

Podman giữ được tính tương thích với Docker, đồng thời bổ sung nhiều tính năng linh hoạt và an toàn hơn. Sau đây là một số tính năng và mẹo hữu ích khi sử dụng.

Chế độ rootless: Vận hành an toàn

Điểm mạnh lớn của Podman là chế độ rootless, cho phép người dùng thông thường khởi động, dừng và quản lý container mà không cần quyền quản trị.

Ví dụ, chạy Podman mà không cần sudo:

podman run -it ubuntu bash

Khi đó, mọi thao tác bị giới hạn trong thư mục home của user, giảm tối đa ảnh hưởng đến hệ thống. Đặc biệt hữu ích trên server chia sẻ hoặc môi trường phát triển.

Tích hợp systemd: Tự động khởi động container

Podman hỗ trợ tích hợp trực tiếp với systemd, giúp container có thể khởi động cùng hệ thống Linux.

Ví dụ, tạo unit file cho container:

podman generate systemd --name mycontainer --files --restart-policy=always

Unit file sẽ được tạo ở ~/.config/systemd/user/. Sau đó, kích hoạt với lệnh:

systemctl --user daemon-reexec
systemctl --user enable --now container-mycontainer.service

Nhờ vậy, container sẽ tự động khởi động sau khi server reboot.

Quản lý nhiều container với podman-compose

Bên cạnh vận hành một container, Podman còn hỗ trợ quản lý nhiều container cùng lúc với podman-compose, thao tác tương tự Docker Compose.

Cài đặt podman-compose bằng pip:

pip install podman-compose

Vì tương thích tốt với docker-compose.yml, bạn có thể tái sử dụng dự án sẵn có.

Khởi động project multi-container đơn giản với:

podman-compose up -d

Nhờ đó, bạn vẫn tận dụng được khả năng tái hiện môi trường phát triển nhanh chóng với Podman.

Một số lệnh và mẹo hữu ích khác

Dọn dẹp image và container không dùng tới

podman system prune -a

Lệnh này giúp xóa image, container và file tạm không còn dùng, giải phóng dung lượng.

Thiết lập hoàn thiện tự động lệnh (bash/zsh)

Cài gói sau để có hoàn thiện lệnh giống docker:

sudo apt install podman-docker

Giúp thao tác với podman hiệu quả hơn nhờ tự động hoàn thiện lệnh.

7. Hướng dẫn chuyển đổi từ Docker sang Podman

Vì sao nên chuyển sang Podman?

Docker đã là tiêu chuẩn cho container nhiều năm, nhưng gần đây ngày càng nhiều môi trường chuyển sang Podman vì nhẹ, bảo mật cao. Đặc biệt, RHEL và Fedora đã chuyển mặc định sang Podman thay cho Docker, nên nhu cầu chuyển đổi ngày càng tăng.

Mục này sẽ giải thích cụ thể các bước chuyển đổi từ Docker sang Podman và các điểm cần lưu ý.

Tương thích lệnh giữa Docker và Podman

Podman có độ tương thích lệnh cao với Docker, bạn có thể chuyển đổi lệnh gần như không thay đổi như sau:

DockerPodman
docker build -t myapp .podman build -t myapp .
docker run -it myapppodman run -it myapp
docker imagespodman images
docker pspodman ps

Nhờ vậy, bạn có thể chuyển đổi mà không cần học lại CLI mới.

podman-docker: Tương thích hoàn toàn với lệnh docker

Nếu dự án hoặc script CI/CD cũ đang dùng lệnh “docker”, bạn có thể cài podman-docker để tự động chuyển lệnh docker sang podman.

sudo apt install podman-docker

Sau khi cài, lệnh docker sẽ thực chất gọi podman bên dưới:

which docker
# → /usr/bin/docker → symbolic link tới podman

Nhờ đó, các script Docker cũ vẫn chạy được mà không cần sửa.

podman-compose thay thế docker-compose

Với các dự án dùng nhiều container qua Docker Compose, chỉ cần cài podman-compose để thực hiện thao tác tương tự.

Tuy tương thích tốt, nhưng một số tính năng hoặc hành vi vẫn khác biệt, lưu ý các điểm sau:

  • Một số option như depends_on chưa hỗ trợ hoặc khác với Docker
  • Cách ghi log và kiểm tra tình trạng có thể khác

Nếu dự án không quá phức tạp, bạn có thể chuyển đổi khá dễ dàng.

Chuyển image/volume từ Docker sang Podman

Khi chuyển image từ Docker sang Podman, image local của Docker sẽ không tự nhận bởi Podman. Cần làm như sau để chuyển đổi:

Cách 1: Pull lại image bằng Podman

podman pull ubuntu:22.04

Cách 2: Export từ Docker → Import vào Podman

# Xuất image từ Docker
docker save myimage > myimage.tar

# Import vào Podman
podman load < myimage.tar

Như vậy, bạn có thể dùng image Docker cũ với Podman.

Các điểm cần lưu ý khác

  • Khác biệt về rootless: Docker cần quyền root, Podman mặc định hỗ trợ rootless
  • Khác biệt về cấu trúc daemon: Podman không dùng daemon nên quản lý tiến trình khác với Docker
  • Vị trí lưu log, data cũng khác, cần kiểm tra cấu hình khi chuyển đổi

8. Câu hỏi thường gặp (FAQ)

Q1. Sự khác biệt chính giữa Podman và Docker là gì?

A1. Điểm lớn nhất là Podman không cần daemon (không có tiến trình chạy nền). Nhờ đó, Podman nhẹ và bảo mật hơn. Ngoài ra, Podman hỗ trợ chế độ rootless cho phép user thường quản lý container mà không cần nâng quyền. CLI rất giống Docker.

Q2. Dockerfile và Containerfile khác gì nhau?

A2. Không có khác biệt chức năng nào. Cả hai đều là file mô tả build image container, cú pháp y hệt nhau. Containerfile chỉ là tên trung lập không dính tới Docker, thường được ưu tiên dùng cho các dự án chuẩn OCI, nhưng thực tế dùng Dockerfile cũng không sao.

Q3. Có thể dùng Docker Compose với Podman không?

A3. Không hỗ trợ trực tiếp, nhưng bạn có thể dùng podman-compose (viết bằng Python) để chạy các file docker-compose.yml trên môi trường Podman.

Lưu ý một số option như depends_on có thể chưa đầy đủ, nên nếu cấu hình phức tạp cần kiểm tra kỹ trước.

Q4. Podman có hoạt động ổn định trên Ubuntu không?

A4. Có, từ Ubuntu 20.04 LTS trở lên hoạt động rất ổn định. Podman có sẵn trên kho chính thức Ubuntu, chỉ cần dùng apt là cài được. Nếu muốn dùng bản mới hơn, có thể thêm PPA.

Q5. Dùng rootless mode có bị hạn chế gì không?

A5. Khi chạy rootless, một số thao tác đặc quyền (ví dụ dùng port nhỏ hơn 1024) bị hạn chế. Tuy nhiên có thể dùng port forwarding để xử lý. Đa số trường hợp thực tế rootless vẫn đáp ứng tốt.

Q6. Podman pull image có giống Docker Hub không?

A6. Đúng vậy, Podman mặc định lấy image từ Docker Hub. Tuy nhiên đôi lúc bạn cần ghi rõ tên registry như docker.io/library/ubuntu.

podman pull docker.io/library/ubuntu

Podman còn hỗ trợ nhiều registry khác như Quay.io, GitHub Container Registry, v.v.

Q7. Podman dùng cho production được không?

A7. Có, Podman hỗ trợ tốt các yếu tố cần cho production như tương thích Kubernetes, tích hợp systemd. Đặc biệt môi trường yêu cầu bảo mật cao, Podman có thể phù hợp hơn Docker. Trên Red Hat Enterprise Linux, Fedora, Podman đã là mặc định và có nhiều dự án lớn sử dụng.

Liên kết tham khảo