Sự khác nhau giữa server có containerization và server không containerization
Rảnh rỗi nghe ông em rủ rê vào chém gió một tẹo :v
Về mặt khái niệm mà nói, containerization là việc mình đóng gói (bundle) chương trình ( application, ở trong câu hỏi của bạn gọi là server ) cùng với những thiết lập mà chương trình đó yêu cầu ( ví dụ như những file cấu hình, các gói thư viện, các dependencies cần phải có ) vào chung với nhau, để có thể đem ra sử dụng một cách ổn định, ít phụ thuộc nhất có thể vào các yếu tố môi trường máy khác. Docker là một lựa chọn khá phổ biến cho việc containerize ứng dụng của mình, nên ở đây mình sẽ lấy Docker làm ví dụ nhé ( nếu chưa rành thì bạn nên tìm hiểu thêm về Docker : khái niệm nó là gì, cách hoạt động ... Đọc hiểu xong về Docker thì mình nghĩ là cũng đủ để trả lời câu hỏi về cách sử dụng rồi đó.)
Còn về hiệu quả thì bạn cứ so sánh giữa việc có dùng Docker và không dùng Docker để minh họa cho dễ thấy. Khi không containerize, nghĩa là nếu bạn muốn deploy con server của mình lên đâu, bạn sẽ phải làm thủ công rất nhiều các công đoạn: cài đặt môi trường, cài đặt các thư viện cần dùng, cấu hình các thành phần trong server của mình như nginx, mysql để mọi thứ kết nối được đến với nhau ... Khá dễ để thấy là việc containerize sẽ giúp cho việc cài đặt đơn giản và dễ dàng hơn, ít xảy ra sai sót hơn ( chỉ cần cấu hình docker một lần lúc đầu chuẩn là được, sau đó đem đi đâu triển khai cũng nhanh ). Ngoài ra, vì tất cả những gì cần thiết cho chương trình của mình đã cùng được đóng gói vào trong một cục container, nên sẽ không sợ chương trình chạy không ổn định do các yếu tố môi trường máy khác ( kiểu chạy ở máy này lỗi mà máy kia không lỗi )
Có một lợi ích khác của containerization, đó là việc dễ dàng module hóa và tái sử dụng ( cái này không hẳn là chỉ thông qua containerization thì mới làm được, nhưng thực hiện nó ở đây thì thuận lợi hơn). Vì việc đóng gói những gì vào trong một container là do mình quyết định, nên bạn hoàn toàn có thể chia chương trình của bạn thành những module riêng, mỗi cái là một container. Ví dụ như bạn thấy hầu hết các dự án mình làm đều dùng chung một stack gồm laravel - mysql - nginx , bạn có thể đóng gói những phần này vào trong một container. Hay nếu như công việc của bạn mỗi lúc lại phải làm việc với một framework, bạn có thể đóng gói riêng phần database và web server vào chung một container để sử dụng chung giữa các dự án.
Lan man thêm một chút là ở trên thấy có bạn nói sang máy ảo. Thật ra cũng khá nhiều người hay so sánh hay đánh đồng giữa container và máy ảo vì cách sử dụng của hai khái niệm này khá giống nhau : Cùng là bạn build ra sẵn một cái image/box/disc ..., sau đó đem về dùng, chương trình của mình sẽ chạy trên cái nền này, và không phụ thuộc vào môi trường máy của bạn. Tuy nhiên, về bản chất, chúng khá là khác nhau. Container là mô phỏng của một ứng dụng phần mềm, còn máy ảo (virtual machine) đúng như tên gọi của nó là mô phỏng của một chiếc máy tính. Bạn có thể chạy nhiều container, cũng như có thể chạy nhiều máy ảo trên cùng một máy tính, nhưng với container, mỗi container sẽ có một process riêng nhưng vẫn chạy chung trên nền là hệ điều hành của máy tính của mình. Còn VM, mỗi VM sẽ có một hệ điều hành riêng, và các VM này cùng dùng chung tài nguyên phần cứng của máy tính của mình. Có thể hình dung ( một cách tương đối gần đúng), VM là một khái niệm rộng hơn, bao trùm ra ngoài container. Và về mặt hiệu năng, dù vẫn còn một số ý kiến phản đối, nhưng đa số mọi người đều nhận định, container nhẹ hơn ( sử dụng ít tài nguyên máy hơn, vì ít nhất là nó không phải dựng thêm 1 hệ điều hành riêng cho mình ), và chạy nhanh hơn so với việc sử dụng VM