Docker là gì? Nguyên tắc hoạt động của Docker trên Linux và Windows

Bạn đã bao giờ mất hàng giờ chỉ để thiết lập môi trường phát triển giống với các bạn khác trong team hay cố gắng tái tạo một lỗi mà nó “chỉ xảy ra trên server”? Đây là những rắc rối mà bất kỳ lập trình viên nào cũng từng gặp phải. Và rồi, Docker xuất hiện như một giải pháp cho vấn đề này, giúp gạt bỏ mọi rào cản giữa các môi trường phát triển, kiểm thử, và triển khai.

Trong bài viết này, hãy cùng mình khám phá cách Docker thay đổi cách chúng ta phát triển và triển khai phần mềm, lý do nó trở thành xu hướng, và cách bạn có thể áp dụng Docker để tối ưu hóa quy trình làm việc của mình.

Các bạn có thể tham khảo thêm bài Hướng dẫn Cài đặt và Sử dụng Docker của mình.

1. Containerization là gì?

1.1 Khái niệm

Trước khi có container, các Developer thường gặp phải vấn đề là phần mềm họ viết và kiểm thử trên máy tính cá nhân vẫn chạy được bình thương nhưng khi đưa lên Production thì lại lỗi. Điều này xảy ra do sự khác biệt giữa môi trường phát triển (local) và môi trường sản xuất (production), gây ra sự không nhất quán và khó khăn trong việc khắc phục lỗi.

Containerization là một công nghệ ảo hoá, giúp giải quyết vấn đề này bằng cách đóng gói ứng dụng và tất cả các phụ thuộc (dependencies) của nó (như thư viện, cấu hình) vào một đơn vị độc lập gọi là container. Container này đảm bảo rằng phần mềm sẽ chạy ổn định và nhất quán trên bất kỳ môi trường nào, dù là trên máy tính cá nhân của Developer, Test Server, hay môi trường Production trên cloud.

Hãy tưởng tượng bạn có một chiếc hộp đặc biệt, và bất kỳ thứ gì bạn đặt vào trong chiếc hộp này sẽ hoạt động giống hệt nhau bất kể bạn mang nó đi đâu. Đó chính là những gì container mang lại cho phần mềm. Container đóng gói phần mềm trong một môi trường nhất quán, tách nó ra khỏi các sự khác biệt về hệ thống và cơ sở hạ tầng bên dưới.

1.2 Vai trò của Containerization

Những lợi ích mà containerization mang lại trong phát triển và triển khai phần mềm:

2. Docker là gì?

Docker là một nền tảng mã nguồn mở được thiết kế để đơn giản hóa việc phát triển, triển khai và chạy các ứng dụng bên trong các container. Container là các đơn vị phần mềm nhẹ, độc lập và có thể thực thi được, nó đóng gói tất cả các thành phần cần thiết để chạy một ứng dụng, bao gồm mã nguồn, thư viện, và các cài đặt hệ thống.

Các công nghệ container trước Docker (containerization không phải do Docker phát minh mà có từ lâu trước đó) như LXC (Linux Containers), Solaris Zones, và OpenVZ, đã có khả năng tạo và quản lý các container. Nhưng những công nghệ này yêu cầu kiến thức sâu về hệ điều hành và cần nhiều cấu hình thủ công, không có giao diện người dùng đơn giản để quản lý các container. Việc di chuyển các container giữa các hệ thống hoặc môi trường khác nhau thường gặp khó khăn.

Docker ra đời đã cung cấp một giao diện dòng lệnh đơn giản và trực quan, dễ sử dụng ngay cả với những người không có kinh nghiệm sâu về hệ điều hành, cho phép Docker container có thể chạy trên bất kỳ hệ thống nào có Docker.

2.1 Các thành phần chính của Docker

Để hiểu rõ cách thức hoạt động của Docker, bạn cần làm quen với các thành phần chính của nó

2.1.1 Docker Engine:

Đây là trung tâm của hệ thống Docker. Nó là một runtime (môi trường thực thi) quản lý các container Docker trên một hệ thống. Docker Engine là một ứng dụng client-server với ba thành phần chính: Docker CLI, Docker API, và Docker Daemon.

2.1.2 Docker Images

Docker Images là các bản thiết kế (blueprints) cho container. Một image định nghĩa tất cả những gì một ứng dụng cần để chạy. Sau khi một image được tạo ra, nó không thể thay đổi (immutable). Bạn có thể chạy các instance của image này, được gọi là các container.

2.1.3 Docker Containers

Đây là các instance đang chạy của Docker images. Container đóng gói một ứng dụng và tất cả các thành phần phụ thuộc của nó. Containers cô lập phần mềm khỏi sự ảnh hưởng của môi trường và đảm bảo rằng nó vẫn hoạt động bất kể sự khác biệt (staging vs production).

2.1.4 Docker Hub

Là một registry service phổ biến nhất cung cấp bởi Docker. Đây là nơi bạn có thể tải lên (push) các Docker images của mình, chia sẻ chúng với cộng đồng hoặc đồng nghiệp, và tải xuống (pull) các images từ cộng đồng hoặc từ các nguồn đáng tin cậy khác.

3. Nguyên tắc hoạt động của Docker

3.1 Trên Linux

Docker dựa vào các tính năng của Linux kernel như namespaces, cgroups, và UnionFS để thực hiện containerization.

Quy trình chi tiết khi khởi chạy một container:

Bash

docker run -d --name my_nginx nginx
  1. Docker CLI gửi lệnh đến Docker Daemon.
  2. Docker Daemon tương tác với Containerd.
  3. Containerd tạo ra Container.
  4. Runc khởi chạy container.
  5. Container hoạt động (running).

3.1 Trên Windows

Docker trên Windows sẽ có cách hoạt động khác với Docker trên Linux do sự khác biệt cơ bản giữa hai hệ điều hành, đặc biệt là trong cách quản lý tài nguyên và thực hiện containerization.

Docker trên Windows có thể hoạt động ở hai chế độ chính:

Quy trình chi tiết khi khởi chạy một container:

Bash

docker run -d --name my_nginx nginx
  1. Docker CLI gửi lệnh đến Docker Daemon.
  2. Docker Daemon chọn chế độ hoạt động: Nếu bạn chạy một container Linux như nginx, Docker sẽ sử dụng chế độ LCOW (Linux Containers on Windows).
  3. Sử dụng WSL 2 Hoặc Hyper-V để tạo môi trường Linux: Nếu Docker được cấu hình để sử dụng WSL 2, nó sẽ khởi tạo một instance WSL 2, nơi Docker daemon có thể chạy các containers Linux. Nếu WSL 2 không được kích hoạt, Docker có thể sử dụng Hyper-V để tạo ra một máy ảo nhỏ chạy một hệ điều hành Linux tối giản.
  4. Khởi tạo và quản lý container.
  5. Container hoạt động (running).

4. Kết luận

Docker là một công nghệ containerization phổ biến nhất hiện tại, giúp đóng gói các  thành phần cần thiết để chạy một ứng dụng vào trong các container, tạo ra một môi trường tách biệt khỏi hệ điều hành chủ. Điều này giúp đảm bảo các ứng dụng có thể chạy một cách nhất quán trên mọi môi trường, từ phát triển đến production, giảm thiểu rủi ro lỗi và rút ngắn thời gian triển khai.

Các bài viết liên quan tại Blog 200Lab

Exit mobile version