Tìm hiểu về các khái niệm trong Docker

Docker là gì?

Gần đây khá nhiều người hỏi về Docker và cũng có nhiều dự án sử dụng Docker nên mình sẽ viết bài này để hướng dẫn các bạn về Docker cũng như các khái niệm đi kèm theo nó mà các bạn cần biết trước khi bắt tay vào làm. Khái niệm định nghĩa hay hướng dẫn trên mạng cũng như tài liệu chính thức có rất nhiều nhưng mình sẽ viết những gì mình hiểu không có trong tài liệu nhé.

Thông tin chung về Docker thì ở trang chủ: https://www.docker.com/ các bạn có thể truy cập và download bộ cài cũng như tìm hiểu tài liệu chính thức từ Docker.

Có khi nào bạn thấy là mình cần cài đặt hay chạy thử một phần mềm nào mà phải cài cả đống thứ đi kèm như Framework, SDK, SQL Server…hoặc để test một đoạn code thì phải cài nguyên cả SDK và IDE? Nếu chúng ta có một công cụ giúp đóng gói toàn bộ những thứ đó trong một cái file chỉ cần mang về bung ra là ta có cả môi trường lẫn cấu hình lý tưởng để chạy? Việc này giờ có thể làm được với Docker. Ví dụ mình cần chạy một ứng dụng ASP.NET Core trong đó có cả .NET Core SDK, code ứng dụng và cả SQL Server luôn. Để hỗ trợ một bạn khác chúng ta phải cài cả đống đó và cấu hình. Thay vào đó tôi có một tập lệnh run 1 cái thì toàn bộ SQL, .NET Core và ứng dụng đều chạy 1 lúc và tự động lên luôn ứng dụng. Như vậy rất dễ dàng phải không nào?

Vậy Docker là gì? Docker là một công nghệ, ở đây mình sử dụng từ ngữ này vì thấy nó là một bước tiến của công nghệ ảo hóa (virtualization) còn đây là công nghệ containerization (thùng chứa) dịch ra hơi bị chuối, vậy để nguyên là containerization. Nó cho phép chúng ta đóng gói toàn bộ phần mềm của bạn thành 1 khối bao gồm mã nguồn phần mềm đã biên dịch, các thành phần kèm theo (depedencies) và môi trường thực thi lại. Vậy là all in one những gì cần thiết để để thực thi một ứng dùng phải không nào? Vậy thì chúng ta có thể deploy nó lên bất cứ đâu để chạy rồi. Điều này giúp giảm rủi ro trong việc deployment đó là sự khác nhau giữa các môi trường thực thi. Ngày xưa chúng ta phải quan tâm đến việc đó, còn giờ thì đã có Docker lo.

Các bạn có thể thấy, ở công nghệ ảo hóa bên trái chúng ta chỉ dùng chung một máy thật cài hệ điều hành và cần có một bộ ảo hóa (Hypervisor) để giúp chúng ta cài thêm các con máy ảo, và chúng độc lập với nhau ở mức hệ điều hành. Còn với container chúng ta sử dụng chung 1 hệ điều hành và chạy chung trên 1 Docker Engine, ở đây Docker Engine sẽ giúp làm vệc và adapt với các sự khác nhau giữa các hệ điều hành. Ví dụ một ứng dụng chạy trên Windows chúng ta sẽ có Docker trên Windows và chạy trên Linux sẽ có Docker cho Linux lo việc đó.

Vậy chốt lại là ủy quyền việc thích nghi môi trường cho Docker lo, chúng ta chỉ cần đóng gói toàn bộ đồ đạc lại thành 1 bộ duy nhất và mang đi bất cứ đâu mà chúng ta muốn.

Docker Image

Vậy thứ mà chúng ta đóng lại gọi là gì? Nó là Docker Image, dịch ra thì cũng không ổn lắm nhưng nó là một bộ cài của ứng dụng của chúng ta bao gồm các mã nguồn đã đóng gói, các depedencies (ví dụ là các packages chúng ta sử dụng khi lập trình) và đóng gói luôn cả các cấu hình cũng như môi trường chạy.

Ở đây chúng ta cần tư duy theo hướng layer, một Docker Image sẽ có thể dùng các image khác để build lên nó, ví dụ khi chúng ta build một ứng dụng ASP.NET Core đương nhiên chúng ta cần thư viện của .NET Core. Vậy Base image sẽ là image của .NET Core, trên nó mới là layer code của ứng dụng của chúng ta. Cứ như vậy 1 image được xây lên từ nhiều lớp giống như xây nhà vậy. Hàng gạch từ dưới cùng là hàng gạch móng chính là base image được Microsoft phát hành. Trên nó sẽ là các image của chúng ta xây dựng. Chồng 2 lớp đó lên chúng ta sẽ có một image ứng dụng hoàn chỉnh.

Docker Container

Ok vậy khi đã có một bộ cài rồi thì chúng ta có thể mang nó đi bất cứ đâu để cài, cái này làm mình nhớ đến cái đĩa Ghost Windows mà bạn nào học IT cũng có thời ngồi vọc đúng không? Chính cái bản ghost đó đóng gói luôn cả bộ Windows và các phần mềm trong đó và cả các driver nữa. File ghost đó cũng giống như một Docker image vậy. Vậy là mang ra máy nào cũng chỉ cần bung bản ghost đó ra là xong. Docker cũng vậy, ta có image rồi vậy chỉ cần mang nó lên bất cứ máy nào bạn run image đó nó sẽ chạy như là bạn đã cài đặt nó trên máy của mình vậy. Và khi image được chạy nó sẽ chạy trong một container, container giống như thùng chứa, ứng dụng chúng ta sẽ chạy trong nó và đưa thông tin ra ngoài, nó hoàn toàn độc lập với môi trường xung quanh.

Trong thực tế khi có nhiều loại hàng hóa khác nhau với kích thước khối lượng khác nhau thì rất khó để chúng ta đóng gói và vận chuyển vì các phương tiện vận chuyển không biết thiết kế và xếp như thế nào. Người ta đã nghĩ ra một loại chuẩn để đóng gói hàng hóa giúp thuận tiện vận chuyển đó là Container. Tương tự như thế với thế giới IT, nó cũng được sử dụng để deploy các ứng dụng khác nhau, môi trường khác nhau và phần cứng khác nhau.

Docker Registry

Docker Registry nó giống như một thư viện chứa image, các image cần chia sẻ giữa các nơi sẽ được đưa lên đó, và các nơi khác nhau sẽ có thể lấy về để chạy, nó giống như một ổ đĩa chia sẻ trên mạng. Docker các bạn có một nơi chia sẻ rất nổi tiếng các image có sẵn là https://hub.docker.com/ bạn có thể tìm bất cứ Docker image public có sẵn nào trên đó để lấy về dùng. Bạn cũng có thể đưa các image của mình lên đó với tài khoản của bạn.

Đối với doanh nghiệp của bạn, nếu không dùng một public registry, bạn có thể tự cài cho mình một private registry để lưu trữ và quản lý image version của riêng mình.

Ví dụ: Đây là một image public giúp setup một private registry riêng cho bạn chỉ cần tuân theo hướng dẫn lấy về chạy là ra được một private registry dùng để lưu image dùng nội bộ rồi: https://hub.docker.com/r/stefanscherer/registry-windows/

Sơ đồ tương quan giữa các thành phần

Các image sẽ được để lên Docker registry (private hoặc public) sau đó bất cứ ai có thể truy cập đều lấy được image về và run trên Docker Deamon để chạy ứng dụng trong Container. Container sẽ được tạo ra khi chúng ta run image.

Cái mà chúng ta cài bao gồm Docker Client và Docker Deamon, Docker deamon chính là engine giúp quản lý và chạy Container và tương tác với OS. Nó là trái tim của Docker Engine.


Tác giả: Bạch Ngọc Toàn

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên