Docker daemon là gì
Docker daemon (thường được gọi bằng tên tiến trình là dockerd) là thành phần cốt lõi chạy ngầm (background service) trên hệ thống máy chủ, chịu trách nhiệm trực tiếp quản lý mọi hoạt động liên quan đến vòng đời của container. Nếu coi hệ sinh thái Docker là một nhà máy, thì công cụ dòng lệnh (Docker CLI) chỉ là bàn điều khiển của người quản lý, còn Docker daemon chính là toàn bộ hệ thống máy móc vận hành bên dưới.
1. Bản chất và Vai trò của Docker Daemon
Khi người dùng gõ một lệnh như docker run hay docker build, câu lệnh đó không trực tiếp tạo ra container. Thay vào đó, Docker hoạt động theo mô hình Client - Server:
-
Tiến trình chạy ngầm bền bỉ:
dockerdluôn chạy ở chế độ nền trên hệ điều hành chủ (Host OS), liên tục lắng nghe các yêu cầu gửi tới thông qua Docker Engine REST API. -
Quản trị toàn diện đối tượng Docker: Daemon trực tiếp khởi tạo, theo dõi và xóa bỏ các đối tượng cốt lõi bao gồm:
-
Docker Images: Tải (pull) từ Registry về, đóng gói (build) từ Dockerfile và quản lý các lớp dữ liệu (layers).
-
Containers: Cấp phát tài nguyên, thiết lập môi trường cô lập và điều khiển trạng thái chạy/dừng.
-
Networks: Tạo mạng ảo (bridge, overlay, host) để các container giao tiếp với nhau hoặc với bên ngoài.
-
Volumes: Quản lý vùng lưu trữ dữ liệu bền vững trên ổ cứng máy chủ để dữ liệu không bị mất khi xóa container.
-
2. Vị trí trong Kiến trúc Hiện đại (Từ Monolithic đến Modular)
Trong các phiên bản Docker đời đầu, dockerd là một khối nguyên tảng (monolithic) ôm đồm mọi việc từ nhận lệnh API cho đến gọi nhân hệ điều hành (Linux Kernel) để tạo container. Tuy nhiên, kiến trúc hiện đại đã tách nhỏ quy trình này để tăng tính ổn định và tuân thủ chuẩn công nghiệp (OCI):
| Thành phần | Vai trò chính | Mối quan hệ với dockerd |
|---|---|---|
Docker CLI (docker) |
Giao diện dòng lệnh cho người dùng | Gửi yêu cầu REST API tới dockerd qua Unix socket hoặc mạng TCP. |
Docker Daemon (dockerd) |
Bộ não điều phối trung tâm | Xử lý API, quản lý Image, Network, Volume; ủy quyền việc chạy container cho containerd. |
containerd |
Quản lý vòng đời container cấp cao | Nhận lệnh từ dockerd qua gRPC để quản lý việc khởi chạy, tạm dừng hoặc hủy container. |
containerd-shim |
Tiến trình trung gian tách biệt | Giữ cho container tiếp tục chạy ngay cả khi dockerd bị sập hoặc khởi động lại (Live Restore). |
runc |
OCI Container Runtime cấp thấp | Tương tác trực tiếp với Linux Kernel (namespaces, cgroups) để tạo ra môi trường cô lập cho container rồi tự thoát. |
3. Cơ chế Giao tiếp và Bảo mật
Mặc định, dockerd lắng nghe kết nối thông qua một Unix domain socket tại đường dẫn /var/run/docker.sock.
-
Quyền truy cập tương đương
root: Vìdockerdcần tương tác sâu với nhân hệ điều hành (tạo card mạng ảo, gắn phân vùng ổ cứng, giới hạn CPU/RAM), tiến trình này thường chạy với quyềnroot. Do đó, bất kỳ người dùng nào có quyền đọc/ghi vào file/var/run/docker.sock(ví dụ: người dùng thuộc nhómdocker) đều có quyền lực tương đương quyềnroottrên máy chủ đó. -
Kết nối từ xa (Remote API):
dockerdcũng có thể được cấu hình để lắng nghe qua giao thức mạng (tcp://0.0.0.0:2375cho kết nối không mã hóa hoặc cổng2376có bảo mật TLS). Khi mở cổng TCP, bắt buộc phải cấu hình chứng chỉ TLS để tránh việc kẻ tấn công chiếm quyền điều khiển toàn bộ máy chủ từ xa. -
Chế độ Rootless: Để khắc phục rủi ro bảo mật, các phiên bản Docker mới hỗ trợ Rootless mode, cho phép chạy cả
dockerdvà các container bên dưới quyền của một người dùng thông thường (non-root) thông qua cơ chếuser namespacescủa Linux.
4. Cấu hình và Vận hành Thực tế
Trên các hệ điều hành Linux sử dụng systemd, quản trị viên quản lý Docker daemon như một dịch vụ hệ thống tiêu chuẩn và tùy chỉnh hành vi của nó thông qua tệp cấu hình /etc/docker/daemon.json.
Các lệnh quản lý tiến trình cơ bản:
-
Kiểm tra trạng thái hoạt động:
sudo systemctl status docker -
Khởi động lại daemon sau khi đổi cấu hình:
sudo systemctl restart docker -
Xem nhật ký lỗi của chính daemon:
sudo journalctl -u docker.service
Ví dụ cấu hình thực tế trong /etc/docker/daemon.json: Thay vì truyền hàng loạt cờ (flags) phức tạp vào câu lệnh khởi chạy dockerd, bạn có thể định nghĩa tập trung trong file JSON (chẳng hạn như giới hạn dung lượng file log để tránh đầy ổ cứng, hoặc bật tính năng giữ container sống khi nâng cấp Docker):
JSON
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"storage-driver": "overlay2"
}
Điểm mấu chốt cần nhớ: Nhờ sự phân tách giữa dockerd và containerd-shim, nếu bạn bật "live-restore": true, bạn hoàn toàn có thể khởi động lại hoặc nâng cấp dockerd mà không làm gián đoạn các ứng dụng đang chạy bên trong container.
All Rights Reserved