Docker源码
宁可枝头抱香死,何曾吹落北风中。——郑思肖《画菊》 Docker源码使用Go语言开发的,首先要了解Go语言的基础语法。
Docker源码简介
docker是典型的 c/s 架构。 Docker源码Github:https://github.com/docker/docker-ce docker-ce组合了docker-engine,cli等。 docker源码fork至mobyhttps://github.com/moby/moby
docker-ce
├─components # docker组件
├─├─cli # docker客户端,主要用来执行命令行
├─├─engine # docker服务器端
在我们安装完docker时,使用 docker version 命令可以看到一个docker client和一个docker server。docker client 对应这里的cli;docker server对应这里的engine。
- docker client:这里安装的是cli,提供命令行功能。
- docker server:docker具体功能的实现者。也称之为 docker engine、docker daemon。
docker server 就如一个常见的web server,对外提供restful api。 docker client 可以有多种形式,比如sdk、cli。cli为用户提供命令行方式,sdk为程序提供包形式。 docker的架构里还包含一个组件:docker registry。用于存储容器的镜像。
docker是一个client+server的架构,所有命令通过RESTful API接口交互传递。 moby Docker源码目录:
docker-ce
├─api # 定义api,使用swagger2.0这个工具生成API,文件在api/swagger.yaml
├─builder # 用来构建镜像的包
├─cli # 使用cobra工具生成docker客户端命令行解析器
├─client # 接受cli的请求,调用RESTful API 接口,向server端发送http请求
├─cmd # 包含一个dockerd包,包含客户端服务端main函数入口
├─container # 容器配置管理,适配不同的平台,容器的抽象
├─contrib # 杂物堆堆,包含一些有用的脚本、镜像、还有其他非docker core中的部分
├─daemon # 暴露docker运行时状态
├─distribution # 用来docker镜像的pull、push和镜像仓库的维护
├─dockerversion # 编译时自动生成
├─docs # 文档
├─errdefs # 一些常见错误
├─hack # 创建docker开发环境和编译打包时用到的的脚本和配置文件
├─image # 用于构建docker镜像
├─intergration-cli # 集成测试
├─layer # 管理union file system driver上的read-only和read-write mounts,各种layer fs的抽象
├─libcontainerd # 访问内核中容器相关系统的调用函数库
├─oci # open container interface 库
├─opts # 命令行选项库
├─pkg # 类似utils或者helps
├─plugin # docker插件后端实现包,插件相关
├─profile # 有apparmor和seccomp两个目录,用于内核访问控制
├─project # 项目管理说明文档
├─reference # 处理docker store里镜像的reference
├─registry # docker registry仓库实现
├─restartmanager # 处理重启后的动作,是否设置“always”
├─runconfig # 配置格式解码和校验
├─vendor # 各种依赖包
├─volume # docker volume的实现
至此,对于docker大体的架构有了一定的了解。明白Docker设计并不是分布式,是单机的,是c/s模式。Docker是建立在linux容器之上的,但docker用libcontainer取代了LXC,docker不是容器,是有效管理容器而开发的一种技术或工具,docker也不是虚拟机、也不是配置管理系统。
注意:containerd负责管理容器,runc负责使用来自containerd的输入来运行容器
Docker引擎有docker守护出、rest接口和dockercli组成