Docker基础图像,它们是由什么组成的?

我正试图围绕Docker体系结构进行研究,特别是弄清楚基本映像是由什么组成的,并且一直在探索Docker集线器上的一些映像。 特别是在看下面的repo时,它引用了centos-7.2.1511-docker.tar.xz 文件 。 我已经下载并检查了tar的内容,它有你典型的Linux文件系统。

据我了解,这不是一个完整的Linux操作系统,只是删除所有非必需品的Linux文件系统的副本? 在运行容器时,所有其他需求是从主机操作系统中抽取的(?)

我的问题基本上归结为如何创build该tar文件? 你到底需要什么 我的目的不是创build一个,而是理解文件/数据/依赖项来自目标操作系统的哪一部分来创build映像,以及在主机操作系统上使用了什么

Docker容器是一组进程,在主机内核之上运行由Linux命名空间启用的沙箱。

Docker镜像是一组层,通常是简单的压缩包,解压缩文件,使其看起来好像是用来启动容器的文件系统的根。

Docker镜像可能只是一个静态链接的可执行文件 ! 你可以从头开始创build自己的Docker镜像,只需创build一个单个可执行文件的tar包,并将其提供给docker docker load ,然后将其作为适当的内部格式存储,并将其注册为图像。

正如你所看到的,一个Docker镜像不需要太多。 它当然不需要内核,或任何通常用于configuration系统,networking守护进程或甚至像cron的东西的组件。 这些都留给主人。

通常在映像中可用的东西是dynamic库运行时,像/etc/hosts/etc/hosts /etc/resolv.conf和libc直接引用的其他文件。 这使您可以添加典型的dynamic链接的可执行文件,这些可执行文件与系统进行交互,就好像它们运行在传统的操作系统上一样。

通过卸载尽可能多的软件包,然后对文件系统(不包括像/proc/sys/dev等目录)进行目标化并通过docker load加载,我已经成功地将基于CentOS 6的旧VM“Docker化” 。 之后,我启动了一个容器,并且(有时强制)删除了在Docker镜像中没有任何用处的额外的“系统”包,比如kernel,udev等等。

这篇博客文章介绍了docker load一些具体细节: