Docker là một công nghệ mà những người làm Back-end có xu thế cần phải biết. Trong đó, khái niệm «Container» là cấp độ “sống ảo” nhẹ nhàng hơn Máy Ảo (Virtual Machine), bởi vì nó cùng thuộc về lĩnh vực ảo hóa (virtualization) nên nhiều người mới học thường lẫn lộn giữa Container và Virtual Machine.
Docker là một nền tảng cho developers và sysadmin để develop, deploy và run application với container. Nó cho phép tạo các môi trường độc lập và tách biệt để khởi chạy và phát triển ứng dụng và môi trường này được gọi là container. Khi cần deploy lên bất kỳ server nào chỉ cần run container của Docker thì application của bạn sẽ được khởi chạy ngay lập tức.
Khái niệm Container và Virtual Machine
Virtual Machine là công nghệ giả lập phần cứng (nên tên của nó mới có chữ «Machine»), Hệ điều hành (OS) bên trong Máy Ảo sẽ bị lừa rằng đây là phần cứng thật nên nó chỉ sử dụng được một phần tài nguyên mà Máy Ảo được cấp phát, ví dụ: Host Machine có 32GB RAM, nhưng chỉ cấp cho Virtual Machine 8GB RAM, thì OS sẽ nhìn thấy “phần cứng” 8GB RAM mà thôi.
Còn Container là gì?
Container là một hình thức ảo hóa hệ điều hành, bên trong là các packages, một số dependencies. Dùng để giải quyết vấn đề chuyển giao phần mềm một cách đáng tin cậy giữa các môi trường khác nhau. Docker container image là một gói phần mềm nhẹ, chạy độc lập và có thể thực thi bao gồm mọi thứ để chạy ứng dụng như: code, runtime, system tools, system libraries và settings mà không bị các yếu tố môi trường hệ thống làm ảnh hưởng và ngược lại.
Container về bản chất là một kỹ thuật cách ly tài nguyên (isolation), nói ví von là OS lừa phần mềm của nó. Chúng ta đã biết một phần mềm được khởi động lên sẽ chiếm ít nhất một tiến trình (process) trong OS, và nó có thể truy cập được khá nhiều tài nguyên của máy tính. Containerize (động từ) là hành động mà OS cách ly process đó, cho nó một “vùng trời” riêng.
Process bị cách ly sẽ nhìn thấy PID (Process ID) của nó là 1. Nó sẽ nghĩ rằng nó là đấng độc tôn. Nó được cấp một card mạng ảo riêng, một file system ảo riêng, trong đó nó *tưởng* rằng mình có thể truy cập, sửa, xóa mọi folder hệ thống. Chúng ta sẽ nói thêm ở bài viết về “Docker Image”.
Một bộ phim minh họa cho kỹ thuật «Container» là phim hoạt hình Trại Súc Vật (Animal Farm [1954]), với câu nói kinh điển: “Mọi process đều được truy cập tài nguyên bình đẳng, nhưng có một số process bình đẳng hơn”.
SO SÁNH CONTAINER [C] VÀ VIRTUAL MACHINE [VM]
Tài nguyên (resource)
[VM] Mọi thứ đều bị giới hạn bởi phần cứng ảo.
[C] Process trong container sử dụng trực tiếp tài nguyên thật, nhưng HĐH có thể quy định mỗi process một mức giới hạn tài nguyên khác nhau (hoặc không giới hạn).
Thực thi (execution)
[VM] HĐH thật → HĐH ảo → HĐH ảo chạy phần mềm. (Đối với VPS, Hypervisor type 1 thay thế cho HĐH thật)
[C] HĐH thật chạy phần mềm.
Sự tối ưu (performance)
[VM] Phần cứng thật phải gánh cả một HĐH ảo. Từ khi máy tính khởi động lên, cho tới khi sử dụng được phần mềm rất mất thời gian.
[C] Phần mềm thật chạy trên phần cứng thật. Tốc độ khởi động gần như một phần mềm bình thường.
Tính bảo mật (Security)
[VM] Phần mềm có mã độc có thể ảnh hưởng tới tài nguyên của process khác trong cùng VM.
[C] Process trong cùng container vẫn có thể ảnh hưởng tới nhau. Nhưng thông thường mỗi container chỉ nên chạy một process. Process khác container không thể gây ảnh hưởng cho nhau.
[VM] và [C]: Process trong môi trường ảo không thể truy xuất tới môi trường của HĐH chủ.
Phần mềm hỗ trợ
[VM] VirtualBox, VMWare, Microsoft Hyper-V, Parallels, Linux KVM, Docker Machine…
[C] Docker Engine, LXC Linux Container, Apache Mesos, CRI-O (Kubernetes)…
Ứng dụng thực tế
[VM] Dịch vụ máy chủ ảo (Virtual Private Server – VPS); Chạy phần mềm thuộc những hệ điều hành khác nhau.
[C] Triển khai service Back-end trên máy chủ, các phần mềm phải thuộc cùng hệ điều hành.
Kết Luận
Containers và virtual machines đều cô lập tài nguyên và phân bổ tài nguyên. Nhưng chúng có cách hoạt động khác nhau vì container ảo hóa hệ điều hành thay vì phần cứng và có tính linh động và hiệu quả hơn.
Nguồn: SchoolCode