Docker bị ném vào thùng ảo hóa, bởi vì mọi người cho rằng bằng cách nào đó ảo hóa phần cứng bên dưới. Đây là một cách hiểu sai thấm từ thuật ngữ mà Docker sử dụng, chủ yếu là thuật ngữ chứa.
Tuy nhiên Docker không làm bất cứ điều gì kỳ diệu liên quan đến ảo hóa phần cứng của hệ thống. Thay vào đó, nó sử dụng khả năng của Linux Kernel để xây dựng "hàng rào" xung quanh các cơ sở chính, cho phép một quá trình tương tác với các tài nguyên như mạng, hệ thống tệp và quyền (trong số những thứ khác) để tạo ảo giác rằng bạn đang tương tác với một hệ thống đầy đủ chức năng.
Đây là một ví dụ minh họa những gì đang diễn ra khi chúng ta khởi động một Docker container và sau đó nhập nó thông qua việc gọi /bin/bash
.
$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#
Bây giờ từ bên trong container này, nếu chúng ta chạy ps -eaf
:
Chuyển sang một tab thiết bị đầu cuối khác, nơi chúng tôi đã đăng nhập vào hệ thống máy chủ lưu trữ bộ chứa Docker, chúng tôi có thể thấy không gian xử lý mà bộ chứa "thực sự" chiếm:
Bây giờ nếu chúng ta quay lại tab Docker và khởi chạy một số quy trình trong đó và làm nền cho tất cả, chúng ta có thể thấy rằng bây giờ chúng ta có một số quy trình con chạy theo quy trình Bash chính mà ban đầu chúng ta bắt đầu như là một phần của việc khởi chạy container Docker.
LƯU Ý: Các quy trình là 4 sleep 1000
lệnh đang được làm nền.
Lưu ý cách bên trong bộ chứa Docker, các quy trình được gán ID quá trình (PID) là 48-51. Xem chúng trong ps -eaf
đầu ra là tốt:
Tuy nhiên, với hình ảnh tiếp theo này, phần lớn "ma thuật" mà Docker đang thực hiện được tiết lộ.
Xem làm thế nào 4 sleep 1000
quy trình thực sự chỉ là các quy trình con cho quy trình Bash ban đầu của chúng tôi? Ngoài ra, hãy lưu ý rằng bộ chứa Docker ban đầu của chúng tôi /bin/bash
thực tế cũng là một quá trình con với trình nền Docker.
Bây giờ nếu chúng ta đợi hơn 1000 giây để các sleep 1000
lệnh ban đầu kết thúc, rồi chạy thêm 4 lệnh mới nữa và bắt đầu một container Docker khác như thế này:
$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#
Đầu ra của máy chủ ps -eaf
sẽ trông như thế này:
Và các container Docker khác, tất cả sẽ chỉ hiển thị dưới dạng các tiến trình trong trình nền Docker.
Vì vậy, bạn thấy, Docker thực sự không ảo hóa ( theo nghĩa truyền thống ), nó xây dựng các "hàng rào" xung quanh các tài nguyên Kernel khác nhau và giới hạn khả năng hiển thị cho chúng trong một quy trình + con nhất định.