1. Container là gì?

Container là một phương tiện ảo hóa hệ thống được sử dụng để đóng gói một ứng dụng và tất cả các phụ thuộc của nó cùng với môi trường chạy của nó trong một gói. Container được xây dựng trên cơ sở các công nghệ ảo hóa như kernel namespaces, cgroups và chroot để đảm bảo rằng mỗi container có một môi trường hoàn toàn độc lập với hệ thống máy chủ gốc.
16Artvdg0by4A8hyoJtCcZfKXhcicdxc0

Container có thể được triển khai và chạy trên nhiều môi trường khác nhau mà không cần thay đổi ứng dụng hoặc các phụ thuộc của nó. Các container cũng cho phép các nhà phát triển và quản trị viên hệ thống đóng gói ứng dụng một cách dễ dàng và đáng tin cậy, vì các container cung cấp một cách tiêu chuẩn hóa để đóng gói và triển khai ứng dụng cùng với tất cả các phụ thuộc và thư viện của nó.

Các công cụ phổ biến nhất để tạo và quản lý các container bao gồm Docker, Podman và containerd. Các container đang trở thành một công cụ quan trọng trong việc phát triển và triển khai các ứng dụng hiện đại, cũng như trong việc quản lý hạ tầng và các môi trường phát triển.

2. Docker

Docker là một nền tảng phần mềm để đóng gói và triển khai ứng dụng trong các container độc lập với môi trường máy chủ. Các container cung cấp một cách tiêu chuẩn hóa để đóng gói ứng dụng cùng với tất cả các phụ thuộc và thư viện của nó và chạy nó một cách độc lập trên bất kỳ máy chủ nào hỗ trợ Docker.

Với Docker, các nhà phát triển có thể xây dựng, đóng gói và chia sẻ các ứng dụng và thư viện của họ dưới dạng các container di động, cho phép các ứng dụng được triển khai một cách dễ dàng và đáng tin cậy trên nhiều môi trường khác nhau, từ máy tính đến máy chủ đám mây.

Khi bạn chạy câu lệnh Docker:

docker run --name web -p 8080:80 -d nginx

Luồng hoạt động khi chạy sẽ như sau:
1bdwsnBZivlrI39Ht6HydQNP57bYbt5wG

Các thành phần của Docker sẽ hoạt động như sau:

  • Docker CLI (Command Line Interface): Đây là giao diện dòng lệnh để tương tác với Docker. Khi bạn chạy lệnh trên, Docker CLI sẽ gửi yêu cầu tạo một container mới dựa trên image nginx trên Docker Hub.
  • Docker Daemon: Docker Daemon là tiến trình chạy ngầm trên máy chủ, quản lý các hoạt động của Docker. Khi Docker CLI nhận được yêu cầu, nó sẽ giao tiếp với Docker Daemon. Docker Daemon sẽ xử lý yêu cầu và quản lý container.
  • Containerd: Containerd là một runtime container mã nguồn mở, nó được sử dụng bởi Docker để quản lý các container. Khi Docker Daemon nhận được yêu cầu, nó sẽ sử dụng Containerd để tạo một container mới dựa trên image nginx.
  • Runc: Runc là công cụ được sử dụng để chạy các container tuân thủ tiêu chuẩn Open Container Initiative (OCI). Khi Containerd tạo một container mới, nó sẽ sử dụng Runc để chạy container đó dựa trên cấu hình và image đã được chỉ định.

Sau khi yêu cầu được xử lý, Docker Daemon sẽ tạo một container mới dựa trên image nginx. Container này sẽ được gán tên là "web" và mở một cổng trên máy chủ với cổng nội bộ là 80 và cổng ngoài là 8080. Container được chạy ở chế độ nền (-d), điều này có nghĩa là container sẽ chạy ngầm và không chiếm cửa sổ dòng lệnh hiện tại.

Khi container được tạo và chạy thành công, bạn có thể truy cập vào ứng dụng web nginx trong container bằng cách truy cập địa chỉ http://localhost:8080 trên máy chủ. Docker sẽ chuyển giao các yêu cầu từ cổng ngoài 8080 đến cổng nội bộ 80 của container, cho phép bạn truy cập ứng dụng web trong container.

14y6EyE7apGeViR62_wntbwyv6HSY8-87

3.Podman

Podman là một công cụ đóng gói và quản lý container độc lập với môi trường máy chủ, tương tự như Docker. Nó cũng sử dụng để phát triển, quản lý và chạy các containers.Podman có thể quản lý toàn bộ hệ sinh thái container như: pods, containers, images, and container volumes sử dụng 1 thư viện là libpod.
Đây là một trong các công cụ dòng lệnh được thiết kế để xử lý các tác vụ khác nhau trong quá trình đóng gói container, có thể hoạt động như một framework module. Bộ công cụ này bao gồm:

  • Podman - quản lý pod và container image
  • Buildah - công cụ xây dựng container
  • Skopeo - quản lý kiểm tra container image
  • runc - công cụ chạy container và xây dựng tính năng cho podman và buildah
  • crun - runtime tùy chọn cho phép linh hoạt, kiểm soát và bảo mật tốt hơn cho các container không cần quyền root.

Podman có các tính năng giống với Docker, bao gồm đóng gói ứng dụng vào container, triển khai và quản lý các container đó, tạo và quản lý mạng, lưu trữ và các tài nguyên khác. Tuy nhiên, Podman có một số tính năng mạnh mẽ hơn Docker, chẳng hạn như hỗ trợ đầy đủ cho rootless container (container không cần quyền root), hỗ trợ chuyển đổi giữa các định dạng container, và cung cấp một số tính năng bảo mật mạnh hơn.

Podman và Docker

1PxzX1_Y5zi279NryN6NcKQOOZwAdtsON

Về tổng quan:

DOCKER PODMAN
Sử dụng Daemon. Không sử dụng daemon.
Cần chạy với quyền root Có thể chạy với quyền root hoặc user
Kém an toàn bởi vì tất cả các container đều có quyền root An toàn hơn vì container không cần có quyền root
Là một công cụ tự cung cấp và tự build các images Podman không thể build image trên chính nó, mà nó sử dụng 1 công cụ khác được gọi là buildah để build images
Hỗ trợ tốt Docker swarm, Docker compose Không hỗ trợ Docker swarm, Docker compose
Là một công cụ độc lập, nguyên khối Podman có cách tiếp cần module, dựa trên các công cụ chuyên dụng co các nhiệm vụ cụ thể.
Docker sử dụng kiến trúc client-server, daemon chạy trên tất cả các host cần chạy container Podman sử dụng kiến trúc single-process nên pods và images nhỏ hơn. Ngoài ra, vì là single-process nên nó tránh được các vấn đề bảo mật liên quan đến multi-process như việc chia sẻ PID namespace với các container khác

Về câu lệnh:

DOCKER PODMAN
root@73:~# docker --version
Docker version 23.0.1, build a5ee5b1
root@73:~# podman --version
podman version 3.4.4
root@73:~# docker run --name web -p 8080:80 -d nginx root@73:~# podman run --name web -p 8180:80 -d docker.io/library/nginx
root@73:~# docker ps root@73:~# podman ps
root@73:~# docker images root@73:~# podman images

Q&A:

  • Podman có thể thay thế Docker?

Có thể, Podman có thể thay thế docker trong nhiều trường hợp. Podman cung cấp môi trường chạy container (container runtime) và công cụ như Docker, và trong một số trường hợp, nó có thể cải thiện bảo mật và sự linh hoạt.

  • Podman có tốt hơn Docker?

Việc đánh giá tốt hơn phụ thuộc vào từng trường hợp sử dụng. Có trường hợp Podman tốt hơn về sự linh hoạt và bảo mật, nhưng Docker lại phù hợp hơn với môi trường hoặc ứng dụng nhất định

  • Podman nên sử dụng khi nào?

Podman không cần sử dụng root để chạy container, vì vậy nếu ứng dụng cần chạy container nhưng ko có quyền root thì nên dùng Podman. Ngoài ra, một số dự án sử dụng Docker cho môi trường DEV, còn dùng Podman cho môi trường PROD để đảm bảo bảo mật.

4. Containerd

Containerd là một container runtime, quản lý vòng đời của container trên các máy chủ vật lý hoặc ảo hóa. Nó thực hiện các nhiệm vụ:

  • Download/Upload các container images
  • Cài đặt mạng (networking) giữa các containers, để chúng có thể giao tiếp được với nhau, và giao tiếp với bên ngoài
  • Quản lý dữ liệu liệu và files lưu trữ trong các container.
  • Starting, stopping, restarting containers.

Containerd là một thành phần trong docker và kubernetes:
1PccDVbUs40fULbNepzfTj_Okmev8FJl7

Để có thể thao tác với containerd trong giao diện dòng lệnh (cli), chúng ta cần sử dụng một số command-line containerd clients như: ctr, nerdctl, hay crictl.
1WEtdqj9owjh9YRJor0rEt6CAD8vdja8d

Trong bài này, mình sẽ giới thiệu các câu lệnh tương ứng với docker của ctr và nerdctl.

Docker vs CTR

DOCKER CTR
root@73:~# docker --version
Docker version 23.0.1, build a5ee5b1
root@73:~# ctr --version
ctr containerd.io 1.6.18
root@73:~# docker run --name web -p 8080:80 -d nginx root@73:~# ctr image pull docker.io/library/nginx:latest
docker.io/library/nginx:latest: resolved
...
done: 2.697396863s
root@73:~# ctr run --net-host -d -t docker.io/library/nginx:latest web
root@73:~# docker ps root@73:~# ctr container list

root@73:~# ctr task list
root@73:~# docker images root@73:~# ctr image ls

Docker vs NERDCTL

DOCKER NERDCTL
root@73:~# docker --version
Docker version 23.0.1, build a5ee5b1
root@73:~# nerdctl --version
nerdctl version 1.2.1
root@73:~# docker run --name web -p 8080:80 -d nginx root@73:~# nerdctl run -d -p 8083:80 --name=web nginx
root@73:~# docker ps root@73:~# nerdctl ps
root@73:~# docker images root@73:~# nerdctl images

5. Kết luận

Ngoài docker thì còn có các công cụ quản lý container khác như podman, containerd, Kubernetes (hay còn gọi là K8s), Runc... Các công cụ này cung cấp các tính năng quản lý, tự động hóa và cô lập để triển khai và vận hành ứng dụng một cách hiệu quả trong môi trường container. Tùy thuộc vào dự án cụ thể mà chúng ta có thể lựa chọn và sử dụng công cụ cho phù hợp.

6. Tài liệu tham khảo