Các quá trình bên trong một Docker container trông như thế nào?


33

Gần đây tôi đã nghe thấy sự nhầm lẫn xuất hiện nhiều lần xung quanh việc container Docker là gì, và cụ thể hơn là những gì đang diễn ra bên trong, liên quan đến các lệnh và quy trình mà tôi gọi trong khi bên trong container Docker.

Ai đó có thể vui lòng cung cấp một cái nhìn tổng quan cấp cao về những gì đang xảy ra?


3
Mặc dù không chính xác (và tại sao tôi sẽ không viết nó như một câu trả lời) Tôi thấy dễ dàng hơn khi nghĩ docker là một chroot ưa thích sau đó là một máy ảo. Điều đó không chính xác, nhưng nó giúp ích khi cố gắng hình dung nó trong đầu tôi.
coteyr

2
@coteyr - thật buồn cười khi bạn đề cập đến sự tương tự đó, tôi đã sử dụng chính xác điều đó trong khi cố gắng mô tả những gì Docker đang làm là tốt. IMO Docker có nhiều điểm chung với chroot hơn là ảo hóa.
slm

Câu trả lời:


53

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:

    ss01

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:

    ss02

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 1000lệnh đang được làm nền.

    ss03

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:

    ss04

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ộ.

    ss05

Xem làm thế nào 4 sleep 1000quy 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/bashthự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 1000lệ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 -eafsẽ trông như thế này:

    ss06

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.


Ngoài ra docker tạo ra một không gian người dùng bị cô lập trên mỗi container đang chạy.
Bhargav Nanekalva 7/11/2016

3

Bên trong container, các quy trình của bạn nên được cách ly (cách ly). Trong thực tế, bạn không nên xem bất kỳ quy trình nào ngoài những quy trình bạn chỉ định (ít nhất là một trình bao). Nó không dành cho thử nghiệm "xã hội". Điểm tương đồng duy nhất với chroot là kernel host được sử dụng. Docker là tuyệt vời nếu bạn cần cách ly một cái gì đó hoặc sử dụng các phiên bản khác nhau của phần mềm kiến ​​trúc nền tảng so với chạy trên máy chủ. (các phiên bản Java rất cũ hoặc một nhánh khác của Python nói). Hãy nhận thức sâu sắc rằng các thư mục và tệp nhị phân bạn đang xử lý có thể không giống với các thư mục trên máy chủ. Nó không phải là cùng một thư mục / bin, vv

EDIT: tương tự với chroot hơn là VM.


1
Chỉnh sửa, tôi đã suy nghĩ với một nắp Xen kế thừa. Rõ ràng đó không phải là trường hợp khi chạy Windows theo KVM / Qemu hoặc chạy VM 64 bit trên máy chủ 32 bit trong VirtualBox. (đừng hỏi). Nó tương tự như đối số pv vs hvm cho AWS.
mckenzm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.