Docker 核心组件详解

Docker 核心组件详解

全景概览

Docker 的核心组件可以从底层到上层划分为三个层面:

graph TB
    subgraph 用户层
        CLI[docker CLI]
        API[REST API]
        Compose[Docker Compose]
    end

    subgraph 引擎层
        Daemon[Docker Daemon dockerd]
        containerd[containerd<br/>容器运行时管理器]
        runc[runc<br/>OCI 运行时实现]
    end

    subgraph 内核层
        Namespace[Linux Namespaces<br/>隔离]
        cgroups[cgroups<br/>资源限制]
        UnionFS[UnionFS / OverlayFS<br/>分层文件系统]
        NetFilter[Netfilter / iptables<br/>网络规则]
    end

    CLI -->|发送命令| API
    API --> Daemon
    Compose --> Daemon

    Daemon --> containerd
    containerd --> runc

    runc --> Namespace
    runc --> cgroups
    runc --> UnionFS
    runc --> NetFilter

组件详表

组件 角色 关键职责
dockerd 主守护进程 镜像管理、API 服务、构建引擎
containerd 容器运行时管理器 管理容器生命周期、镜像拉取解压
runc OCI 运行时 真正创建和运行容器进程
docker-proxy 网络代理 端口映射,容器端口对外暴露
Docker CLI 命令行工具 用户交互界面
Docker Compose 编排工具 定义和运行多容器应用
Docker Swarm 集群管理 原生集群和编排方案

深入理解各组件

1. dockerd(Docker Daemon)

这是 Docker 架构中的核心守护进程,负责:

# dockerd 启动后监听
# - Unix Socket: /var/run/docker.sock(默认)
# - TCP: 2375(非 TLS)/ 2376(TLS)

# 查看 dockerd 进程
ps aux | grep dockerd
# root   ...  /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

2. containerd

containerd 是从 Docker 中拆分出来的工业级容器运行时

graph LR
    A[Docker Engine] -->|CRI/grpc| B[containerd]
    B -->|task create| C[runc]
    B -->|镜像管理| D[镜像存储]
    B -->|存储管理| E[快照器 snapshotter]

特点:
– 2017 年捐赠给 CNCF,现已是毕业项目
– Kubernetes 可以通过 CRI(Container Runtime Interface)直接对接 containerd
– 比 dockerd 更轻量,适合嵌入场景

# containerd 的核心命令(通过 ctr 或 nerdctl)
ctr images pull docker.io/library/nginx:alpine
ctr run docker.io/library/nginx:alpine nginx

3. runc

runc 是 OCI(Open Container Initiative)运行时规范的参考实现

graph TB
    subgraph OCI Runtime Spec
        S1[ config.json<br/>容器配置]
        S2[ rootfs<br/>容器根文件系统]
    end

    subgraph runc 执行流程
        runc -->|读取 config.json| CFG_OK[加载配置]
        CFG_OK -->|clone() 系统调用| NS[创建 Namespace]
        NS -->|挂载 rootfs| ROOT[设置文件系统]
        ROOT -->|exec| PID1[启动容器 PID 1 进程]
    end
# runc 直接运行容器(不经过 Docker CLI)
runc run mycontainer

4. docker-proxy

每个需要端口映射的容器都会启动一个 docker-proxy 进程:

# 当执行 docker run -p 8080:80 nginx 后
ps aux | grep docker-proxy
# root ... /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 80

组件调用链

docker run nginx 为例:

sequenceDiagram
    participant CLI as docker CLI
    participant D as dockerd
    participant CTD as containerd
    participant R as runc
    participant OS as Linux Kernel

    CLI->>D: POST /containers/create
    D->>D: 解析镜像配置
    D->>CTD: Create container (gRPC)
    CTD->>CTD: 解压镜像层
    CTD->>R: bundle + start
    R->>OS: clone(CLONE_NEWNS\|CLONE_NEWPID\|...)
    R->>OS: pivot_root (切换文件系统)
    R->>OS: exec(nginx command)
    R-->>CTD: 容器 PID 返回
    CTD-->>D: 容器运行中
    D-->>CLI: 返回容器 ID

总结

Docker 的组件设计体现了分层和解耦的思想:
dockerd — 用户交互层,提供易用的 API
containerd — 运行时管理层,专注于容器的生命周期管理
runc — 底层实现层,调用内核特性创建容器

这种分层架构使得 Docker 生态非常灵活——Kubernetes 可以跳过 dockerd 直接使用 containerd,而底层运行时的替换(如 gVisor、Kata)也只需对接 OCI 标准即可。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容