Docker không phải là một phương pháp ảo hóa. Nó dựa vào các công cụ khác thực sự thực hiện ảo hóa dựa trên container hoặc ảo hóa cấp hệ điều hành. Do đó, Docker ban đầu sử dụng trình điều khiển LXC, sau đó chuyển sang libcontainer mà giờ được đổi tên thành runc. Docker chủ yếu tập trung vào việc tự động hóa việc triển khai các ứng dụng bên trong các thùng chứa ứng dụng. Các thùng chứa ứng dụng được thiết kế để đóng gói và chạy một dịch vụ, trong khi các thùng chứa hệ thống được thiết kế để chạy nhiều quy trình, như các máy ảo. Vì vậy, Docker được coi là một công cụ triển khai ứng dụng hoặc quản lý container trên các hệ thống được chứa.
Để biết nó khác với các ảo hóa khác như thế nào, chúng ta hãy đi qua ảo hóa và các loại của nó. Sau đó, sẽ dễ dàng hơn để hiểu sự khác biệt ở đó.
Ảo hóa
Ở dạng được hình thành, nó được coi là một phương pháp phân chia logic lớn để cho phép nhiều ứng dụng chạy cùng lúc. Tuy nhiên, kịch bản đã thay đổi mạnh mẽ khi các công ty và cộng đồng nguồn mở có thể cung cấp phương pháp xử lý các hướng dẫn đặc quyền theo cách này hay cách khác và cho phép nhiều hệ điều hành được chạy đồng thời trên một hệ thống dựa trên x86.
Hypervisor
Trình ảo hóa xử lý việc tạo môi trường ảo nơi các máy ảo khách hoạt động. Nó giám sát các hệ thống của khách và đảm bảo rằng các tài nguyên được phân bổ cho khách khi cần thiết. Trình ảo hóa nằm ở giữa máy vật lý và máy ảo và cung cấp dịch vụ ảo hóa cho các máy ảo. Để nhận ra điều đó, nó chặn các hoạt động của hệ điều hành khách trên các máy ảo và mô phỏng hoạt động trên hệ điều hành của máy chủ.
Sự phát triển nhanh chóng của các công nghệ ảo hóa, chủ yếu là trên đám mây, đã thúc đẩy việc sử dụng ảo hóa hơn nữa bằng cách cho phép nhiều máy chủ ảo được tạo trên một máy chủ vật lý duy nhất với sự trợ giúp của các trình ảo hóa, như Xen, VMware Player, KVM, v.v., và kết hợp hỗ trợ phần cứng trong các bộ xử lý hàng hóa, như Intel VT và AMD-V.
Các loại ảo hóa
Phương pháp ảo hóa có thể được phân loại dựa trên cách nó bắt chước phần cứng với hệ điều hành khách và mô phỏng môi trường vận hành khách. Chủ yếu, có ba loại ảo hóa:
- Thi đua
- Paravirtualization
- Ảo hóa dựa trên container
Thi đua
Giả lập, còn được gọi là ảo hóa hoàn toàn chạy nhân hệ điều hành máy ảo hoàn toàn trong phần mềm. Trình ảo hóa được sử dụng trong loại này được gọi là hypanneror Loại 2. Nó được cài đặt trên đỉnh của hệ điều hành máy chủ có trách nhiệm dịch mã nhân hệ điều hành khách sang hướng dẫn phần mềm. Bản dịch được thực hiện hoàn toàn trong phần mềm và không yêu cầu sự tham gia của phần cứng. Thi đua cho phép chạy bất kỳ hệ điều hành không sửa đổi nào hỗ trợ môi trường được mô phỏng. Nhược điểm của loại ảo hóa này là chi phí tài nguyên hệ thống bổ sung dẫn đến giảm hiệu suất so với các loại ảo hóa khác.
Ví dụ trong danh mục này bao gồm VMware Player, VirtualBox, QEMU, Bochs, Parallels, v.v.
Paravirtualization
Paravirtualization, còn được gọi là hypanneror Loại 1, chạy trực tiếp trên phần cứng, hoặc trần kim loại trần, và cung cấp dịch vụ ảo hóa trực tiếp cho các máy ảo chạy trên nó. Nó giúp hệ điều hành, phần cứng ảo hóa và phần cứng thực sự hợp tác để đạt được hiệu suất tối ưu. Các siêu giám sát này thường có dấu chân khá nhỏ và bản thân chúng không yêu cầu nhiều tài nguyên.
Ví dụ trong danh mục này bao gồm Xen, KVM, v.v.
Ảo hóa dựa trên container
Ảo hóa dựa trên container, còn được gọi là ảo hóa cấp hệ điều hành, cho phép thực thi nhiều cách ly trong một nhân hệ điều hành. Nó có hiệu suất và mật độ tốt nhất có thể và có tính năng quản lý tài nguyên động. Môi trường thực thi ảo bị cô lập được cung cấp bởi loại ảo hóa này được gọi là một thùng chứa và có thể được xem như là một nhóm các quy trình.
Khái niệm về một container được thực hiện nhờ tính năng không gian tên được thêm vào nhân Linux phiên bản 2.6.24. Container thêm ID của nó vào mọi quy trình và thêm kiểm tra kiểm soát truy cập mới vào mỗi cuộc gọi hệ thống. Nó được truy cập bằng lệnh gọi hệ thống clone () cho phép tạo các thể hiện riêng biệt của các không gian tên toàn cầu trước đó.
Không gian tên có thể được sử dụng theo nhiều cách khác nhau, nhưng cách tiếp cận phổ biến nhất là tạo ra một container bị cô lập không có khả năng hiển thị hoặc truy cập vào các đối tượng bên ngoài container. Các tiến trình chạy bên trong container dường như đang chạy trên một hệ thống Linux bình thường mặc dù chúng đang chia sẻ kernel bên dưới với các tiến trình nằm trong các không gian tên khác, tương tự cho các loại đối tượng khác. Chẳng hạn, khi sử dụng các không gian tên, người dùng root bên trong container không được coi là root bên ngoài container, thêm bảo mật bổ sung.
Hệ thống con Linux Control Groups (cgroups), thành phần chính tiếp theo để cho phép ảo hóa dựa trên container, được sử dụng để nhóm các quy trình và quản lý mức tiêu thụ tài nguyên tổng hợp của chúng. Nó thường được sử dụng để hạn chế mức tiêu thụ bộ nhớ và CPU của các container. Vì một hệ thống Linux được chứa chỉ có một kernel và kernel có khả năng hiển thị đầy đủ vào các container, nên chỉ có một cấp độ phân bổ và lập lịch tài nguyên.
Một số công cụ quản lý có sẵn cho các bộ chứa Linux, bao gồm LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, v.v.
Container vs Máy ảo
Không giống như một máy ảo, một container không cần phải khởi động kernel hệ điều hành, vì vậy các container có thể được tạo trong chưa đầy một giây. Tính năng này làm cho ảo hóa dựa trên container trở nên độc đáo và đáng mong đợi hơn các phương pháp ảo hóa khác.
Do ảo hóa dựa trên container thêm ít hoặc không có chi phí cho máy chủ, nên ảo hóa dựa trên container có hiệu năng gần như nguyên gốc
Đối với ảo hóa dựa trên container, không yêu cầu phần mềm bổ sung, không giống như các ảo hóa khác.
Tất cả các container trên máy chủ chia sẻ bộ lập lịch của máy chủ lưu trữ cần thêm tài nguyên.
Các trạng thái vùng chứa (hình ảnh Docker hoặc LXC) có kích thước nhỏ so với hình ảnh máy ảo, vì vậy hình ảnh container rất dễ phân phối.
Quản lý tài nguyên trong các container được thực hiện thông qua các nhóm. Các nhóm không cho phép các container tiêu thụ nhiều tài nguyên hơn so với phân bổ cho chúng. Tuy nhiên, cho đến nay, tất cả tài nguyên của máy chủ đều có thể nhìn thấy trong các máy ảo, nhưng không thể sử dụng được. Điều này có thể được nhận ra bằng cách chạy top
hoặc htop
trên các container và máy chủ cùng một lúc. Đầu ra trên tất cả các môi trường sẽ trông tương tự nhau.
Cập nhật:
Làm thế nào để Docker chạy container trong các hệ thống không phải là Linux?
Nếu các bộ chứa có thể là do các tính năng có sẵn trong nhân Linux, thì câu hỏi rõ ràng là làm thế nào để các hệ thống không phải Linux chạy các bộ chứa. Cả Docker cho Mac và Windows đều sử dụng máy ảo Linux để chạy các thùng chứa. Docker Toolbox được sử dụng để chạy các container trong máy ảo Virtual Box. Nhưng, Docker mới nhất sử dụng Hyper-V trong Windows và Hypervisor.framework trong Mac.
Bây giờ, hãy để tôi mô tả cách Docker cho Mac chạy container chi tiết.
Docker cho Mac sử dụng https://github.com/moby/hyperkit để mô phỏng các khả năng của trình ảo hóa và Hyperkit sử dụng hypanneror.framework trong lõi của nó. Hypervisor.framework là giải pháp hypanneror riêng của Mac. Hyperkit cũng sử dụng VPNKit và DataKit để tương ứng với không gian mạng và hệ thống tệp.
Máy ảo Linux mà Docker chạy trong Mac là chỉ đọc. Tuy nhiên, bạn có thể bash vào nó bằng cách chạy:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Bây giờ, chúng ta thậm chí có thể kiểm tra phiên bản Kernel của VM này:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Tất cả các container chạy bên trong VM này.
Có một số hạn chế đối với hypanneror.framework. Do đó Docker không lộ docker0
giao diện mạng trong Mac. Vì vậy, bạn không thể truy cập các container từ máy chủ lưu trữ. Đến bây giờ, docker0
chỉ có sẵn trong VM.
Hyper-v là trình ảo hóa tự nhiên trong Windows. Họ cũng đang cố gắng tận dụng các khả năng của Windows 10 để chạy các hệ thống Linux nguyên bản.