Docker源码分析是一本引导读者深入了解Docker实现原理的技术普及读物,此书的主要目标是通过对Docker架构和源代码的详细讲解和解剖,帮助读者对Docker的底层实现有一个全面的理解。有需要的用户可以免费下载学习。
作者通过大量的流程图和代码片段对Docker的架构、Docker的重要模块,特别是对Swarm、Machine和Compose这三个模块进行了详细介绍和深度剖析,无论是Docker的使用者还是开发者,通过阅读此书都可以对Docker有更深刻的理解,能够更好的使用或者开发Docker。
作者简介
孙宏亮是DaoCloud初创团队成员,软件工程师,浙江大学计算机科学专业应届毕业研究生。
读研期间活跃在PaaS和Docker开源社区,对Cloud Foundry有深入研究和丰富实践,擅长底层平台代码分析,对分布式平台的架构有一定经验,撰写了大量有深度的技术博客。
2014年末以合伙人身份加入DaoCloud团队,致力于传播以Docker为主的容器的技术,推动互联网应用的容器化步伐。
Docker介绍
Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议。目前,Docker可以在容器内部快速自动化部署应用,并可以通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率,并且提升诸如IO等方面的性能。
由于众多新颖的特性以及项目本身的开放性,Docker在不到两年的时间里迅速获得诸多厂商的青睐,其中更是包括Google、Microsoft、VMware等业界行业领导者。Google在今年六月份推出了Kubernetes,提供Docker容器的调度服务,而今年8月Microsoft宣布Azure上支持Kubernetes,随后传统虚拟化巨头VMware宣布与Docker强强合作。今年9月中旬,Docker更是获得4000万美元的C轮融资,以推动分布式应用方面的发展。
从目前的形势来看,Docker的前景一片大好。本系列文章从源码的角度出发,详细介绍Docker的架构、Docker的运行以及Docker的卓越特性。本文是Docker源码分析系列的第一篇———Docker架构篇。
Docker版本信息
本文关于Docker架构的分析都是基于Docker的源码与Docker相应版本的运行结果,其中Docker为最新的1.2版本。
Docker架构分析内容安排
本文的目的是:在理解Docker源代码的基础上,分析Docker架构。分析过程中主要按照以下三个步骤进行:
* Docker的总架构图展示
* Docker架构图内部各模块功能与实现分析
* 以Docker命令的执行为例,进行Docker运行流程阐述
目录:
- 赞誉
- 序
- 前言
- 第1章 Docker架构
- 1.1 引言
- 1.2 Docker总架构图
- 1.3 Docker各模块功能与实现分析
- 1.3.1 Docker Client
- 1.3.2 Docker Daemon
- 1.3.3 Docker Registry
- 1.3.4 Graph
- 1.3.5 Driver
- 1.3.6 libcontainer
- 1.3.7 Docker Container
- 1.4 Docker运行案例分析
- 1.4.1 docker pull
- 1.4.2 docker run
- 1.5 总结
- 第2章 Docker Client创建与命令执行
- 2.1 引言
- 2.2 创建Docker Client
- 2.2.1 Docker命令的flag参数解析
- 2.2.2 处理flag信息并收集Docker Client的配置信息
- 2.2.3 如何创建Docker Client
- 2.3 Docker命令执行
- 2.3.1 Docker Client解析请求命令
- 2.3.2 Docker Client执行请求命令
- 2.4 总结
- 第3章 启动Docker Daemon
- 3.1 引言
- 3.2 Docker Daemon的启动流程
- 3.3 mainDaemon()的具体实现
- 3.3.1 配置初始化
- 3.3.2 flag参数检查
- 3.3.3 创建engine对象
- 3.3.4 设置engine的信号捕获
- 3.3.5 加载builtins
- 3.3.6 使用goroutine加载daemon对象并运行
- 3.3.7 打印Docker版本及驱动信息
- 3.3.8 serveapi的创建与运行
- 3.4 总结
- 第4章 Docker Daemon之NewDaemon实现
- 4.1 引言
- 4.2 NewDaemon具体实现
- 4.3 应用配置信息
- 4.3.1 配置Docker容器的MTU
- 4.3.2 检测网桥配置信息
- 4.3.3 查验容器间的通信配置
- 4.3.4 处理网络功能配置
- 4.3.5 处理PID文件配置
- 4.4 检测系统支持及用户权限
- 4.5 配置工作路径
- 4.6 加载并配置graphdriver
- 4.6.1 创建graphdriver
- 4.6.2 验证btrfs与SELinux的兼容性
- 4.6.3 创建容器仓库目录
- 4.6.4 迁移容器至aufs类型
- 4.6.5 创建镜像graph
- 4.6.6 创建volumesdriver以及volumes graph
- 4.6.7 创建TagStore
- 4.7 配置Docker Daemon网络环境
- 4.7.1 创建Docker网络设备
- 4.7.2 启用iptables功能
- 4.7.3 启用系统数据包转发功能
- 4.7.4 创建DOCKER链
- 4.7.5 注册处理方法至Engine
- 4.8 创建graphdb并初始化
- 4.9 创建execdriver
- 4.10 创建daemon实例
- 4.11 检测DNS配置
- 4.12 启动时加载已有Docker容器
- 4.13 设置shutdown的处理方法
- 4.14 返回daemon对象实例
- 4.15 总结
- 第5章 Docker Server的创建
- 5.1 引言
- 5.2 Docker Server创建流程
- 5.2.1 创建名为"serveapi"的Job
- 5.2.2 配置Job环境变量
- 5.2.3 运行Job
- 5.3 ServeApi运行流程
- 5.4 ListenAndServe实现
- 5.4.1 创建router路由实例
- 5.4.2 创建listener监听实例
- 5.4.3 创建http.Server
- 5.4.4 启动API服务
- 5.5 总结
- 第6章 Docker Daemon网络
- 6.1 引言
- 6.2 Docker Daemon网络介绍
- 6.3 Docker Daemon网络配置接口
- 6.4 Docker Daemon网络初始化
- 6.4.1 启动Docker Daemon传递flag参数
- 6.4.2 解析网络flag参数
- 6.4.3 预处理flag参数
- 6.4.4 确定Docker网络模式
- 6.5 创建Docker网桥
- 6.5.1 提取环境变量
- 6.5.2 确定Docker网桥设备名
- 6.5.3 查找bridgeIface网桥设备
- 6.5.4 bridgeIface已创建
- 6.5.5 bridgeIface未创建
- 6.5.6 获取网桥设备的网络地址
- 6.5.7 配置Docker Daemon的iptables
- 6.5.8 配置网络设备间数据报转发功能
- 6.5.9 注册网络Handler
- 6.6 总结
- 第7章 Docker容器网络
- 7.1 引言
- 7.2 Docker容器网络模式
- 7.2.1 bridge桥接模式
- 7.2.2 host模式
- 7.2.3 other container模式
- 7.2.4 none模式
- 7.3 Docker Client配置容器网络模式
- 7.3.1 使用Docker Client
- 7.3.2 runconfig包解析
- 7.3.3 CmdRun执行
- 7.4 Docker Daemon创建容器网络流程
- 7.4.1 创建容器之网络配置
- 7.4.2 启动容器之网络配置
- 7.5 execdriver网络执行流程
- 7.5.1 创建libcontainer的Config对象
- 7.5.2 调用libcontainer的namespaces启动容器
- 7.6 libcontainer实现内核态网络配置
- 7.6.1 创建exec.Cmd
- 7.6.2 启动exec.Cmd创建进程
- 7.6.3 为容器进程初始化网络环境
- 7.7 总结
- 第8章 Docker镜像
- 8.1 引言
- 8.2 Docker镜像介绍
- 8.3 rootfs
- 8.4 Union Mount
- 8.5 image
- 8.6 layer
- 8.7 总结
- 第9章 Docker镜像下载
- 9.1 引言
- 9.2 Docker镜像下载流程
- 9.3 Docker Client
- 9.3.1 解析镜像参数
- 9.3.2 配置认证信息
- 9.3.3 发送API请求
- 9.4 Docker Server
- 9.4.1 解析请求参数
- 9.4.2 创建并配置Job
- 9.4.3 触发执行Job
- 9.5 Docker Daemon
- 9.5.1 解析Job参数
- 9.5.2 创建session对象
- 9.5.3 执行镜像下载
- 9.6 总结
- 第10章 Docker镜像存储
- 10.1 引言
- 10.2 镜像注册
- 10.3 验证镜像ID
- 10.4 创建镜像路径
- 10.4.1 创建mnt、diff和layers子目录
- 10.4.2 挂载祖先镜像并返回根目录
- 10.5 存储镜像内容
- 10.5.1 解压镜像内容
- 10.5.2 收集镜像大小并记录
- 10.5.3 存储jsonData信息
- 10.6 注册镜像ID
- 10.7 总结
- 第11章 docker build实现
- 11.1 引言
- 11.2 docker build执行流程
- 11.2.1 Docker Client与docker build
- 11.2.2 Docker Server与docker build
- 11.2.3 Docker Daemon与docker build
- 11.3 Dockerfile命令解析流程
- 11.4 Dockerfile命令分析
- 11.4.1 FROM命令
- 11.4.2 RUN命令
- 11.4.3 ENV命令
- 11.5 总结
- 第12章 Docker容器创建
- 12.1 引言
- 12.2 Docker容器运行流程
- 12.3 Docker Daemon创建容器对象
- 12.3.1 LookupImage
- 12.3.2 CheckDepth
- 12.3.3 mergeAndVerifyConfig
- 12.3.4 newContainer
- 12.3.5 createRootfs
- 12.3.6 ToDisk
- 12.3.7 Register
- 12.4 Docker Daemon启动容器
- 12.4.1 setupContainerDns
- 12.4.2 Mount
- 12.4.3 initializeNetworking
- 12.4.4 verifyDaemonSetting
- 12.4.5 prepareVolumesForContainer
- 12.4.6 setupLinkedContainers
- 12.4.7 setupWorkingDirectory
- 12.4.8 createDaemonEnvironment
- 12.4.9 populateCommand
- 12.4.10 setupMountsForContainer
- 12.4.11 waitForStart
- 12.5 总结
- 第13章 dockerinit启动
- 13.1 引言
- 13.2 dockerinit介绍
- 13.2.1 dockerinit初始化内容
- 13.2.2 dockerinit与Docker Daemon
- 13.3 dockerinit执行入口
- 13.3.1 createCommand分析
- 13.3.2 namespace.exec
- 13.4 dockerinit运行
- 13.4.1 reexec.Init()的分析
- 13.4.2 dockerinit的执行流程
- 13.5 libcontainer的运行
- 13.5.1 Docker Daemon设置cgroups参数
- 13.5.2 Docker Daemon创建网络栈资源
- 13.5.3 dockerinit配置网络栈
- 13.5.4 dockerinit初始化mount namespace
- 13.5.5 dockerinit完成namespace配置
- 13.5.6 dockerinit执行用户命令Entrypoint
- 13.6 总结
- 第14章 libcontainer介绍
- ......
- 第15章 Swarm架构设计与实现
- ......
- 第16章 Machine架构设计与实现
- ......
- 第17章 Compose架构设计与实现
- ......