Container là gì? Image Container là gì?

Trong các năm gần đây, thuật ngữ container trong giới CNTT trở nên "hot" hơn bao giờ hết nhất là khi Docker hoặc Kubernetes chiếm đa số các chủ đề thảo luận tại các hội thảo về công nghệ, bài viết này sẽ cho các bạn hiểu chi tiết hơn về thuật ngữ này.

1. Container là gì?

Thuật ngữ container trong CNTT là một thứ khá trừu tượng, để dễ dàng hơn chúng ta sẽ lấy một ví dụ khá quen thuộc đó là "container" dùng để chở hàng trong lĩnh vực vận tải.

Container chở hàng

Trong suốt lịch sử, con người đã vận chuyển hàng hóa từ địa điểm này sang địa điểm khác bằng nhiều phương tiện khác nhau. Trước khi phát minh ra bánh xe, hàng hóa rất có thể đã được vận chuyển trong túi, giỏ hoặc rương trên vai của con người, hoặc họ có thể đã sử dụng động vật như lừa, lạc đà hoặc voi để vận chuyển chúng.

Với việc phát minh ra bánh xe, việc vận chuyển trở nên hiệu quả hơn một chút khi con người sẽ xây dựng những con đường mà họ có thể di chuyển những chiếc xe của mình dọc theo. Nhiều hàng hóa hơn có thể được vận chuyển tại một thời điểm. Sau đó, khi những máy chạy bằng hơi nước đầu tiên được giới thiệu và sau đó là động cơ chạy bằng xăng, việc vận chuyển càng trở nên mạnh mẽ hơn. Bây giờ chúng tôi vận chuyển một lượng lớn hàng hóa trong xe lửa, tàu và xe tải. Đồng thời, loại hàng hóa ngày càng trở nên đa dạng và đôi khi phức tạp để xử lý.

Trong thời gian dài, một điều không thay đổi đó là điều cần thiết để bốc dỡ hàng hóa tại điểm đến và có thể bốc dỡ chúng lên một phương tiện vận chuyển khác. Lấy ví dụ, một nông dân mang một giỏ táo đầy đến một nhà ga xe lửa trung tâm nơi táo được chất lên một chuyến tàu, cùng với tất cả những quả táo từ nhiều nông dân khác. Hoặc nghĩ về một nhà sản xuất rượu mang thùng rượu của mình bằng một chiếc xe tải đến cảng nơi chúng được dỡ xuống, sau đó được chuyển đến một con tàu sẽ vận chuyển thùng ra nước ngoài.

Việc dỡ hàng này từ một phương tiện vận chuyển và tải lên một phương tiện giao thông khác là một quá trình thực sự phức tạp và tốt chi phí. Mỗi loại hàng hóa được đóng gói theo cách riêng của nó và do đó phải được xử lý theo cách riêng của nó. Ngoài ra, hàng hóa lỏng lẻo có nguy cơ bị đánh cắp bởi những người lao động phi đạo đức, hoặc hàng hóa có thể bị hư hại trong quá trình này.

Sau đó, container đã xuất hiện!, và nó hoàn toàn cách mạng hóa ngành vận tải. Container chỉ là một hộp kim loại với kích thước tiêu chuẩn. Chiều dài, chiều rộng và chiều cao của mỗi container là như nhau. Đây là một điểm rất quan trọng. Nếu thế giới không có quy ước chung về kích thước tiêu chuẩn, toàn container sẽ không thành công và dùng rộng rãi như bây giờ.

Giờ đây, với các container được tiêu chuẩn hóa, các công ty muốn vận chuyển hàng hóa của họ từ A đến B sẽ đóng gói những hàng hóa đó vào các container này. Sau đó, họ gọi một người giao hàng đi kèm với một phương tiện tiêu chuẩn để vận chuyển. Đây có thể là một chiếc xe rơ moóc có thể tải một container hoặc một đoàn tàu mà mỗi toa xe của họ có thể vận chuyển một hoặc một vài container. Cuối cùng, chúng tôi có những con tàu chuyên vận chuyển một lượng lớn container. Các chủ hàng không bao giờ cần phải bốc dỡ và đóng gói lại hàng hóa. Đối với một người giao hàng, một container là một hộp đen và họ không quan tâm đến những gì trong đó và họ cũng không nên quan tâm trong hầu hết các trường hợp. Nó chỉ là một hộp sắt lớn với kích thước tiêu chuẩn. Việc đóng gói hàng hóa vào container hiện được ủy quyền đầy đủ cho các bên muốn vận chuyển hàng hóa của họ và họ nên biết rõ nhất về cách xử lý và đóng gói những hàng hóa đó.

Vì tất cả các container có hình dạng và kích thước được tiêu chuẩn hóa giống nhau, nên các chủ hàng có thể sử dụng các công cụ được tiêu chuẩn hóa để xử lý các container, đó là các cần cẩu dỡ container, từ tàu hoặc xe tải, và tải chúng lên tàu hoặc ngược lại. Một loại cần cẩu là đủ để xử lý tất cả các container đi cùng theo thời gian. Ngoài ra, các phương tiện giao thông có thể được tiêu chuẩn hóa, chẳng hạn như tàu container, xe tải và xe lửa.

Do tất cả các tiêu chuẩn hóa này, tất cả các quy trình liên quan vận chuyển hàng hóa cũng có thể được tiêu chuẩn hóa và do đó hiệu quả hơn nhiều so với trước thời đại của container.

Bây giờ bạn đã hiểu rõ về lý do tại sao các container trong lĩnh vực vận chuyển lại quan trọng như vậy và tại sao chúng lại cách mạng hóa toàn bộ ngành vận tải. Khái niệm "Container" trong lĩnh vực CNTT mà bài này sẽ giới thiệu ở đây hoàn thành vai trò chính xác trong chuỗi cung ứng phần mềm tương tự các container trong lĩnh vực vận chuyển làm trong chuỗi cung ứng hàng hóa vật lý.

Linux Container

Vào thời trước đây, các nhà phát triển phần mềm sẽ phát triển một ứng dụng mới. Khi ứng dụng đó được hoàn thành trong theo mong đợi, họ sẽ bàn giao ứng dụng này cho các kỹ sư vận hành mà sau đó sẽ được cài đặt nó trên các máy chủ và triển khai nó. Nếu các kỹ sư vận hành đã may mắn, họ thậm chí còn có được một tài liệu có phần chính xác với hướng dẫn cài đặt từ các nhà phát triển.

Nhưng mọi thứ đã vượt quá tầm kiểm soát 😢 trong các công ty lớn, nơi có nhiều nhóm nhà phát triển tạo ra các loại ứng dụng khá khác nhau, nhưng tất cả đều cần được cài đặt trên cùng một máy chủ đang chạy môi trường production . Thông thường, mỗi ứng dụng có một số phụ thuộc (dependencies) bên ngoài như framework hoặc thư viện nào nó sử dụng, v.v. Đôi khi, hai ứng dụng sẽ sử dụng cùng framework trong các phiên bản khác nhau có thể hoặc không thể tương thích với nhau. Công việc của các kỹ sư vận hành trở nên khó khăn hơn theo thời gian. Họ phải thực sự sáng tạo về cách họ triển khai các ứng dụng này, tất nhiên đó là máy chủ của họ với các ứng dụng khác nhau mà không phá vỡ thứ gì đó.

Việc triển khai (deployment) phiên bản mới của một ứng dụng nhất định giờ đây là một công việc khá phức tạp và thường cần nhiều tháng để lập kế hoạch và thử nghiệm. Nói cách khác, có rất nhiều sự va chạm trong chuỗi cung ứng phần mềm. Nhưng ngày này, các công ty phụ thuộc ngày càng nhiều vào phần mềm và các chu kỳ phát hành trở nên ngắn hơn và ngắn hơn, đặc biệt khi họ phát triển theo phương pháp Agile. Các ứng dụng cần được cập nhật trong vài tuần hoặc vài ngày, hoặc đôi khi thậm chí nhiều lần mỗi ngày. Vậy, giải pháp là gì?

Cách tiếp cận đầu tiên là sử dụng máy ảo (VM). Thay vì chạy nhiều ứng dụng trên cùng một máy chủ, các công ty sẽ đóng gói và chạy một ứng dụng cho mỗi VM. Với nó, các vấn đề tương thích đã biến mất và cuộc sống dường như tốt đẹp trở lại. Thật không may, hạnh phúc đã không tồn tại lâu cho các kỹ sư vận hành 😔. VM là những thứ khá nặng vì chúng đều chứa một hệ điều hành toàn diện như Linux hoặc Windows Server và tất cả chỉ cho một ứng dụng. Điều này giống như trong ngành vận tải, bạn sẽ sử dụng một con tàu khổng lồ chỉ để vận chuyển một xe tải chở chuối. Thật là một sự lãng phí. Điều đó không bao giờ có thể có lợi nhuận.

Giải pháp cuối cùng cho vấn đề là cung cấp thứ gì đó nhẹ hơn nhiều so với VM nhưng cũng có thể đóng gói hoàn hảo hàng hóa cần thiết để vận chuyển 👌. Ở đây, hàng hóa là ứng dụng thực tế được viết bởi các nhà phát triển (và điều này rất quan trọng) tất cả các phụ thuộc bên ngoài của ứng dụng, như framework, thư viện, các cấu hình cấu hình, v.v. Giải pháp của một cơ chế đóng gói phần mềm là "container".

Do đó, các "container" là một phương tiện để đóng gói các ứng dụng và các phụ thuộc của chúng theo cách được tiêu chuẩn hóa theo khẩu hiệu "Xây dựng, Giao và Chạy ở Bất Cứ Đâu!"

2. Lợi ích của container

Như đã nói ở trên, container là một cách để đóng gói phần mềm cùng với các tệp cấu hình, phụ thuộc và binary cần thiết để triển khai phần mềm trên mọi môi trường hoạt động. Việc này mang lại một số lợi ích quan trọng như sau:

2.1. Tính nhất quán của môi trường(Environment consistency)

Các ứng dụng / tiến trình / microservice chạy trên các container hoạt động nhất quán trong các môi trường khác nhau (dev, testing, stagging, và production). Điều này giúp loại bỏ bất kỳ loại mâu thuẫn môi trường nào, làm cho việc testing và debugging ít cồng kềnh và ít tốn thời gian hơn.

2.2. Triển khai(deployment) nhanh hơn

Triển khai nhanh chóng

Một container rất nhẹ và khởi động chỉ mất vài giây, vì không bắt buộc phải khởi động bất kì hệ điều hành nào cả. Điều này cuối cùng giúp đạt được khởi tạo, triển khai nhanh hơn và tính sẵn sàng cao.

2.3. Tính cô lập(Isolation)

Cô lập tiến trình trên Linux

Các container chạy trên cùng một máy sử dụng cùng một tài nguyên được cô lập với nhau. Khi chúng ta bắt đầu khởi chạy một container với lệnh docker run, nền tảng Docker thực hiện một vài điều thú vị đằng sau hậu trường. Đó là, Docker tạo ra một tập hợp namespaces và cgroups cho container. Các namespaces và cgroups là các chức năng ở mức kernel-level của Linux. Vai trò của namespaces là cung cấp sự cô lập(isolation) cần thiết cho container được tạo gần đây với các container khác đang chạy trong cùng máy chủ. Ngoài ra, các container được phân tách rõ ràng từ Docker. Sự tách biệt này rất tốt cho các container để an toàn và bảo mật hơn. Ngoài ra, sự tách biệt duy nhất này đảm bảo rằng mọi phần mềm độc hại, vi rút hoặc bất kỳ cuộc tấn công nào trên một container không lan truyền sang các container đang chạy khác. Nói tóm lại, các tiến trình(process) chạy trong một container không thể nhìn thấy và ảnh hưởng đến các tiến trình đang chạy trong một container khác hoặc trong cùng máy chủ.

Namespaces và Cgroups trên Linux

Tuy nhiên không có gì là tuyệt đối cả 😈. Container sử dụng những tính năng sẵn có của Linux kernel để dùng vào việc giới hạn và cô lập các tiến trình khá đơn giản, tuy nhiên nó cũng tạo ra những thách thức lớn về vấn đề bảo mật vì hầu hết các container runtime như Docker, runc, rkt không phải là một "sandbox" thật thụ, vấn đề bảo mật này hiện đang được khắc phục bằng cách kết hợp selinux, seccomp hay apparmor, hoặc những dự án rootless container.

2.4. Tính di động(Portability)

Tính di động

Container có thể chạy ở mọi nơi. Chúng có thể chạy trong máy tính xách tay của nhà phát triển, trên những chiếc máy tính siêu nhỏ Raspberry Pi, hoặc máy chủ doanh nghiệp cấu hình cực cao và cloud. Đó là, mục tiêu lâu dài của việc viết một lần và chạy khắp mọi nơi(write once and run everywhere) đang được thực hiện thông qua phong trào container hóa.

Có những lợi thế quan trọng khác của container hóa(containerization). Có những sản phẩm và nền tảng tạo điều kiện cho sự hội tụ tuyệt vời của container hóa và ảo hóa để phục vụ cho nhu cầu CNTT mới nổi.

3. Lời kết

Bài viết trên đã cho bạn thấy một cái nhìn khái quát về thuật ngữ "container" mà chúng ta vẫn dùng hằng ngày và công dụng của nó trong khâu phát triển, triển khai và vận hành một phần mềm trong vòng đời của nó.