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