Docker镜像/容器里面有什么?

时间:2014-12-08 14:07:52

标签: linux ubuntu containers docker

考虑到docker图像/容器有各种各样的风格--Ubuntu,CentOS,CoreOS等....我很好奇实际上是什么构成了一个图像/容器,以及与主机操作系统共享的内容是什么?分界线在哪里?

例如,我可以下载基础Ubuntu映像并在CentOS主机上启动它。然后,当我在Ubuntu容器内找到它时,我可以看到它的外观和感觉就像一个Ubuntu服务器(文件系统布局等)。但是,如果我运行uname命令,我会看到内核和CentOS主机等......

显然我明白底层内核是由同一主机上的所有容器共享的。但是还有什么与主机操作系统共享,以及图像/容器的一部分是什么?

E.g。内核是主机的一部分,文件系统布局是图像/容器的一部分....有没有定义这个的规范?

2 个答案:

答案 0 :(得分:21)

区分图像容器docs)会很有帮助。 图像是静态的,仅存在于磁盘上。 容器映像的运行实例,它包含自己的进程树以及RAM和其他运行时资源。

图像是图层的逻辑分组,以及有关创建容器时如何处理以及如何组合图层的元数据。部分元数据是每个层都知道其父ID。

那么,什么进入一个层?您已添加到父级的文件(和目录)。还有一些特殊文件(" whiteout")表示已从父级删除了某些内容。

当您docker run成像时,docker会创建一个容器:它会以正确的顺序解压缩所有图层,创建一个新的" root"文件系统与主机分开。 docker还会读取图像元数据并启动"入口点"或"命令"在创建映像时指定 - 启动新的进程子树。从容器内部,第一个进程看起来像树的根,但是从主机可以看出它是进程的子树。

根文件系统使一个Linux发行版与另一个发行版不同(也可能存在一些内核模块差异,以及引导加载程序/引导文件系统的差异,但这些通常对正在运行的进程是不可见的)。内核与主机共享,实际上仍然在容器内管理其通常的职责。但是根文件系统是不同的,所以当你在容器内部时,它的外观和感觉就像Docker镜像中的发行版一样。

容器不仅有自己的文件系统和进程树,而且还有自己的逻辑网络接口,可选择自己分配RAM和CPU时间。作为操作员,您可以控制容器,因此您可以决定与容器共享主机的网络接口,使其可以无限制地访问RAM和CPU,甚至可以安装设备,文件和从主机到容器的目录。默认设置是将事物分开,但您可以根据需要打破隔离模型。

答案 1 :(得分:3)

Docker是LXC Linux容器的包装器,其文档将让您详细了解共享内容和不共享内容。

通常,主机看到/包含容器内的所有内容,从文件系统到进程等。您可以在主机vm上发出ps命令,并查看容器内的进程。

记住docker容器不是VM,因此所有东西实际上都在主机上本地运行,并且直接使用主机内核。每个容器都有自己的用户命名空间(类似于旧的root jails)。有一些工具/功能可以确保容器只能看到自己的进程,它们拥有分层到主机文件系统的文件系统和一个连接到主机网络堆栈的网络堆栈。