Tìm hiểu về Docker Containers và Azure Container Service (Phần 1)

Trong quá trình làm phần mềm, mình tin chắc rằng nhiều bạn đã từng gặp phải vấn đề như sau: Đóng vai trò bạn là một lập trình viên, sau khi hoàn thiện sản phẩm, bạn chỉnh chu và đóng gói rất cẩn thận sản phẩm và chuyển sang cho bên tester để họ test, tuy nhiên oái oăm thay sản phẩm bạn chuyển sang cho tester lại không chạy ổn định hoặc thậm chí là không thể chạy nổi trên máy của họ mặc dù trước khi đóng gói & chuyển giao thì bạn đã kiểm tra rất kỹ lưỡng. Vấn đề nằm ở đâu? Hóa ra là môi trường của 2 máy của bạn và tester rất khác nhau, bạn xây dựng sản phẩm chạy trên .NET Framework 4.5 trong khi máy tester chỉ cài .NET Framework 2.0, sản phẩm của bạn sử dụng một số API từ thư viện Office Primary Interop Assemblies của Office 2013 tuy nhiên máy của tester lại chỉ cài Office 2003, và rất nhiều nguyên nhân “củ chuối” khác thậm chí nhiều nguyên nhân không phải do khác phiên bản phần mềm, thư viên mà liên quan đến cấu trúc mạng khác nhau, policy bảo mật khác nhau của 2 máy. Vậy làm thế nào để giảm thiểu những vấn đề phát sinh liên quan đến sự phụ thuộc của phần mềm vào môi trường của hệ thống khi chuyển giao? Câu trả lời là công nghệ ảo hóa!

Bài viết ngày hôm nay mình sẽ chia sẻ với các bạn về một công nghệ ảo hóa đang “làm mưa làm gió” trong cộng đồng cộng nghệ trên Thế giới, công nghệ đó có tên là “Container“. Ngoài ra, trong bài viết này mình cũng sẽ giới thiệu về dịch vụ Azure Container Service, một dịch vụ cho phép triển khai và quản lý các container trên Microsoft Azure một cách hiệu quả.

Container là gì?

Container là giải pháp để giải quyết vấn đề làm sao để chuyển giao phần mềm một cách đáng tin cậy (không phát sinh lỗi) giữa các môi trường máy tính khác nhau. Chẳng hạn như giữa máy tính của lập trình viên với máy của tester, giữa môi trường staging (hay còn được gọi là môi trường tiền thực tế) với môi trường thực tế hay thậm trí giữa máy chủ riêng đặt tại trung tâm dữ liệu với máy ảo trên cloud.

Container giải quyết vấn đề trên bằng cách tạo ra một môi trường bị cô lập (isolated) chứa mọi thứ mà phần mềm cần để có thể chạy được bao gồm mã nguồn, các thư viện runtime, các thư viện hệ thống, các công cụ hệ thống, … (gọi là sự phụ thuộc hoặc các phụ thuộc) mà không bị các yếu tố liên quan đến môi trường hệ thống làm ảnh hưởng tới cũng như không làm ảnh hưởng tới các phần còn lại của hệ thống.

Đặc điểm kỹ thuật của container

Trên là mô hình kiến trúc của container bao gồm các thành phần chính là server (máy tính vật lý hoặc máy ảo), host OS (hệ điều hành cài đặt trên server) và các container.

container-structure

Mỗi một ứng dụng (App A và App B) sẽ có những sự phụ thuộc riêng của nó bao gồm cả về phần mềm (các dịch vụ hay thư viện) lẫn cả về phần cứng (CPU, bộ nhớ, lưu trữ). Các ứng dụng này sẽ được Container Engine, một công cụ ảo hóa tinh gọn, được cài đặt trên host OS, nó sẽ cô lập sự phụ thuộc của các ứng dụng khác nhau bằng cách đóng gói chúng thành các container. Các tiến trình (process) trong một container bị cô lập với các tiến trình của các container khác trong cùng hệ thống tuy nhiên tất cả các container này đều chia sẻ kernel của host OS (dùng chung host OS).

Với mô hình trên, sự phụ thuộc của ứng dụng vào tầng OS cũng như cơ sở hạ tầng được loại bỏ giúp việc triển khai phương pháp “deploy anywhere” (triển khai ở bất kỳ nơi đâu) của container được hiệu quả hơn. Thêm vào đó, do chia sẻ host OS nên container có thể được tạo gần như một cách tức thì, giúp việc scale-up & scale-down theo nhu cầu được thực hiện một cách nhanh chóng.

Container khác gì so với máy ảo (Virtual Machine – VM)?

Cùng xét mô hình kiến trúc của VM: Mỗi ứng dụng được ảo hóa bao gồm chính ứng dụng đấy và cũng chứa các phụ thuộc của nó giống như bên container. Tuy nhiên bên VM sẽ kèm theo thêm 1 guest OS. Điều này dẫn tới việc đóng gói ứng dụng được ảo hóa sẽ có dung lượng lên tới hàng GB.

virtual-machine-structure

Khác với container là chia sẻ host OS đồng nghĩa với việc các container sẽ có OS giống nhau thì với máy ảo, mỗi một VM có thể có OS khác so với các VM khác và thậm trí OS của các VM hoàn toàn có thể khác với host OS.

Xét về tính linh hoạt: Nếu như bạn muốn bảo trì máy host, với container thì khi bảo trì mà buộc phải khởi động lại máy thì đồng nghĩa với việc hoạt động của các container có trong máy đó sẽ bị gián đoạn. Tuy nhiên với VM, bạn hoàn toàn có thể di chuyển các VM có trong máy cần được bảo dưỡng sang tạm các máy tính khác. Điều này giúp ứng dụng có trong các VM hoạt động mà không bị gián đoạn.

Xét về tính an toàn: Với container, do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy. Ngoài ra hãy thử tưởng tượng với host OS là Linux, nếu trong trường hợp ai đấy hoặc một ứng dụng nào đấy có trong container chiếm được quyền superuser, điều gì sẽ xảy ra? Về lý thuyết thì tầng OS sẽ bị crack và ảnh hưởng trực tiếp tới máy host bị hack cũng như các container khác trong máy đó (hacker sử dụng quyền chiếm được để lấy dữ liệu từ máy host cũng như từ các container khác trong cùng máy host bị hack chẳng hạn). Với VM thì sẽ khó hơn, ứng dụng trong các VM chạy với các guest OS riêng biệt của chúng và giao tiếp với host OS thông qua hypervisor, về lý thuyết thì hypervisor vẫn có khả năng có những lỗ hổng để hacker khai thác nhưng vì nó không có nhiều chức năng như một kernel của OS (thông thường hypervisor chỉ có các chức năng cơ bản như kết nối mạng, quản lý tiến trình ứng dụng, …) nên kể cả khi hypervisor có bị hack vào thì cũng khó có thể gây ra các hậu quả nghiệm trọng như lấy được dữ liệu từ các VM chẳng hạn.

Với những tính năng ưu việt riêng của từng công nghệ ảo hóa, các nhà phát triển có thể nghĩ đến việc “trộn” 2 công nghệ ảo hóa này với nhau để xây dựng một giải pháp ảo hóa linh hoạt và an toàn hơn bằng cách triển khai các container trong máy ảo.

Container trong Máy Ảo (Virtual Machine)

Với việc triển khai các container trong máy ảo, chỉ với một máy host, các nhà phát triển có thể triển khai được nhiều container chạy trên các hệ điều hành khác nhau bằng việc khai thác đặc tính của VM là mỗi VM có một guest OS chạy riêng biệt.

containers-in-virtual-machines

Với những dự án đòi hỏi phải ảo hóa một lượng lớn ứng dụng, việc sử dụng ít VM và dùng nhiều container sẽ giúp giảm chi phí cho việc lưu trữ.

Ngoài ra, việc triển khai các container trong máy ảo cũng giúp tăng tính linh hoạt của các container khi mà việc bảo dưỡng máy host không còn là “cơn ác mộng” với các ứng dụng trong container nữa.

Tại sao container lại đang được quan tâm nhiều đến vậy?

Với đặc tính nhanh gọn của mình, container rất phù hợp với xu hướng phát triển phần mềm hiện đại ngày nay khi mà yếu tố thời gian được đặt lên hàng đầu. Ngoài ra, container sử dụng công nghệ triển khai cũng như định dạng đóng gói thống nhất (unified), chỉ cần cài đặt Container Engine vào các máy cần tạo/dùng container và người dùng hoàn toàn yên tâm có thể sử dụng được các container được đóng gói một cách dễ dàng. Và còn một điểm cũng rất quan trọng để hút được sự quan tâm đó là container được sự hỗ trợ rất lớn từ cồng đồng công nghệ như Ubuntu, Redis, WordPress, …

Giới thiệu Docker – Container Engine mã nguồn mở

Docker là một dự án mã nguồn mở, phát triển các công cụ, dịch vụ về container như Docker Engine – Container Engine của Docker hay Docker Hub – Giống với NuGet, nơi chia sẻ các thư viện phần mềm, Docker Hub là nơi để lập trình viên chia sẻ các Docker image của họ.

docker

Docker image là nền tảng của container, có thể hiểu Docker image như là một template của container, nó sẽ tạo ra container khi thực hiện câu lệnh chạy image đó. Nếu nói với ngôn ngữ lập trình hướng đối tượng, Docker image là class, còn container là thực thể (instance) của class đó.

Docker hỗ trợ nhiều nền tảng hệ điều hành khác nhau bao gồm Linux, Windows và cả Mac. Ngoài ra, Docker còn hỗ trợ nhiều dịch vụ điện toán đám mây nổi tiếng như Microsoft Azure hay Amazon Web Services. Vậy Docker hoạt động như thế nào? Hãy xem phần demo của mình bên dưới demo về cách dùng Docker để tạo và sử dụng container trên Linux.

Phạm Dũng

Anh Phạm Dũng là chuyên gia các giải pháp phát triển công nghệ Microsoft, hiện đang giữ vị trí Technical Evangelist tại Microsoft Việt Nam. Anh Dũng có 5 năm kinh nghiệm phát triển phần mềm, đặc biệt là trên các platform và sản phẩm của Microsoft. Đến với AzureVN.NET, anh Dũng hi vọng sẽ chia sẻ về các kinh nghiệm, thông tin về Microsoft Azure và hướng tiếp cận để phát triển trên nền tảng Azure.

lion-pham has 7 posts and counting.See all posts by lion-pham

Leave a Reply

Your email address will not be published. Required fields are marked *