我看到docker存储库中的很多docker镜像都是基于Ubuntu制作的。
这是什么意思?每个容器是否都捆绑了精简版的 Linux 内核?
容器是否位于其自己的内核之上?但我认为容器共享主机的内核(在某些情况下是 boot2docker,一种自定义 Tiny Core Linux 构建,而在其他情况下则是 CoreOS 之类的东西)。
编辑:稍微澄清一下问题。是的,我知道 docker 是一个进程容器,而不是完整的 VM。但是,由于官方 docker hub 注册表和其他操作系统(如 CentOS)中都有“Ubuntu”容器,那么在容器中运行 Ubuntu 意味着什么?
回答:啊,我突然明白了。它是 Ubuntu 用户登录进程,包含 apt-get 和特定 Ubuntu 版本的其他配置进程。CentOS 也是如此。Docker 不是单一进程,只是单一入口。因此对于这些发行版,入口点是某种生成其他进程的 init 进程。
答案1
Docker 使用主机操作系统内核,容器内没有自定义或额外的内核。在一台机器上运行的所有容器都共享这个“主机”内核。
维基百科说http://en.wikipedia.org/wiki/Docker_(软件)那
Docker 使用 Linux 内核的资源隔离功能(例如 cgroups 和内核命名空间)允许独立的“容器”在单个 Linux 实例内运行,从而避免启动虚拟机的开销。
cgroups、namespaces 和 LXC 是 Linux 内核用于隔离进程组的功能;仍然有单内核、单调度程序和一个内核内存管理器实例。
Boot2docker 和 CoreOS 只是带有一些主机内核的轻量级 Linux 发行版;它们可用于加载 Docker 容器。
boot2docker 是一款基于 Tiny Core Linux 的轻量级 Linux 发行版,专为运行 Docker 容器而设计。它完全从 RAM 运行,大小约为 27MB,启动时间约为 5 秒(YMMV)。
http://en.wikipedia.org/wiki/CoreOS
单个控制主机(CoreOS 实例)运行多个隔离的 Linux 系统(容器),使用 Docker 作为额外的抽象层和接口[14],与 Linux 内核的底层操作系统级虚拟化功能交互。……这种方法依赖于 Linux 内核的 cgroups 功能,该功能提供命名空间隔离以及限制、核算和隔离进程集合的资源使用情况(CPU、内存、磁盘 I/O 等)的能力。
答案2
在几乎所有情况下,主机操作系统内核都是共享的。要运行不同的内核,您需要使用虚拟化。这种情况很少见,并且仅在由于性能下降而必要时使用。
“Docker Engine 容器仅包含应用程序及其依赖项。它作为主机操作系统用户空间中的独立进程运行,与其他容器共享内核。因此,它享有虚拟机的资源隔离和分配优势,但可移植性和效率更高。”
这可能有助于解释它的工作原理:
答案3
所有的docker容器都使用主机内核。
这也意味着,主机内核和容器发行版之间的某些不兼容性可能会导致问题。理论上是这样。例如,如果容器化软件想要使用一些未编译到主机内核中的内核功能,那么它将无法工作。
实践表明这种情况不会发生。docker 容器的主要麻烦来源是 docker 本身的(通常无法解释的)限制,而不是某些主机-客户机内核不兼容。
(注:这是因为几乎所有 Linux 发行版都可以与任何 Linux 内核兼容。)