Docker源码学习

1、 docker总体架构

 

docker是一个client+server的架构,所有命令通过RESTful API接口交互传递。

Docker后端是松耦合的结构,各模块各司其职,有机组合。整个架构中daemon是常驻后台运行的进程,接受客户端请求并管理docker容器。Client是命令行终端,包装命令发送api请求,engine是真正处理客户端请求的后端程序。

1、 docker client和darmon建立通信,client发送请求给damon

2、 daemon作为主体部分,提供server功能,能让其接受client的请求

3、 engine执行处理内部的一系列工作

4、每个工作是一个job形式存在,需要镜像时,从docker registry中下载,通过graphdrive镜像管理驱动下载镜像并存储(Graph形式)

5、networkdrive负责创建配置容器的网络

6、运行用户指令或者限制容器资源时,通过execdrive完成

7、execdrive以及networkdrive通过libcontainer具体实现

2、 各模块组件分析

Docker client发起请求

 与docker daemon建立通信的客户端,使用docker命令后接参数形式完成一个完整请求(发送请求-处理请求-返回结果)

 建立通信方式:tcp://host:port、 unix://path_to_socket 、fd://socketfd

Docker daemon 守护进程

Docker server 调度分发请求

接受请求之后,通过路由分发调度,找到对应的handler执行请求,启动过程中,是通过gorilla/mux,创建一个mux.Router,提供请求的路由功能。(gorilla/mux在golang是一个强大的url路由器以及调度分发器),然后将server的监听地址和router作为参数创建一个httpsrv.server()为请求服务,在srv服务过程中,创建一个goroutine读取路由,解析之后,找到相应路由项,调用相应的handler处理该请求,处理完成之后回复该请求

Engine

运行引擎、运行的和兴模块,扮演的是docker container存储仓库的角色,通过job方式管理容器

Job

docker Engine内部最基本的工作执行单位,每一项工作抽象为一个job

docker registry

是一个存储容器镜像的仓库,在运行过程中与registry通信,实现搜索、下载、上传镜像的工作,对应job名称:search、pull、push(可分为公有和私有仓库)

Graph

内部数据库

Repository

镜像保管者(下载和构建的)

存储类型有aufs、devicemapper、Btrfs、Vfs,centos中使用devicemapper存储类型

GraphDB

容器镜像关系记录者

构建在SQLIte之上得到小型图数据库,实现节点命名以及节点之间关联关系的记录。

Drive

驱动模块,通过driver实现对容器执行环境的定制

Graphdrive

主要用于完成容器镜像的管理例如存储获取

Pull下载的镜像由graphdrive存储到本地graph获取镜像,也由graphdriver到本地Graph获取镜像

Networkdriver

启动时为docker环境创建网桥,容器创建时创建虚拟网卡、容器分配ip、端口与宿主机做端口映射、设置容器防火墙观策略

Execdriver

作为容器的执行驱动,创建命名空间,负责资源统计限制,负责进程运行、默认使用native驱动

Libcontainer

 

使用go语言设计实现的库,不依靠任何依赖,直接访问内核中容器相关的API

Docker可以直接调用libcontainer,来操作容器namespace、cgroups、apparmor、网络等

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值