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

Nig*_*ton 16 linux ubuntu containers docker

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

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

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

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

And*_*ndy 27

区分图像容器(docs)会很有帮助.一个图像是静态的,只生活在磁盘上.一个容器是一个正在运行的实例图像,它包括其自身的进程树以及RAM和其他运行时资源.

一个图像是如何创建一个容器,以及如何组装层时该怎么办层加元数据的逻辑分组.部分元数据是每个层都知道其父级ID.

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

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

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

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


Usm*_*ail 5

Docker 是LXC Linux Containers的包装器,其文档将让您详细了解哪些是共享的,哪些不是。

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

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

  • 自 3 月以来,Docker 默认不依赖 LXC。 (5认同)
  • 此外,**libcontainer** 封装了现有的 Linux 容器 API,尤其是 **cgroups** 和 **namespaces**。cgroups 提供资源级别的隔离:cpu、内存、块 i/o、网络。命名空间提供内核级隔离:进程、网络、用户 ID、文件系统。更多[这里](http://www.infoq.com/news/2014/03/docker_0_9) (2认同)