
Docker là gì và nó hoạt động như thế nào?
docker gửi lệnh qua API REST tới daemon dockerd,
xây dựng hình ảnh và chạy các thùng chứa từ chúng.Tại sao nó tồn tại. Docker cho phép bạn đóng gói một ứng dụng với tất cả các phần phụ thuộc của nó (thư viện, cấu hình, thời gian chạy) thành một tạo phẩm duy nhất — một hình ảnh — và chạy ứng dụng đó giống hệt nhau trên máy tính xách tay của nhà phát triển, trong CI và trong sản xuất. Điều này giải quyết vấn đề "hoạt động trên máy của tôi" cổ điển.
Vùng chứa so với máy ảo. VM ảo hóa phần cứng và cung cấp toàn bộ hệ điều hành khách với nhân riêng của nó. Vùng chứa là một quy trình biệt lập sử dụng kernel của máy chủ. Kết quả là các thùng chứa nhẹ hơn, khởi động trong chưa đầy một giây và sử dụng ít tài nguyên hơn. Nhưng vùng chứa không phải là một VM nhẹ: nó được gắn với nhân máy chủ và ranh giới cách ly của nó yếu hơn VM. Máy ảo có khả năng cách ly được thực thi bằng phần cứng, trong khi lỗ hổng trong lõi dùng chung có thể thoát khỏi vùng chứa — đó là sự đánh đổi để có được tốc độ và mật độ. Máy chủ phải phù hợp với loại vùng chứa: Vùng chứa Linux cần nhân Linux, vùng chứa Windows cần nhân Windows. Trên macOS và Windows, Docker Desktop chạy một cách minh bạch một máy ảo Linux nhỏ (ví dụ: thông qua WSL2), do đó, các bộ chứa Linux ở đó chia sẻ hạt nhân của máy ảo đó chứ không phải hạt nhân hệ điều hành của bạn.
Kiến trúc (máy khách-máy chủ). Theo tài liệu của Docker:
- Ứng dụng khách
dockerlà cách chính mà người dùng tương tác với Docker; các lệnh nhưdocker runđược gửi tới daemon. dockerddaemon "thực hiện công việc nặng nhọc" trong việc xây dựng, chạy và phân phối vùng chứa cũng như quản lý các đối tượng như hình ảnh, vùng chứa, mạng và ổ đĩa.- Máy khách giao tiếp với daemon qua REST API qua ổ cắm UNIX hoặc giao diện mạng để chúng có thể chạy trên các máy khác nhau.
- Một đăng ký lưu trữ hình ảnh; công khai mặc định là Docker Hub.
Hình ảnh và vùng chứa. Một sự tương tự hữu ích: một hình ảnh giống như một lớp (hoặc một chương trình trên đĩa) và vùng chứa là một phiên bản của nó (một tiến trình đang chạy); bạn có thể bắt đầu nhiều vùng chứa từ một hình ảnh.
- hình ảnh là mẫu chỉ đọc có hướng dẫn tạo vùng chứa, được tạo từ các lớp. Nó được xác định bởi Dockerfile; khi bạn thay đổi nó, chỉ những lớp đã thay đổi mới được xây dựng lại.
- container là một phiên bản có thể chạy được của một hình ảnh. Bên trên các lớp chỉ đọc của hình ảnh, nó thêm một lớp có thể ghi mỏng (sao chép trên ghi); mọi thứ được ghi ở đó sẽ bị mất khi vùng chứa bị xóa - đó chính xác là lý do tại sao dữ liệu liên tục cần khối lượng.
Cách hoạt động của sự cô lập (dưới mui xe). dockerd không gọi kernel trực tiếp — nó ủy quyền quản lý vòng đời vùng chứa cho containerd, gọi ra thời gian chạy OCI; trong Docker giá trị mặc định là runc, nhưng thời gian chạy có thể cắm được (crun, gVisor, Kata, v.v.). Sự cô lập thực tế đến từ các tính năng của nhân Linux:
- không gian tên cách ly tài nguyên (mỗi trang man7 có 8 loại: PID, network, mount, UTS, IPC, user, cgroup, time). Một tiến trình chỉ "nhìn thấy" các PID của chính nó, ngăn xếp mạng của chính nó, v.v.
- cgroups (nhóm điều khiển) giới hạn và tính đến việc sử dụng tài nguyên (CPU, bộ nhớ, I/O).
Theo dõi thông thường. Các lớp hình ảnh được lưu vào bộ nhớ đệm; docker compose chạy các ứng dụng nhiều vùng chứa; dữ liệu vẫn tồn tại thông qua các ổ đĩa (theo mặc định, một vùng chứa là tạm thời); và OCI tiêu chuẩn hóa định dạng hình ảnh (thông số hình ảnh), thời gian chạy (thông số thời gian chạy) và giao thức phân phối đăng ký (thông số phân phối) — ba thông số kỹ thuật này giúp hệ sinh thái có thể tương tác được.
