Docker 镜像/容器中有什么?



考虑到docker镜像/容器有各种风格 - Ubuntu,CentOS,CoreOS等。我很好奇映像/容器实际上由什么组成,以及与主机操作系统共享的内容? 分界线在哪里?

例如,我可以下载基本的 Ubuntu 映像并在 CentOS 主机上启动它。然后,当我在 Ubuntu 容器中四处闲逛时,我可以看到它的外观和感觉都像 Ubuntu 服务器(文件系统布局等(。但是如果我运行 uname 命令,我会看到内核和 CentOS 主机之类的东西......

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

例如,内核是主机的一部分,文件系统布局是映像/容器的一部分。有没有定义这一点的规范?

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

图像是图层的逻辑分组,以及有关创建容器时要执行的操作以及如何组装图层的元数据。该元数据的一部分是每个层都知道其父层的 ID。

那么,层中会包含哪些内容呢?已添加到父级的文件(和目录(。还有一些特殊文件("白化"(表明某些内容已从父级中删除。

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

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

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

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

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

请记住,docker 容器不是虚拟机 - 因此所有内容实际上都在主机上本机运行,并直接使用主机内核。每个容器都有自己的用户命名空间(类似于旧的根监狱(。有一些工具/功能可以确保容器只能看到自己的进程,将自己的文件系统分层到主机文件系统上,以及通过管道连接到主机网络堆栈的网络堆栈。

最新更新