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 生态系统的核心枢纽,所有操作都通过它来完成!

相关推荐
像风一样自由20206 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
陈陈CHENCHEN9 小时前
【Kubernetes】纯 IPv6 K8s 用 socat 打通 IPv4 服务
云原生·容器·kubernetes
江湖有缘10 小时前
Docker实战 | 使用Docker部署rmoments社交平台
jvm·docker·oracle
灯澜忆梦15 小时前
【docker】#4 | Docker 自定义镜像与 Dockerfile
运维·docker·容器
TTATTC15 小时前
Android 浏览器死活不弹证书框的那天,我用 .NET MAUI 给 WebView 写了一个 mTLS 拦截器
docker·开源
TTATTC15 小时前
百万行 Trace 交给 AI,方向和验证留给人,一套还原自定义 VMP 保护的分工方法
docker·开源
TTATTC15 小时前
从 proxy_pass 末尾斜杠到 WebAssembly 预压缩:深挖 Nginx 生产环境四大高频踩坑点
docker·开源
TTATTC15 小时前
消灭 AI 编程助手的幻觉代码:拆解 Google 官方文档 MCP 与三大云厂商知识检索架构
docker·开源
Wang's Blog16 小时前
Java 项目部署之 Docker工具快速入门: Docker Compose 初识与安装
java·开发语言·docker