Docker Daemon(Docker 守护进程)完全解析

一句话概括

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 的工作

  1. 检查本地是否有 ubuntu:latest 镜像
  2. 如果没有,从配置的 Registry(如 Docker Hub)下载
  3. 验证镜像签名和完整性
  4. 存储到本地镜像仓库
  5. 管理镜像分层和缓存

2. 容器生命周期管理

bash 复制代码
docker run -d --name web nginx

Daemon 的工作

  1. 从 nginx 镜像创建容器
  2. 分配容器ID和名称
  3. 设置网络命名空间
  4. 配置存储卷
  5. 启动容器进程
  6. 监控容器状态

3. 网络管理

bash 复制代码
docker network create mynet

Daemon 的工作

  1. 创建虚拟网络桥接(docker0)
  2. 分配子网和IP地址
  3. 配置 iptables 规则(端口映射、防火墙)
  4. 管理容器间的网络连接

4. 存储管理

bash 复制代码
docker volume create data

Daemon 的工作

  1. 创建和管理数据卷
  2. 处理 bind mount 挂载
  3. 管理镜像的分层存储(OverlayFS、AUFS等)
  4. 垃圾回收和空间管理

通信方式

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 → 容器
      ↓           ↓             ↓          ↓       ↓
   命令输入     总管理      容器运行时   创建容器  实际运行

各组件分工

  1. Docker Daemon (dockerd):用户接口、高级功能
  2. containerd:容器生命周期管理(更底层)
  3. 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 命令实际上都是向这个守护进程发送请求。

关键特性

  1. 常驻内存:一直运行在后台
  2. 管理一切:容器、镜像、网络、存储
  3. 提供API:通过 REST API 接收命令
  4. 调用底层:通过 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 生态系统的核心枢纽,所有操作都通过它来完成!

相关推荐
小钻风33662 小时前
Docker入门基础知识(二)
运维·docker·容器
nix.gnehc2 小时前
深度解析K8s四大核心接口:CRI、CNI、CSI与OCI的设计精髓与实践逻辑
云原生·容器·kubernetes
victory04312 小时前
docker aertslab/pyscenic:0.12.1 拉取异常解决方案
docker·容器·eureka
野猪佩挤2 小时前
Jenkins动态Salve调度其他集群Docker in Docker
运维·docker·jenkins
杨浦老苏3 小时前
轻量化服务器和硬盘监控系统Vigil
运维·docker·群晖
没有bug.的程序员3 小时前
Docker 与 K8s 生产级实战:从镜像极致优化到集群自动化部署全流程
spring cloud·docker·kubernetes·自动化·k8s·镜像·集群自动化
会写代码的饭桶3 小时前
【DevOps实战】使用 GitHub Actions 自动构建镜像并双推至 Docker Hub 和 GHCR
docker·自动化·github·devops
梁萌4 小时前
docker部署gitlab和gitlab runner
docker·eureka·gitlab
kabcko4 小时前
Windows10安装Docker
运维·docker·容器