我是docker初学者。我正在学习和总结。一方面,加深理解。另一方面希望对其他想进一步了解docker的同学有所帮助。由于本人缺乏实战经验,错误在所难免。欢迎评论指正,谢谢。包含内容本系列主要介绍github上的三个项目:moby、containerd、runc。由于只介绍了docker核心的东西,所以不包括以下项目:compose:用Python语言开发,将多个相关的容器配置在一起,实现同时创建、启动、停止和监控。machine:帮助将docker安装到指定位置,包括本地虚拟机、远程云主机等,同时也管理这些主机的信息,方便操作安装在不同主机上的这些docker。kitematic:桌面版docker客户端(图形界面),基于electron使用JavaScript开发。toolbox:帮助在Windows和Mac平台上安装docker环境,包括Dockerengine、Compose、Machine和Kitematic。当然docker引擎是安装在虚拟机里的,本地只有client。使用哪个虚拟机取决于平台,toolbox会帮你搞定这一切。distribution:Registry2.0的实现,主要是管理和分发dockerimages,DockerHub背后的技术。swarmkit:docker内嵌的容器编排系统。它和docker的关系可以简单理解为IE浏览器和Windows的关系,它是捆绑销售的。对于读者来说,本系列主要关注docker背后的技术和实现思路,不介绍如何使用docker或代码细节。如果您是docker初学者并且想学习如何使用docker,那么本系列不适合您。如果你已经熟悉基本操作,想了解高级参数,或者想了解幕后发生的事情,以便更好地使用docker,解决你遇到的问题,那么本系列适合你。如果你是一名开发者,想了解docker代码实现的细节,却不知从何下手,本系列或许能给你一些启发。docker版本由于docker决定将swarm集成到企业版中,所以代码有所调整,docker的一些目录和程序名也发生了变化,所以本系列的内容无法涵盖所有??docker版本,只能介绍其中的一个被选中。从v17.03开始,docker采用了新的发布方式。版本的发布周期变成了一个月一次,也分为企业版和社区版。在本系列中,将使用v17.03社区版本作为参考。建议阅读本系列时,手头的docker版本不低于v17.03。可以在此处找到docker的完整更改列表。docker与moby的关系2017-04-18,在DockerCon2017上,docker公司正式宣布成立moby项目,同时将github上的docker/docker项目更名为moby/moby,虽然会自动重定向,但是在代码中引用了相关内容,不排除会出现问题,需要注意。此处不评估此更改。对于普通用户,不会有任何变化。熟悉的命令和参数,还是熟悉的。对于开发者来说,代码的位置变了,但代码还是原来的代码。未来moby会变成什么样子,目前还不得而知。有可能和docker的关系会变得和blink和chrome的关系一样。我们拭目以待,希望不要影响我们的学习。注:如无特殊说明,本系列提到的docker源码均指moby的代码文章列表。为了您的方便,本系列中的所有文章都将列在这里。由于我时间安排的改变,这个系列已经停止更新了,不知道以后还会不会继续,非常抱歉。走进docker(01):hello-world背后发生了什么?走进docker(02):什么是image(镜像)?走进docker(03):如何绕过docker运行hello-world?走进docker(04):什么是容器运行时?走进docker(05):docker如何在本地管理镜像?走进docker(06):dockercreate命令背后发生了什么?走进docker(07):dockerstart命令背后发生了什么?阅读本系列之前建议阅读,如果你对Linux不是很熟悉,建议先阅读我的Linux程序员专栏,里面有关于内存、CPU、文件系统、网络、命名空间、cgroup等的详细内容,与docker相关的Linux知识还在持续更新中,敬请期待。获取docker相关代码。docker依赖的containerd和runc在github上是两个独立的项目。如果需要分析docker代码,请确保containerd和runc的版本与docker的版本一致。检查方法如下:#假设我们已经将docker的源代码clone到/home/dev/repos/docker目录下dev@debian:~/repos/docker$gitbranch*master#列出17.03相关标签dev@debian:~/repos/docker$gittag|grep17.03v17.03.0-cev17.03.0-ce-rc1v17.03.1-cev17.03.1-ce-rc1#获取最新的v17.03.1-cedev@debian:~/repos/docker$gitcheckout-bv17.03.1-cev17.03.1-ce切换到新分支'v17.03.1-ce'dev@debian:~/repos/docker$gitbranchmaster*v17.03.1-ce#查看dockeriddev使用的runc和containerd的commit@debian:~/repos/docker$egrep"RUNC_COMMIT|CONTAINERD_COMMIT"./hack/dockerfile/binaries-commits#WhenupdatingRUNC_COMMIT,alsoupdateruncinvendor.confaccordinglyRUNC_COMMIT=54296cf40ad8143b62dbcaa1d90e520a2136ddfeCONTAINERD_COMMIT=4ab9917febca54791c5f071a9d1f404867857fcc#查看runc和containerd的库路径dev@debian:~/repos/docker$egrep"runc.git|containerd.git"./hack/dockerfile/install-binaries.shgitclonehttps//github.com/docker/runc.git"$GOPATH/src/github.com/opencontainers/runc"gitclonehttps://github.com/docker/containerd.git"$GOPATH/src/github.com/docker/containerd”根据上面的结果,先clonerunc和containerd,然后checkout对应的commitid,这样就可以和docker代码一起阅读了。下面是上面例子中找到的containerd和runc的信息:containerd:https://github.com/docker/con...4ab9917febca54791c5f071a9d1f404867857fccrunc:https://github.com/docker/run...54296cf40ad8143b62dbcaa1d90e520a2136ddfe注:它可能是为了方便修改runc,docker会将github/opencontainersrunc克隆到github.com/docker/runc。在dockerv17.03中,runc是从github.com/docker/runc.git拉取代码,然后放到本地的opencontainers/runc目录下,伪装成opencontainers的runc,这个需要注意,千万不要不要拉错库。上面显示containerd的地址是https://github.com/docker/con...,这个不要紧,github已经把这个地址重定向到https://github.com/containerd...
