1、Docker Client and Daemon(docker egine docker 引擎)git
docker是一个客户端工具,做用是发送 用户的请求给 dockerdgithub
安装路径: /usr/bin/docker dockerd 也叫 docker daemondocker
安装路径: /usr/bin/dockerd架构
一句话归纳: docker和dockerd 组成了docker enginetcp
二 、Containerd(容器)工具
管理容器的生命周期(从建立容器到销毁容器) 拉取/推送容器镜像 存储管理(管理镜像及容器数据的存储) 调用 runC 运行容器(与 runC 等容器运行时测试
一句话归纳:spa
docker对容器的管理和操做基本 都是经过 containerd 来完成的插件
2.一、 Containerd 的背景设计
1. Docker项目日趋庞大,架构上须要 进行拆分(开源项目的思路)
2. 能够被Kubernetes CRI 等项目使用 (通用化)
3. 为普遍的行业合做打下基础
一句话归纳:
containerd 提供核心容器服务的接口 标准,上层的容器化应用平台将直接使 用 containerd 提供的接口。
2.二、 Containerd技术发展方向
1. 简洁的接口设计: 基于 gRPC 的 API 和 client library
2. 完整的 OCI 支持: runtime 和 image spec
3. 良好的容器核心功能: 健壮、稳定、高效、可移植
4. 松耦合:使 image、filesystem、runtime 解耦,实现插件式的扩展和重用
5. https://github.com/containerd/containerd
三 、Containerd-shim
它是 containerd 的组件,是容器的运 行时载体,咱们在 docker 宿主机上看 到的 shim 也正是表明着一个个经过调 用 containerd 启动的 docker 容器。
安装路径: /usr/bin/docker-containerd-shim
4、 RunC
1. RunC 是一个轻量级的工具,它是用来运行容器的,且只作这一件事。
2. 经过runc,能够不用经过 docker 引擎直接运行容器。
3. runC 是标准化的产物,它根据 OCI 标准来建立和运行容器。而 OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。
4. RunC 做为标准化容器运行时的一个实现,已被 docker 内置为默认的容器运行时.
5. https://github.com/opencontainers/runc mkdir ~/mycontainer cd ~/mycontainer mkdir rootfs docker export $(docker create busybox) | tar -C rootfs -xvf – runc spec
docker-runc create mycontainerid
docker-runc start mycontainerid
docker-runc states mycontainerid
docker-runc kill mycontainerid 9
docker-runc delete mycontainerid
5、 容器运行过程分析
1.Docker客户端向 dockerd发起请求
2.Dockerd从 Docker Hub上拉取镜像
3.Dockerd使用镜像运行了一个容器并产 生了输出
4.docker-containerd …….
5.Dockerd把输出的内容返回给了 docker 客户端
# ps afx | grep docker -A 1
6、 为何没有 docker-runc
仍是由于 docker-containerd-shim
1. 容许容器运行时(即 runC)在启动容器以后退出,简单说就是没必要为每一个容器一直运行 一个容器运行时(runC)
2. 即便在 containerd 和 dockerd 都挂掉的状况下,容器的标准 IO 和其它的文件描述 符也都是可用的
3. 向 containerd 报告容器的退出状态
经过tcp方式访问dockerd(不建议)
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
测试: # docker -H tcp://127.0.0.1:2375 info