[Docker cơ bản] Bài 1: Docker là gì? Tại sao lập trình viên nên biết cách sử dụng docker?

Thời gian gần đây, Docker đang ngày càng phổ biến trong giới công nghệ và có xu hướng phát triển mạnh mẽ trong tương lai. Các ông lớn công nghệ như Adobe, Twitter, Netflix,… hiện cũng đang sử dụng Docker trong quá trình phát triển các sản phẩm của họ. Thế nên, bạn không biết đến Docker có khả năng là bạn đang lỗi thời rồi đấy! Đừng lo, trong loạt bài viết lần này chúng tôi sẽ giúp bạn có cái nhìn tổng quan hơn về Docker.

Mục tiêu hướng tới một loạt các bài viết về Docker đó là giới thiệu cho bạn đọc biết tới các khái niệm Docker, Docker đóng vai trò gì trong quy trình phát triển một phần mềm nói chung và các lĩnh vực liên quan đến AI, Machine learning, Computer Vision… Bên cạnh đó cũng hướng dẫn các bạn sử dụng, tạo Docker, và áp dụng docker vào project sắp tới của các bạn.

I. Tại sao lại sử dụng Docker?

Đặt tình huống bạn đang làm một project cùng với team về Machine Learning bằng Python và muốn gửi phần code của mình cho đồng đội trong team để chạy thử. Đồng đội bạn hì hục cài đặt các thư viện cần cho project như scikit-learn, pandas, tensorflow, keras,… và xử lí các xung đột linh tinh xảy ra mất gần một tiếng đồng hồ nhưng code chạy vẫn bị lỗi. À, hóa ra trên máy bạn sử dụng Python 3.7 còn máy đồng đội lại sử dụng Python 3.5 thế mới đau. Thế là đồng đội bạn lại tốn thêm một khoảng thời gian đáng kể để cài đặt Python 3.7 trên máy.

(Nguồn: Simplilearn)

Cuối cùng mất gần cả buổi sáng thì code trên máy đồng đội cũng đã chạy, nhưng kết quả output lại hơi khác biệt so với trên máy bạn, tại sao lại như vậy? Có khá nhiều nguyên nhân nhưng chủ yếu là do sự khác biệt về hệ điều hành, máy bạn chạy Ubuntu nhưng máy đồng đội lại chạy MacOS chẳng hạn.

Teamwork có vẻ không dễ dàng như bạn nghĩ.
(Nguồn: behance.net)

Sau sự việc trên, bạn và đồng đội tự hỏi liệu có công cụ nào có thể giúp chạy code của người khác trên máy mình một cách nhanh chóng, không gây ra xung đột giữa các dependencies và sử dụng chung một hệ điều hành hay không?
Câu trả lời đó chính là Docker.

II. Sơ lược về lịch sử hình thành

1. Server vật lý (Physical Server)

Nhiều năm về trước, khi chưa có Docker, các project ở công ty hay doanh nghiệp thường được deploy trên các server vật lý theo cấu trúc khá đơn giản:

Server vật lý
(Nguồn: Kumulus Technologies)

Mỗi server vật lý thường bao gồm: bộ nhớ, CPU, GPU, kết nối mạng, ổ cứng và hệ điều hành để chạy các ứng dụng.

Các server vật lý thường có chi phí khá cao, rất mạnh mẽ nhưng lại không tận dụng hết được sức mạnh của mình, dù cấu hình phần cứng khá khủng nhưng lại chỉ có thể cài đặt được một hệ điều hành. Điều đó cũng dẫn đến việc hình thành nên các server bằng công nghệ ảo hóa (Virtual Server).

2. Server ảo (Virtual Server)

Virtual Server
(Nguồn: Kumulus Technologies)

Mỗi máy chủ vật lý có thể được dùng để chạy nhiều project, mỗi project ta có thể cho chạy trong một máy ảo hay còn được gọi là Virtual Server.

Các Virtual Server được tạo ra bằng công nghệ Virtualization (được sử dụng trong các phần mềm như VMware, VirtualBox, Azure VM,…) sẽ chạy trên một máy chủ vật lý, mỗi Server ảo được cài đặt một hệ điều hành riêng (Guest OS) sử dụng các tài nguyên phần cứng được cấp phát từ máy chủ vật lý. Việc quản lý và điều phối các tài nguyên từ Server vật lý sao cho hợp lý được thực hiện bởi lớp Hypervisor như trên hình.

Đến đây, việc tạo ra các môi trường độc lập để tiện cho việc deploy dự án đã giảm bớt một phần chi phí và trở nên khá dễ dàng, nhưng Virtual Server vẫn còn khá nhiều hạn chế. Việc cấp phát cố định các tài nguyên phần cứng (nghĩa là mỗi Virtual Server sẽ có một phần cứng riêng) sẽ gây khó khăn cho việc chia sẻ dữ liệu, tài nguyên giữa các Virtual Server. Điều này thường dẫn đến việc không tận dụng hết tài nguyên từ máy chủ, ví dụ máy ảo của bạn được cấp phát 7 GB RAM nhưng bạn chỉ sử dụng khoảng 4 GB, như vậy là 3 GB còn lại coi như để không, không thể chia sẻ cho các máy ảo khác đang cần.

Máy ảo lãng phí các tài nguyên không sử dụng.
(Nguồn: Simplilearn)

Ngoài ra, mỗi Server ảo đều chứa một hệ điều hành riêng nên dung lượng của mỗi Server ảo khá nặng, làm mất đi tính di động cần có để chia sẻ các môi trường triển khai ứng dụng giữa những người phát triển với nhau.

Những hạn chế trên cũng dẫn đến sự ra đời của công nghệ tiếp theo – Containerization.

3. Containerization

Containerization.
(Nguồn: Kumulus Technologies)

Công nghệ Containerization sẽ tạo ra trên máy chủ vật lý các máy con gọi là Container chứa ứng dụng hoặc project và các thư viện cần thiết để chạy ứng dụng hoặc project đó.

Việc sử dụng Container khắc phục hoàn toàn những bất cập đã nêu ở phía trên của Server vật lý và Server ảo. Container rất nhẹ, thời gian khởi động nhanh và có tính di động cao, việc chia sẻ các môi trường triển khai dự án giữa những người dùng trở nên dễ dàng hơn bao giờ hết.

Những lợi ích trên có được là do các Container sử dụng cơ chế chia sẻ tài nguyên và dùng chung nhân của hệ điều hành ở máy chủ (Host OS), chứ không cần cấp phát cho mình một hệ điều hành riêng (Guest OS) như trên Virtual Server.

Vậy giờ ta muốn sử dụng công nghệ Containerization thì phải sử dụng công cụ nào? Như ở phần đầu mình có đề cập, câu trả lời chính là Docker.

III. Docker là gì?

Docker là một công cụ mã nguồn mở sử dụng công nghệ containerization cho phép chúng ta tạo ra các môi trường đóng gói (các container) trên máy tính mà không làm ảnh hưởng đến môi trường hiện tại của máy.

(Nguồn: Internet)

Nghe qua có vẻ Docker khá giống với việc sử dụng các máy ảo, vậy điều gì làm cho Docker ngày càng trở nên phổ biến? Đây là những nguyên nhân:

  • Các Docker Container chia sẻ nhau chung một nguồn tài nguyên từ máy chủ vật lý, không phải tách biệt như ở các máy ảo, giúp tối ưu hóa thời gian và không gian của máy chủ.
  • Docker rất nhẹ và nhanh, bạn có thể tạo và khởi động các Docker Container chỉ trong vài giây.
  • Cộng đồng sử dụng Docker rất đông đảo thường xuyên chia sẻ các Docker Image (mình sẽ giải thích Docker Image ở phần sau) trên Docker Hub. Bạn chỉ cần lên đấy tìm các Image cần thiết và pull về để sử dụng.
  • Với Docker, rất dễ để liên kết các container với nhau để tạo thành một ứng dụng, làm cho nó dễ dàng scale, update các thành phần độc lập với nhau.

Bất kì công cụ nào cũng có những nhược điểm đúng không? Theo mình nhược điểm của Docker đó là không thể chạy trực tiếp trên Windows và MacOS, trên 2 nền tảng hệ điều hành này Docker sẽ tạo ra một máy ảo Linux để chạy các Container, điều này có thể ảnh hưởng đến hiệu năng khi sử dụng.

Đối tượng dùng Docker? Docker được tạo ra để mang lại lợi ích cho các lập trình viên và đặc biệt là những người quản trị hệ thống, giúp cho lập trình viên tập trung code mà không cần phải lo lắng việc code chạy ngon trên máy mình nhưng lại fail trên máy khác.

IV. Tìm hiểu về Docker Engine:

Docker Engine.
(Nguồn: Simplilearn)

Đây là thành phần cốt lõi của Docker, Docker Engine sử dụng cấu trúc Client-Server, được cài đặt trên máy chủ vật lý. Đây là 3 thành phần cơ bản của Docker Engine:

  • Server: Còn được gọi là Docker Daemon, dùng để tạo và quản lí các Images, Container, Networks,..
  • Rest API: Chỉ thị cho Docker Daemon cần làm những gì.
  • Command Line Interface (CLI): Dùng để nhập những câu lệnh từ phía client.

V. Kiến trúc của Docker:

Các thành phần cơ bản của Docker.
(Nguồn: https://nordicapis.com/)

1. Docker Client:

Người dùng Docker có thể tương tác với Docker thông qua Docker Client. Khi các câu lệnh Docker được chạy, Client sẽ gửi chúng đến cho Docker Daemon để xử lí. Docker Client có thể giao tiếp với nhiều Daemon.

2. Docker Daemon

Là thành phần core, lắng nghe API request và quản lý các Docker Object (Images, Conatainer, Network, Volume). Docker daemon host này cũng có thể giao tiếp được với Docker daemon ở host khác.

3. Docker Registry

Là một nơi chứa các Docker Images. Người dùng có thể tạo ra các images của mình và tải lên đây hoặc tải về các images được chia sẻ. Nổi tiếng nhất có lẽ là Docker Hub, ngoài ra bạn có thể tạo Registry cho riêng mình.

4. Docker Objects

Đây là những thành phần bạn hay gặp nhất ghi sử dụng Docker.

  • Image: là các read-only template (chỉ đọc được chứ không thể sửa đổi), dùng để tạo ra các Container thông qua câu lệnh docker run. Môi trường lập trình gồm các ứng dụng, thư viện, hệ điều hành,… sẽ được đóng gói vào trong một Image. Có thể tạo Docker Image bằng cách buid từ Dockerfile hoặc commit từ Docker Container. Docker Image thường được lưu trữ trên Docker Hub hoặc ở registry của người dùng.
  • Container: khi bạn chạy Image sẽ tạo ra các Container chứa môi trường lập trình đã được đóng gói vào trong Image, bạn có thể tạo ra nhiều Container từ 1 Image. Hiểu theo ngôn ngữ OOP thì Image là 1 class và Container chính là Instance của lớp đó.
  • Network: cung cấp private network (VLAN) để các Container trên một Host có thể liên lạc được với nhau, hoặc các Container trên nhiều Hosts có thể liên lạc được với nhau (Multi-host Networking).
  • Volume: dùng để lưu trữ các dữ liệu độc lập với vòng đời của Container và giúp cho các Containers có thể chia sẻ dữ liệu với nhau và với Host.

VI. Quy trình làm việc cơ bản với Docker

Workflow cơ bản với Docker.
(Nguồn: Simplilearn)
  • Dùng Docker File hoặc commit từ Container đang sử dụng để tạo ra Image chứa môi trường lập trình phù hợp cho project của bạn.
  • Gửi Image sang cho đồng đội trong team để chạy project bằng cách tạo ra Container, việc khởi tạo các Container mất khoảng vài giây.
  • Bạn có thể upload các Image bạn đã tạo ra lên Docker Hub để chia sẻ cho cộng đồng.
  • Từ Docker Hub, bất kì người dùng nào cũng có thể pull Image của bạn về để chạy tạo ra các Container.

Như vậy ở bài này, mình đã giới thiệu sơ lược về lịch sử hình thành, các khái niệm cơ bản của Docker và kiến trúc của nó, ở bài tiếp theo mình sẽ hướng dẫn các bạn một số câu lệnh thường dùng khi sử dụng Docker nhé. Hẹn gặp lại! ^^

Nguồn tham khảo:
[1] https://viblo.asia/p/docker-chua-biet-gi-den-biet-dung-phan-1-lich-su-ByEZkWrEZQ0
[2] https://medium.com/@moneerrifai/from-physical-servers-to-vms-to-docker-containers-whats-next-moneer-rifai-27bc6c77179f
[3] https://devopsz.com/docker-101-part-3/
[4] https://vmarena.com/docker-architecture-and-components/
[5] https://www.infoworld.com/article/3310941/why-you-should-use-docker-and-containers.html
[6] https://nordicapis.com/api-driven-devops-spotlight-on-docker/

Tác giả bài viết:
Lê Quang Hưng – KHCL2018.2

Nguồn: http://tutorials.mmlab.uit.edu.vn/index.php/2020/05/30/docker-co-ban-bai-1-docker-la-gi-tai-sao-lai-su-dung-docker/

TRA CỨU CHỨNG CHỈ ỨNG DỤNG CNTT

Bài viết mới nhất