一句话概括
Docker Daemon 是 Docker 的"大脑"和"总指挥",一个在后台运行的服务,负责管理所有的 Docker 容器、镜像、网络和存储。
类比理解
| 现实世界类比 | Docker 世界 |
|---|---|
| 酒店前台接待 | Docker Daemon |
| 客人(你) | Docker CLI(命令行工具) |
| 房间预订请求 | docker run 命令 |
| 酒店房间 | Docker 容器 |
| 房间设计图 | Docker 镜像 |
| 酒店管理系统 | Docker Daemon 的内部逻辑 |
工作流程:
你(客人) → 向前台说要开房 → 前台管理系统安排房间 → 你入住房间
↓ ↓ ↓ ↓
Docker CLI → docker run命令 → Docker Daemon处理 → 创建容器运行
技术架构图
┌─────────────────────────────────────────────────────────┐
│ 用户层面 │
│ Docker CLI (命令行工具) │
│ Docker Desktop (图形界面) │
│ REST API 调用者 │
└───────────────┬─────────────────────────────────────────┘
│ 发送命令 (HTTP/REST API)
▼
┌─────────────────────────────────────────────────────────┐
│ Docker Daemon 层面 │
│ ┌─────────────────────────────────────────┐ │
│ │ Docker Daemon (dockerd) │ │
│ │ ┌─────────┬─────────┬──────────────┐ │ │
│ │ │ 镜像管理 │ 容器管理 │ 网络管理 │ │ │
│ │ ├─────────┼─────────┼──────────────┤ │ │
│ │ │ 存储管理 │ 安全管理 │ API服务器 │ │ │
│ │ └─────────┴─────────┴──────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└───────────────┬─────────────────────────────────────────┘
│ 调用底层组件
▼
┌─────────────────────────────────────────────────────────┐
│ 系统层面 │
│ containerd (容器运行时) │
│ runc (实际创建容器的工具) │
│ Linux内核 (cgroups/namespaces) │
└─────────────────────────────────────────────────────────┘
核心职责
1. 镜像管理
bash
# 当你执行这些命令时,Docker Daemon 在做什么:
docker pull ubuntu:latest
Daemon 的工作:
- 检查本地是否有 ubuntu:latest 镜像
- 如果没有,从配置的 Registry(如 Docker Hub)下载
- 验证镜像签名和完整性
- 存储到本地镜像仓库
- 管理镜像分层和缓存
2. 容器生命周期管理
bash
docker run -d --name web nginx
Daemon 的工作:
- 从 nginx 镜像创建容器
- 分配容器ID和名称
- 设置网络命名空间
- 配置存储卷
- 启动容器进程
- 监控容器状态
3. 网络管理
bash
docker network create mynet
Daemon 的工作:
- 创建虚拟网络桥接(docker0)
- 分配子网和IP地址
- 配置 iptables 规则(端口映射、防火墙)
- 管理容器间的网络连接
4. 存储管理
bash
docker volume create data
Daemon 的工作:
- 创建和管理数据卷
- 处理 bind mount 挂载
- 管理镜像的分层存储(OverlayFS、AUFS等)
- 垃圾回收和空间管理
通信方式
1. Docker CLI ↔ Docker Daemon
bash
# 当你输入这个命令时:
docker ps
# 实际发生:
1. Docker CLI 通过 Unix Socket 连接到 Daemon
/var/run/docker.sock
2. 发送 REST API 请求:GET /containers/json
3. Daemon 处理请求,返回容器列表
4. CLI 格式化显示结果
2. 通信协议
- Unix Socket(默认) :
unix:///var/run/docker.sock - TCP Socket(远程访问) :
tcp://0.0.0.0:2375 - HTTP/HTTPS:RESTful API
查看通信配置:
bash
# 查看 Docker Daemon 监听地址
sudo netstat -tlnp | grep dockerd
# 或
ps aux | grep dockerd
# 看到类似:/usr/bin/dockerd -H unix:///var/run/docker.sock
实际运行状态查看
查看 Daemon 进程
bash
# 查看 Docker Daemon 是否在运行
sudo systemctl status docker
# 或
ps aux | grep dockerd
# 输出示例:
root 1234 0.2 1.5 1023456 78900 ? Ssl 10:30 0:05 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
查看 Daemon 配置
bash
# 查看完整配置
docker info
# 查看 Daemon 日志
sudo journalctl -u docker -f # 实时日志
sudo journalctl -u docker --since "1 hour ago" # 最近1小时
与 containerd 的关系
现代 Docker 架构:
Docker CLI → Docker Daemon → containerd → runc → 容器
↓ ↓ ↓ ↓ ↓
命令输入 总管理 容器运行时 创建容器 实际运行
各组件分工:
- Docker Daemon (dockerd):用户接口、高级功能
- containerd:容器生命周期管理(更底层)
- runc:实际调用 Linux 内核创建容器
查看进程树:
bash
pstree -p | grep -A 5 dockerd
# 输出类似:
# dockerd(1234)─┬─containerd(2345)─┬─containerd-shim(3456)─┬─nginx(4567)
# ├─docker-proxy(3457)
# └─[多个子进程]
启动和停止 Daemon
作为服务管理
bash
# 启动
sudo systemctl start docker
# 停止(会停止所有容器!)
sudo systemctl stop docker
# 重启
sudo systemctl restart docker
# 设置开机自启
sudo systemctl enable docker
直接运行(调试用)
bash
# 在前台运行 Daemon(可以看到详细日志)
sudo dockerd --debug
# 指定配置运行
sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
配置 Docker Daemon
配置文件位置
bash
# 主配置文件
/etc/docker/daemon.json
# 查看当前配置
docker info | head -20
常用配置示例
json
{
"registry-mirrors": ["https://mirrors.aliyun.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"live-restore": true,
"iptables": true,
"ip-forward": true,
"dns": ["8.8.8.8", "8.8.4.4"]
}
修改配置后
bash
# 重载配置
sudo systemctl daemon-reload
sudo systemctl restart docker
安全考虑
1. 权限控制
bash
# Docker Daemon 默认以 root 运行
# 这意味着能控制整个系统!
# 安全做法:
# 1. 使用用户组限制访问
sudo usermod -aG docker $USER
# 2. 避免暴露 TCP 端口到公网
# ❌ 危险配置:-H tcp://0.0.0.0:2375
# ✅ 安全配置:-H unix:///var/run/docker.sock
2. 资源限制
bash
# Daemon 可以限制资源使用
# 在 daemon.json 中配置
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
}
}
故障排除
常见问题1:Daemon 无响应
bash
# 症状:docker 命令卡住或报错
docker ps
# Cannot connect to the Docker daemon at unix:///var/run/docker.sock
# 解决:
sudo systemctl restart docker
# 或
sudo rm /var/run/docker.sock # 删除旧的socket文件
sudo systemctl start docker
常见问题2:资源泄露
bash
# 查看 Daemon 内存使用
ps aux | grep dockerd | awk '{print $4,$5}'
# 清理资源
docker system prune -a
常见问题3:日志分析
bash
# 查看详细错误
sudo journalctl -u docker -n 100 --no-pager
# 常见错误关键字:
# "port already allocated" # 端口冲突
# "no space left on device" # 磁盘满了
# "permission denied" # 权限问题
总结:Docker Daemon 的本质
一句话总结 :Docker Daemon 是 Docker 系统的服务端 ,所有 docker 命令实际上都是向这个守护进程发送请求。
关键特性
- 常驻内存:一直运行在后台
- 管理一切:容器、镜像、网络、存储
- 提供API:通过 REST API 接收命令
- 调用底层:通过 containerd 和 runc 操作 Linux 内核
对你的意义
当你使用 Docker 时:
- 你不是直接操作容器,而是 通过 Daemon 间接操作
- 所有 Docker 对象(容器、镜像等)都由 Daemon 管理
- 理解 Daemon 有助于调试和优化 Docker 使用
检查你的理解
bash
# 运行这个命令时,思考发生了什么:
docker run -d -p 8080:80 nginx
# 答案:
# 1. CLI 发送请求到 Daemon
# 2. Daemon 检查本地镜像
# 3. Daemon 创建容器配置
# 4. Daemon 调用 containerd
# 5. containerd 调用 runc
# 6. runc 创建容器进程
# 7. Daemon 监控容器状态
# 8. CLI 显示容器ID
现在你理解了,Docker Daemon 是 Docker 生态系统的核心枢纽,所有操作都通过它来完成!