本人docker初学者,边学习边总结,一方面加深本身的理解,另外一方面但愿对其余想深刻了解docker的同窗有所帮助。git
因为本人缺少实战经验,错误在所不免,欢迎批评指正,谢谢。程序员
本系列主要介绍三个github上的项目: moby、containerd、runc.github
因为只介绍docker核心的东西,因此不会包含下面这些项目:chrome
本系列主要专一docker背后的技术和实现思路,不介绍怎么使用docker,不介绍代码细节。docker
自从docker决定将swarm整合进来弄企业版以后,代码一直在调整,docker的一些目录和程序名称也在发生变化,因此本系列的内容无法覆盖全部docker版本,只能挑其中的一个。segmentfault
自v17.03开始,docker采用了新的发行方式,版本的发行周期变成了一个月一次,而且也分了企业版和社区版,在本系列中,将以v17.03社区版做为参考,建议你们阅读本系列时,手头的docker版本不低于v17.03。api
docker完整的变动列表请参考这里。浏览器
2017-04-18,在DockerCon 2017上,docker公司正式宣布成立moby项目,同时将github上的docker/docker项目重命名成了moby/moby,虽然会自动重定向,但代码里的相关引用不排除会有问题,须要留意。bash
这里不评价此次变化,对普通使用者来讲,不会发生任何变化,仍是熟悉的命令,熟悉的参数,对开发人员来讲,代码的位置变了,但代码仍是那份代码。网络
之后moby会变成什么样,如今还不清楚,有可能和docker的关系会变成blink和chrome的关系同样,静观其变,但愿不要影响咱们学习。
注意:若没有特别说明,本系列提到的docker源码,都指的是moby的代码
该系列的全部文章都会列在这里,便于你们选择阅读。因为本人时间安排发生变化,本系列中止更新,后面不肯定是否会继续,很是抱歉。
在阅读本系列以前,若是对Linux不是很熟的话,建议先阅读本人的Linux程序员专栏,里面包含了内存、CPU、文件系统、网络、namespace、cgroup等方面的详细内容,和docker相关的Linux知识还在更新中,敬请关注。
因为如今docker依赖的containerd和runc是github上两个单独的项目,若是你须要分析docker的代码,请确保containerd和runc的版本和docker的版本是一致的,检查办法以下:
#假设咱们已经将docker的源代码clone到了/home/dev/repos/docker目录下 dev@debian:~/repos/docker$ git branch * master #列出17.03相关的tag dev@debian:~/repos/docker$ git tag|grep 17.03 v17.03.0-ce v17.03.0-ce-rc1 v17.03.1-ce v17.03.1-ce-rc1 #取最新的v17.03.1-ce dev@debian:~/repos/docker$ git checkout -b v17.03.1-ce v17.03.1-ce Switched to a new branch 'v17.03.1-ce' dev@debian:~/repos/docker$ git branch master * v17.03.1-ce #查看docker所用的runc和containerd的commit id dev@debian:~/repos/docker$ egrep "RUNC_COMMIT|CONTAINERD_COMMIT" ./hack/dockerfile/binaries-commits # When updating RUNC_COMMIT, also update runc in vendor.conf accordingly RUNC_COMMIT=54296cf40ad8143b62dbcaa1d90e520a2136ddfe CONTAINERD_COMMIT=4ab9917febca54791c5f071a9d1f404867857fcc #查看runc和containerd的库路径 dev@debian:~/repos/docker$ egrep "runc.git|containerd.git" ./hack/dockerfile/install-binaries.sh git clone https://github.com/docker/runc.git "$GOPATH/src/github.com/opencontainers/runc" git clone https://github.com/docker/containerd.git "$GOPATH/src/github.com/docker/containerd"
根据上面的结果,先将runc和containerd克隆下来,而后checkout相应的commit id,这样就能够配合docker的代码一块儿看了。这里是上面例子中找到的containerd和runc的信息:
注意: