Hệ điều hành docker container: sự khác biệt với VM là gì?


10

Điểm của việc sử dụng một hệ điều hành trong một container docker là gì?

Trong kho lưu trữ docker, bạn tìm thấy hình ảnh docker của Ubuntu: https://registry.hub.docker.com/_/ub Ubuntu / Tôi nghĩ Docker có nhiều hơn ở cấp độ "ứng dụng".

Sự khác biệt giữa bộ chứa docker Ubuntu và Máy ảo Ubuntu là gì? Nếu bạn có toàn bộ HĐH trong bộ chứa docker, thì việc sử dụng Docker có phải là vô nghĩa không?

Cảm ơn

Câu trả lời:


11

Bạn đang thiếu các khái niệm Docker cơ bản. Đó là một điều hoàn toàn khác.

Điều đầu tiên bạn cần biết là triết lý của Docker: chạy một tiến trình bị cô lập trong một container. Bạn sẽ không chạy HĐH trong bộ chứa Docker, bạn sẽ chạy một quy trình bên trong một thùng chứa có nội dung hệ thống tập tin gốc dựa trên bản phân phối linux mà bạn chọn. Ubuntu là một lựa chọn trong số những người khác.

Bây giờ bạn nên tự hỏi làm thế nào có thể có được một quá trình chạy bên trong một hình ảnh cơ sở linux khác với bản phân phối linux mà máy chủ của bạn đang chạy. Để chạy HĐH, về cơ bản bạn cần:

  • Hệ thống tập tin khởi động: chứa bộ tải khởi động và hạt nhân sẽ nằm trong bộ nhớ sau khi được tải. Chúng tôi không quan tâm đến điều này trong trường hợp bộ chứa Docker vì kernel được chia sẻ với máy chủ và là phần chung giữa tất cả các bản phân phối linux.
  • Một hệ thống tập tin gốc: chứa cấu trúc hệ thống tập tin. Nó có thể khác nhau từ một bản phân phối linux khác. Nó chỉ đọc cho đến khi trình tự khởi động kết thúc.

Docker sử dụng UnionFS để quản lý các lớp khối đĩa bên trong một thùng chứa để bạn có thể chồng chúng.

Đằng sau hậu trường, nó sử dụng một mount mount cho phép nhiều hệ thống tập tin được gắn cùng một lúc, trông giống như toàn bộ ảo. Trên thực tế, nó thả lớp hình ảnh cơ sở thành chế độ đọc ghi trên đầu hệ thống tập tin gốc ở chế độ chỉ đọc.

Ở đây bạn có một đống các khối đĩa được xếp lớp theo cách phân phối linux mà hình ảnh cơ sở xuất phát sẽ chứa cùng một hệ thống tệp được cài đặt trong một máy chủ thực, nhưng lần này nó nằm trong một thùng chứa.

Điều cuối cùng còn thiếu bây giờ là: làm thế nào để bạn điều hành thứ này bị cô lập?

Câu trả lời là: không gian tên. Tôi sẽ không đi vào chi tiết ở đây vì nó sẽ đi chệch một chút so với câu hỏi ban đầu. Nhưng những gì bạn cần biết là kể từ kernel 2.4.19, các không gian tên của các loại đã xuất hiện trong những năm qua. Hiện tại các không gian tên sau đây có sẵn:

  • IPC: Không gian tên IPC (truyền thông liên tiến trình)
  • MNT: không gian tên gắn kết
  • NET: không gian tên mạng
  • PID: không gian tên pid
  • USER: không gian tên người dùng (uid)
  • Không gian tên UTS: UTS (tên máy chủ)

Không gian tên là các cấu trúc biệt lập bên trong kernel cho phép các tiến trình chạy với một môi trường cụ thể. Ví dụ, không gian tên MNT sẽ là tính năng chính để có được một quy trình đang chạy trong các đặc tính hệ thống tập tin gốc của hình ảnh cơ sở. Không gian tên NET sẽ là một tính năng quan trọng khác để một container có các giao diện mạng cụ thể để giao tiếp với cầu nối, v.v.

Vì vậy, vâng, mục đích chính của tất cả những điều này là để chạy một ứng dụng bị cô lập, chuyển nó từ môi trường địa phương của bạn sang sản xuất dễ dàng với bên trong một hộp gọi là container.

Sẽ là một ý tưởng tốt để đọc tài liệu của docker trước khi đào sâu hơn về nó.


Cảm ơn, điều đó có nghĩa là một hình ảnh "Ubuntu" như thế này: registry.hub.docker.com/_/ubfox tự nó "vô nghĩa" và đóng vai trò là cơ sở cho bộ chứa được xác định rõ hơn như "bộ chứa nginx"? Tôi không biết nếu tôi có ý nghĩa?
Michael

Có bạn làm. Đó chính xác là những gì nó được sử dụng cho. Và thông thường bạn sẽ nghe mọi người gọi chúng là hình ảnh cơ sở vì lý do này.
Xavier Lucas

Tôi đã xem qua các tài liệu và có một điều tôi không chắc chắn. Giả sử kích thước của hình ảnh Ubuntu là 140Mb. Sau đó, một hình ảnh khác dựa trên hình ảnh này thêm 10 Mb nữa. Nếu tôi chạy 2 container từ hình ảnh này, mỗi container sẽ là 150Mb và tôi cần 300Mb dung lượng đĩa HOẶC tổng kích thước sẽ vẫn là 150Mb? Cảm ơn
Michael

Ồ, tôi vừa tải xuống hình ảnh con trăn chính thức và kích thước ảo là 802,4 MB. Phải mất một lúc để tải về. Nếu tôi chạy 10 container từ nó, các container sẽ mất bao nhiêu dung lượng? Cảm ơn
Michael

2
@YAmikep Một số hình ảnh có thể lớn do phụ thuộc không được làm sạch đúng cách. Nếu bạn bắt đầu 10 thùng chứa với cùng một hình ảnh thì điều đó không có nghĩa là không gian đĩa được sử dụng sẽ gấp 10 lần kích thước của hình ảnh. Bạn không tải hình ảnh một lần nhưng chạy nó từ nhiều container. Docker sử dụng copy-on-write khi chạy nhiều container từ cùng một hình ảnh, điều đó có nghĩa là nó sẽ chia sẻ hình ảnh giữa các container và tạo một bản sao riêng tư của một tệp bên trong một hình ảnh chỉ khi container thêm / sửa đổi nó. Vì vậy, kích thước thực tế được sử dụng được liên kết với hoạt động bên trong các thùng chứa, chứ không phải bao nhiêu lần chạy.
Xavier Lucas
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.