/ Docker Series 2018

Làm quen với các khái niệm cốt lõi liên quan tới Docker

Qua loạt bài hướng dẫn chuẩn bị môi trường để thực hành Docker vừa rồi, tôi tin rằng các bạn đã phần nào có được trải nghiệm về việc cài đặt môi trường để chạy ứng dụng thông qua Virtual Machine, làm quen với việc chạy một Docker Container đơn giản.

Trong bài viết này, tôi sẽ phân tích sâu hơn các công nghệ đằng sau Docker để các bạn có được cái nhìn tổng quan nhất về nguyên lý hoạt động của nó. Bài viết tập trung vào hai nội dung chính:

  • Chia sẻ về các vấn đề liên quan tới quy trình triển khai ứng dụng hiện tại để các bạn hiểu được tại sao chúng ta cần phải tìm một giải pháp chạy ứng dụng tốt hơn.
  • Giới thiệu về Docker, các công nghệ liên quan và cách thức mà Docker đã giúp chúng ta giải quyết các vấn đề trên như thế nào.

Nội dung

Các vấn đề trong quá trình deploy phần mềm

Deploy là một công đoạn được thực hiện sau khi toàn bộ các chức năng của ứng dụng đã được code (Develop) xong. Công việc trong phần này là đưa ứng dụng từ môi trường phát triển (development environment) lên môi trường chạy thật (live environment). Đây là một công đoạn rất quan trọng mọi quy trình phát triển phần mềm.
physical_machine-1
Vào những ngày đầu, khi công nghệ ảo hóa chưa ra đời, chúng ta phải trực tiếp chạy các ứng dụng trên một máy tính với một hệ điều hành (HĐH) nào đó (vd. Linux, Unix, Windows), ràng buộc lớn nhất đó là HĐH phải hỗ trợ toàn bộ các ứng dụng đang chạy, điều này đồng nghĩa với việc HĐH phải hỗ trợ tới từng phiên bản cụ thể của các library, framework mà ứng dụng cần. Do đó, mọi hoạt động update/upgrade HĐH hoàn toàn có khả năng khiến cho một phần nào đó bên trong framework hoặc library không hoạt động đúng nữa.

Khi chạy các ứng dụng trên cùng một HĐH, mặc dù chúng được chạy tách biệt trên các process khác nhau, tuy vậy vẫn khó mà có thể tránh khỏi việc các ứng dụng cùng chia sẻ một phần mềm phụ thuộc. Ví dụ, chúng ta có nhiều project Laravel, các project này đều cần tới chương trình php được cài trong HĐH hoặc chúng ta có nhiều project NodeJS, các project này đều cần dùng tới node... Vấn đề sẽ trở lên khá phức tạp nếu một trong số các Project này bắt buộc cần tới một phiên bản php hoặc node khác. Chúng ta sẽ cần phải cấu hình HĐH làm sau để chạy được đồng thời nhiều process với các version khác nhau. Hơn nữa, thông thường để cài đặt được một chương trình trên HĐH như php, chúng ta lại cần phải cài một chuỗi các phần mềm phụ thuộc khác liên quan tới php.

Vừa rồi tôi mới chỉ nếu ví dụ cho 1 chương trình môi trường, hãy tưởng tượng chúng ta phải xử lý cho khoảng 5-10 chương trình như vậy. Giả định bạn tìm được cách cấu hình được toàn bộ môi trường đáp ứng được yêu cầu, thì đây vẫn là một công việc tốn thời gian và vẫn tiềm ẩn rất nhiều rủi ro.

Tiếp theo, bạn hãy nghĩ đến lúc hệ thống của chúng ta cần mở rộng để phục vụ được nhiều người dùng hơn, chúng ta phải tạo nhiều cụm máy chủ với môi trường giống hệt nhau để cân bằng tải. Chúng ta lại phải lặp lại công việc cài đặt phức tạp vừa rồi trên các máy tính mới. Điều đau đầu nhất đối với giải pháp này là khi một bước cài đặt nào đó có lỗi, chúng ta lại phải đi vào từng máy tính trong cụm máy chủ để thực hiện việc cấu hình lại. Giai đoạn sửa lỗi thực mới là giai đoạn tốn kém tài nguyên nhất.

Để giải quyết các vấn đề này, công nghệ ảo hóa ra đời (virtualization).
virtual_machine
Với giải pháp này, mỗi ứng dụng sẽ được đặt vào một môi trường máy ảo riêng, thêm vào đó chúng ta không phải quá khổ sở khi phải mở rộng hệ thống và sửa lỗi trong trường hợp môi trường bị cài đặt sai ở bước nào đấy. Trong trường hợp này, chúng ta chỉ việc copy máy ảo như copy file sang môi trường mới là xong.

Nhưng hãy để ý vào hình minh họa phía trên, mỗi một máy ảo lại ngốn thêm một lượng tài nguyên để chạy một hệ điều hành riêng, đây cũng chỉnh là một nhược điểm lớn khi sử dụng máy ảo. Chúng không thể chia sẻ tài nguyên (RAM/CPU) với hệ điều hành chính (Host OS). Do vậy, khi mà Docker tuyên bố có thể giải quyết ngon lành các vấn đề của Deployment, nhưng vẫn đảm bảo tiết kiệm tài nguyên, đó là lúc Docker tỏa sáng.
docker-container
Các Docker Container mang lại hiệu quả như máy ảo, tuy nhiên thông qua Docker Engine, từng Container chạy như một process trên Host OS, chúng chia sẻ tài nguyên với HostOS. Giải pháp này giúp tiết kiệm một lượng rất lớn tài nguyên trên máy chủ. Thêm vào đó, Docker còn cung cấp một hệ sinh thái các ứng dụng hỗ trợ cho quá trình tích hợp và chuyển giao liên tục (CI/CD), đây là một bộ công cụ hỗ trợ đắc lực cho phương pháp quản lý phần mềm bằng Agile. Để hiểu tại sao Agile cần tới CI/CD, mời bạn hãy đọc Scrum và XP từ những chiến hào.

Docker là gì?

docker-architecture-1-1
Để hiểu về Docker, chúng ta cần phân biệt các khái niệm Docker, Container. Nhiều anh em coi các khái niệm này là cùng chỉ một thứ, tuy nhiên Docker không phải là một Container và Docker cũng không phải là một tổ chức đã sáng tạo ra Container, khái niệm về Container được biết đến từ năm 2000 qua ứng dụng jail trên FreeBSD (Lịch sử Containers). Docker kế thừa các ưu điểm của giải pháp cũ và bổ sung vào đó hàng loạt các cải tiến khiến cho việc quản lý Container trở lên đơn giản hơn rất nhiều. Vậy nên, các bạn có thể hiểu Docker là một hệ thống quản lý Container, nó cho phép người dùng quản lý các Container dễ dàng hơn.

Image

Image chỉ đơn giản là một file thông thường, trong file này có chứa sẵn các chương trình cần thiết để khởi tạo một môi trường nào đó. Ví dụ Image apache thì trong đó đã có sẵn apache kèm theo một số chương trình tiện ích để thao tác với apache. Image php đã chứa sẵn php kèm theo một số chương trình tiện ích... Chiếu theo các đặc điểm này, chúng ta có thể coi Image là một cái khuân. Và khuân này được dùng để "đúc" ra các Container. Nói cách khác, Image được sử dụng để khởi tạo ra một hay nhiều Container. Sau đó, các Container này được cấu hình như thế nào cũng không làm ảnh hưởng tới Image ban đầu.

Mối quan hệ giữa Image và Container tương tự như mối quan hệ giữa ClassObject trong Lập trình hướng đối tượng - OOP.

Container

Có rất nhiều process được thực thi trong một HĐH, các process này đều dùng chung một nguồn tài nguyên từ OS và các process này đều có thể truy cập được vào dữ liệu của các process khác. Trong trường hợp chúng ta muốn chạy một hay nhiều process trên một môi trường tách biệt hoàn toàn với HĐH, chúng ta cần phải khởi tạo một loại môi trường gọi là sandbox environment. Sandbox environment chỉ đơn giản là khái niệm chỉ một loại môi trường quản lý các process hoàn toàn tách biệt với môi trường máy Host. Sandbox cho phép chúng ta giới hạn quyền truy cập và tài nguyên sử dụng của các process.
sandbox-icon-1

Container chính là một ví dụ cụ thể của sandbox environment. Về cơ bản Container gom các tiến trình bên trong nó và thực thi tách biệt với các process của Host OS. Docker sử dụng cơ chế namespacescontrol groups để tạo ra cơ chế quản lý Container.

Registry

Registry là một thư viện lưu trữ các Images được build sẵn từ các nhà phát triển. Docker cung cấp cho chúng ta một Registry có địa chỉ tại https://hub.docker.com. Không chỉ có Docker, mà có Google, M$, AWS, Digital Ocean cũng cung cấp cho chúng ta một nguồn Docker Image riêng.

Repository

Các Image có nhiều phiên bản, mỗi phiên bản được tổ chức thành một repository. Mỗi một repository là một URL chỉ đến một phiên bản của Image.

Kết luận

Hi vọng qua bài viết vừa rồi, các bạn đã có cái nhìn tổng quan về Docker, phân biệt được các khái niệm Docker, Container, Image, Registry, Repository. Trong bài tiếp theo, tôi sẽ chia sẻ với các bạn cách quản lý một Container như thế nào cho hiệu quả.

Các bạn hãy like 👍 page Hung TUT hoặc đăng ký để nhận thông báo theo form bên dưới khi có bài viết mới. Cám ơn các bạn.

Làm quen với các khái niệm cốt lõi liên quan tới Docker
Share this

Subscribe to HungTUT.com