Tìm hiểu về Docker - Phần 1 - Container

Mở đầu

Docker là một ứng dụng mang lại lợi ích cho cả SysAdmin, Developer (Dev) lẫn Devops.

Theo cá nhân mình đánh giá, việc sử dụng Docker với những người đã có kiến thức nền tảng vững vàng từ trước thì sẽ vô cùng nhanh chóng. Nhưng đối với những người chưa có kiến thức vững vàng, việc sử dụng docker, tận dụng lại các app, các chương trình được đóng gói sẵn sẽ làm giảm khả năng hiểu biết về luồng lạch hệ thống.

Trong bài viết trước, mình đã Hướng dẫn cài đặt Docker trên Ubuntu 18.04 và giới thiệu một số các câu lệnh. Vì vậy, bài viết này sẽ là bài viết đầu tiên trong chuỗi bài viết Tìm hiểu về Docker của mình. Cùng bắt đầu nhé !

1. Container

Tại sao lại nói về container khi nói đến Docker? Docker là một ứng dụng dựa vào và cải tiến lại các tính năng có sẵn của Linux kernel, trong đó bao gồm Linux container (LXC), cgroup, namespaces…

Khái niệm container được nhắc đến ở đây không phải là công-ten-nơ trong ngành vận tải =)) Nó là một phương thức ảo hóa được Linux Containers (LXC) sử dụng đầu tiên để ảo hóa đến mức hệ điều hành giúp chạy nhiều hệ thống cô lập và được điều khiển bởi một kernel duy nhất dựa trên các tính năng có sẵn của Linux kernel như namespace, cgroup…

2. Sự ra đời của Containerlization

Khi đó chưa có khái niệm VM hay VPS, mỗi máy chủ là một máy vật lý. Vấn đề gặp phải ở đây là nó chỉ chạy được một hệ điều hành duy nhất, không tận dụng được hết công suất.

Chưa kể quá trình nâng cấp, mở rộng vô cùng phức tạp và mất thời gian cộng với việc tốn thêm cả đống chi phí nữa. Điều này làm đau đầu các doanh nghiệp khi vừa muốn giảm thiểu chi phí lại vừa muốn nâng cao chất lượng dịch vụ.

Và... Ảo hóa ra đời cho phép những người quản trị chạy được nhiều hệ điều hành, nhiều máy chủ trên cùng một máy chủ duy nhất. Giúp giảm thiểu chi phí, dễ dàng trong việc triển khai và vận hành. Tận dụng tốt hơn tài nguyên hệ thống. Thay vì trước đây server vật lý 64GB ram chỉ để chạy một dịch vụ web thì giờ đây nó có thể chạy thêm cả dịch vụ mail nữa chẳng hạn.

Tuy nhiên ảo hóa vẫn chưa phải là giải pháp tối ưu nhất. Chẳng hạn bạn tạo một máy ảo 5GB RAM thì trên máy vật lý sẽ mất 5GB RAM cho máy ảo đó. Nếu không tận dụng tốt thì đâu đó vẫn có sự lãng phí tài nguyên ở đây.

Và ở bước tiến tiếp theo, nhân loại đã nghĩ ra Containerlization - ảo hóa container. Phương pháp ảo hóa này gần giống với phương pháp ảo hóa trước đó ở trên (đều sinh ra các hệ điều hành con nằm trên cùng một hệ điều hành bố). Nhưng nó tối ưu hơn hơn chỗ , các máy con này cùng sử dụng kernel của máy bố nhưng lại hoàn toàn độc lập với nhau như ảnh phía dưới.

3. Docker

Đọc đến đây thì chắc các bạn cũng đã có một cái nhìn tổng quan cũng như lý tưởng mà docker hướng tới rồi đó. Vậy thì cùng tìm hiểu về sơ bộ về Docker nhé.

Docker dựa vào tính năng LXC, được phát triển bởi dotCloud. Là một ứng dụng mã nguồn mở cho phép đóng gói các ứng dụng, các phần mềm phụ thuộc lẫn nhau vào trong cùng một container. Container này sau đó có thể mang đi triển khai trên bất kỳ một hệ thống Linux phổ biến nào. Các container này hoàn toàn độc lập với các container khác.

Những lợi ích mà Docker đem lại:

  • Sử dụng ít tài nguyên: Thay vì phải ảo hóa toàn bộ hệ điều hành thì chỉ cần build và chạy các container độc lập sử dụng chung kernel duy nhất.
  • Tính đóng gói và di động: Tất cả các gói dependencies cần thiết đều được đóng gói vừa đủ trong container. Và sau đó có thể mang đi triển khai trên các server khác.
  • Cô lập tài nguyên: server bố không biết ở trong container chạy gì và container cũng không cần biết bố nó là CentOs hay Ubuntu luôn. Các container độc lập với nhau và có thể giao tiếp với nhau bằng một interface.
  • Hỗ trợ phát triển và quản lý ứng dụng nhanh: Đối với Dev, sử dụng docker giúp họ giảm thiểu thời gian setup môi trường, đóng gói được các môi trường giống nhau từ Dev - Staging - Production.
  • Mã nguồn mở: Cộng đồng support lớn, các tính năng mới được release liên tục.

Các khái niệm quan trọng trong Docker:

  • Image là một template được đóng gói sẵn và không thay đổi trong toàn bộ quá trình chạy container, nó chỉ thay đổi khi bạn build lại image. Các bạn có thể tự build image cho riêng mình, hoặc sử dụng các image có sẵn của cộng đồng từ Docker Hub.
  • Container được khởi chạy từ các Image, bên trong sẽ có đầy đủ các ứng dụng cần thiết mà bạn định nghĩa từ Image.
  • Docker Registry Là một kho chứa các image. Bạn có thể dựng riêng một con Docker Registry cho riêng mình. Hoặc up lên Docker Hub để đóng góp ngược lại cho cộng đồng :D

4. Các điểm hạn chế của Docker

Docker không phải là hoàn hảo:

  • Docker base trên Linux 64bit và các tính năng cgroup, namespaces. Vì thế Linux 32bit hoặc môi trường Window khó có thể chạy được docker (đối với phiên bản CE).
  • Sử dụng container tức là bạn sử dụng chung kernel của hệ điều hành. Trong trường hợp bạn download image có sẵn và trong đó có một số công cụ có thể kiểm soát được kernel thì server của bạn có thể bị mất kiểm soát hoàn toàn.
  • Các tiến trình chạy container một khi bị stop thì sẽ mất hoàn toàn dữ liệu nếu không được mount hoặc backup. Điều này có thể sẽ gây ra một số bất tiện…

Tuy nhiên Docker nói riêng hay Containerlization nói chung vẫn sẽ là tương lai và là xu hướng chung của hầu hết các doanh nghiệp trên toàn thế giới.

Tổng kết

Bài viết này mình đã giới thiệu sơ bộ về Container, Docker. Các ưu và nhược điểm mà Docker đem lại. Ở bài tiếp theo chúng ta cùng tìm hiểu về Kiến trúc và thành phần của Docker nhé.

Hãy bình luận để chúng ta cùng nhau phát triển và cùng chờ các phần tiếp theo rất thú vị về Docker nhé.

Cảm ơn các bạn đã dành thời gian đọc bài viết !

Tài liệu tham khảo: