Công nghệ container, hay gọi đơn giản là container, là một phương pháp đóng gói ứng dụng để ứng dụng có thể chạy với các phụ thuộc của mình (gồm source code và library, runtime, framework…) một cách độc lập, tách biệt với các chương trình khác. Các nhà cung cấp dịch vụ đám mây lớn hiện nay đã cung cấp các dịch vụ dành cho việc quản lý container để hỗ trợ việc xây dựng ứng dụng sử dụng công nghệ container.
Container là gì?
Container được đặt tên theo thuật ngữ container của ngành vận tải biển vì có cùng chung ý tưởng với nhau. Thay vì chỉ vận chuyển từng sản phẩm, hàng hóa được đặt vào các thùng hàng bằng thép, được thiết kế theo các tiêu chuẩn phù hợp về kích thước và trọng tải để có thể cẩu lên bến tàu và lắp vào con tàu. Như vậy, bằng cách tiêu chuẩn hóa quy trình và nhóm các thành phần liên quan lại với nhau, từng container sẽ được chuyển đi riêng lẻ và sẽ tốn ít chi phí hơn để làm theo cách này.
Trong công nghệ, tình huống cũng khá tương tự. Một chương trình chạy hoàn hảo trên một máy, nhưng khi chuyển sang máy khác thì lại trở nên hỗn loạn? Điều này có thể xảy ra khi di chuyển phần mềm từ PC của developer sang test server hoặc từ server vật lý sang cloud server. Các vấn đề phát sinh khi di chuyển phần mềm là do sự khác biệt giữa các môi trường máy tính, chẳng hạn như OS, thư viện SSL, storage, bảo mật và cấu trúc mạng trên các máy khác nhau sẽ khác nhau.
Giống như việc toàn bộ 1 container sẽ được nhấc lên tàu hoặc xe tải để vận chuyển, công nghệ container cũng như vậy. Container không chỉ chứa phần mềm mà còn chứa các phần phụ thuộc bao gồm các library, binary và file cấu hình cùng với nhau và chúng được di chuyển như một bộ phận, để tránh sự không tương thích và sự cố. Các container giúp việc triển khai phần mềm lên máy chủ thuận lợi hơn.
Trước khi các container dần được ưa chuộng, máy ảo VM là một phương pháp sử dụng phổ biến. Ở phương pháp này, một máy chủ vật lý có thể được sử dụng cho nhiều ứng dụng thông qua công nghệ ảo hóa, còn được gọi là virtual machine, trong đó mỗi máy ảo chứa toàn bộ hệ điều hành, cũng như các ứng dụng cần thiết để chạy.
Sử dụng Container và máy ảo trong thực tế
Về cấu trúc
VM, hay Virtual Machine/máy ảo là một phiên bản tóm tắt của máy tính, từ hệ điều hành cho đến bộ nhớ và lưu trữ. Image dùng để tạo một VM có thể tương tự hệ điều hành để cài đặt ứng dụng lên hoặc có sẵn tất cả các ứng dụng bạn cần, như web server và database, thậm chí cả chính ứng dụng của bạn. Mỗi VM sẽ hoạt động độc lập hoàn toàn với máy chủ mà VM chạy trên đó, cũng như độc lập với bất kỳ VM nào khác trên máy chủ đó.
Trong khi đó, container sẽ chạy một phần của máy hiện có, chia sẻ kernel của máy chủ đó với bất kỳ container nào khác đang chạy trên hệ thống. Chỉ chứa vừa đủ hệ điều hành và bất kỳ thư viện hỗ trợ nào cần thiết để chạy code. Container được xây dựng từ những image bao gồm mọi thứ nó cần – và không có gì khác (trong TH lý tưởng nhất).
Nhu cầu tài nguyên
Do cấu trúc khác nhau nên nhu cầu để chạy VM và container có thể khác nhau đáng kể. Bởi vì về cơ bản VM tương đương với toàn bộ một máy tính, nên đương nhiên sẽ cần nhiều tài nguyên hơn là một container, trong khi container chỉ cần đến một phần nhỏ nhất của hệ điều hành. Tóm lại, việc mở rộng các container sẽ ít tốn tài nguyên, thời gian, công sức hơn và có thể “xếp” nhiều container hơn trên một máy chủ duy nhất.
Tuy nhiên, cần hết sức lưu ý là vì nhiều dịch vụ có thể “chia sẻ” tài nguyên của một máy ảo duy nhất, có thể có những trường hợp phức tạp trong đó cần thiết phải mở rộng nhiều container để thay thế một máy ảo duy nhất. Điều này dẫn đến việc kiểm soát tài nguyên không còn nhiều ý nghĩa. Ví dụ: nếu bạn tách một máy ảo đơn lẻ thành 50 dịch vụ khác nhau, thì đó là 50 bản sao một phần của hệ điều hành so với một bản sao đầy đủ. Vì vậy, điều quan trọng là cần hiểu chính xác để lựa chọn đúng.
Ưu và nhược điểm của các VM
Mặc dù sự chuyển dịch lên mô hình container đã được dự báo, tuy nhiên, có những lợi ích và hạn chế chúng ta vẫn cần cân nhắc để biết khi nào không nên dùng container và thay đó sử dụng VM.
Ưu điểm
- Bản sao toàn phần hệ thống: Bởi vì tất cả các thành phần của ứng dụng đang chạy trên cùng một “server” hoặc các server, nên việc giao tiếp giữa chúng rất đơn giản, không cần thêm kết nối mạng phức tạp. Do đó production và dev trên VM trở nên đơn giản hơn nhiều.
- Không cần phân tách ứng dụng: Vì chạy trong môi trường tương tự như máy vật lý, nên không cần phải thay đổi kiến trúc của ứng dụng
- Chạy nhiều ứng dụng cùng lúc: Việc chạy được nhiều ứng dụng trên cùng một máy ảo giúp quản lý toàn bộ cơ sở hạ tầng phía dưới trở nên đơn giản hơn nhiều.
- Bảo mật khá tốt: Máy ảo có lịch sử sử dụng lâu dài và được coi là khá an toàn, cung cấp khả năng cách ly với bề mặt tấn công khá nhỏ, mặc dù bạn nên lưu ý các cảnh báo trong phần “Bảo mật” ở trên (và bên dưới).
Nhược điểm
- Có thể có kích thước lớn: Bởi vì các VM chứa rất nhiều các hình ảnh cần thiết để định nghĩa và cả tài nguyên cần thiết để chạy chúng nên các máy ảo có thể rất lớn.
- Có thể khởi động và vận hành chậm: Khởi động máy ảo cũng giống như khởi động máy tính; việc cài đặt, triển khai mất nhiều công sức và thời gian. Nếu bạn đang xử lý một công việc phải liên tục thay đổi, thì độ trễ này chắc chắn có thể là một vấn đề.
- Hiệu suất có thể không đảm bảo: Các môi trường phát triển ứng dụng dev/test/staging/production dễ rơi vào tình trạng thiếu nhất quán làm cho việc kiểm soát chất lượng production kém.
Khi chạy nhiều ứng dụng trên một máy chủ dễ gây conflict với nhau.
Ưu và nhược điểm của container
Hiểu về các ưu và nhược điểm của container, chúng ta có thể cân nhắc khi nào nên hoặc không nên sử dụng container.
Ưu điểm
- Có kích thước nhỏ và nhẹ: Các container chia sẻ kernel của máy chủ lưu trữ, chúng chỉ chứa các thành phần thực sự cần thiết với hệ điều hành và thư viện. Đồng thời các container thường cũng chỉ giới hạn ở một chức năng duy nhất, nên có kích thước rất nhỏ. Nhờ vậy, việc xây dựng, triển khai cực kỳ nhanh chóng.
- Triển khai nhanh: Do kích thước nhỏ, các container có thể chỉ cần vài giây để khởi động, thậm chí là ít hơn, nên rất thích hợp cho các ứng dụng cần được đẩy lên và xuống liên tục, chẳng hạn như các ứng dụng “serverless”.
- CI/CD: Các container được thiết kế để có thể start và restart thường xuyên, nhờ vậy mà dễ dàng tiếp nhận các thay đổi.
- Có tính di động: Với thiết kế độc lập, việc di chuyển container giữa các máy có thể thực hiện tương đối dễ dàng, miễn là đúng vị trí kernel.
- Đảm bảo tính nhất quán: Giải pháp đóng gói ứng dụng bao gồm source code và các library, framework,… một lần duy nhất và đem chạy ở bất kỳ đâu.
Nhược điểm
- Có thể yêu cầu kết nối mạng phức tạp: Thường thường các chức năng sẽ được chia thành nhiều container và cần phải giao tiếp với nhau. Việc số lượng rất nhiều các container phải giao tiếp với nhau có thể phức tạp. Một số hệ thống điều phối như Kubernetes có các multi-container pods giúp việc trao đổi dễ dàng hơn một chút, nhưng được cho là vẫn phức tạp hơn so với sử dụng máy ảo. Thực tế thì mô hình mạng L3 trong Kubernetes đơn giản hơn nhiều so với mô hình L2 trong hạ tầng máy ảo OpenStack. Vì vậy, vấn đề nằm ở chỗ cần xác định được việc giao tiếp xảy ra giữa các chức năng hay giữa các máy ảo.
- Có thể bảo mật kém: Container vẫn là một công nghệ tương đối non trẻ và chưa đạt được mức độ bảo mật như VM, vậy nên nếu yêu cầu bảo mật cao là tối quan trọng thì đây là 1 trong những yếu tố cần cân nhắc có nên hay không sử dụng container.
- Có thể cần thao tác nhiều hơn so với máy ảo: Nếu sử dụng container, bạn sẽ phân tách ứng dụng thành các dịch vụ thành phần khác nhau, mặc dù việc này có ích lợi nhưng lại không cần thiết khi sử dụng VM.
- Container rõ ràng là sở hữu nhiều ưu điểm vượt trội khi nói tới khả năng xây dựng và phát triển ứng dụng mạnh mẽ, tiện ích, tiết kiệm rất nhiều giờ và công sức làm việc cho các nhà phát triển, các team, doanh nghiệp. Mặc dù vẫn còn những khuyết điểm cần lưu tâm như cô lập không hoàn toàn, bảo mật kém hơn, network giữa các container phức tạp, nhưng sự xuất hiện của công cụ điều phối mạnh mẽ như Kubernetes đã giúp hóa giải những băn khoăn của người dùng.
Tổng hợp