Linux 什么';Docker图像/容器中有什么?

Linux 什么';Docker图像/容器中有什么?,linux,ubuntu,containers,docker,Linux,Ubuntu,Containers,Docker,考虑到docker图像/容器有多种风格——Ubuntu、CentOS、CoreOS等。。。。我很好奇到底是什么组成了一个映像/容器,以及与主机操作系统共享了什么?分界线在哪里 例如,我可以下载基本Ubuntu映像并在CentOS主机上启动它。然后,当我在Ubuntu容器内翻看时,我可以看到它看起来和感觉上都像一个Ubuntu服务器(文件系统布局等)。但是如果我运行uname命令,我会看到内核和CentOS主机之类的东西 显然,我知道底层内核由同一主机上的所有容器共享。但是,与主机操作系统共享的还

考虑到docker图像/容器有多种风格——Ubuntu、CentOS、CoreOS等。。。。我很好奇到底是什么组成了一个映像/容器,以及与主机操作系统共享了什么?分界线在哪里

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

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

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

Docker是Linux容器的包装器,它的文档将让您详细了解哪些是共享的,哪些不是

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


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

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

图像是层的逻辑分组,加上有关创建容器时要做什么以及如何组装层的元数据。元数据的一部分是每个层都知道其父层的ID

那么,什么进入一层呢?已添加到父级的文件(和目录)。还有一些特殊文件(“涂白”),表明从父级删除了某些内容

当您运行一个映像时,
docker
会创建一个容器:它以正确的顺序解压所有层,创建一个与主机分离的新“根”文件系统
docker
还读取图像元数据,并启动创建图像时指定的“入口点”或“命令”——这将启动一个新的流程子树。从容器内部看,第一个进程似乎是树的根,但从主机上看,它是进程的子树

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


容器不仅有自己的文件系统和进程树,而且有自己的逻辑网络接口,还可以选择分配RAM和CPU时间。不过,作为运营商,您可以控制容器,因此您可以决定与容器共享主机的网络接口,为容器提供对RAM和CPU的无限制访问,甚至可以将设备、文件和目录从主机装载到容器中。默认情况下是将事物分开,但您有权根据需要打破隔离模型。

那么容器特定的东西是通过内核名称空间实现的吗?就像每个容器都有自己的pid名称空间、自己的mnt名称空间、自己的net名称空间。。。。。?其他所有内容都与主机共享?确切地说,有一些方法可以查看容器,您可以直接使用主机堆栈,但除此之外,它是所有名称空间。Docker从3月份起默认不依赖LXC。因此,这将是我的下一个问题。我知道docker的默认执行驱动程序现在是libcontainer(不是LXC)。。。。我相信厄斯曼知道这一点。但是LXC文档是否仍能提供一个合适的位置来了解详细信息呢?此外,libcontainer围绕着现有的Linux容器API,特别是cgroup和名称空间。cgroup提供资源级隔离:cpu、内存、块i/o、网络。名称空间提供内核级隔离:进程、网络、用户id、文件系统。多谢,这非常有用。我真的很困惑什么是映像以及它与主机操作系统的关系。网站上的文档似乎没有很好地解释这一点,但你的答案在这里。