【问题标题】:Understanding the technical (Docker) container architecture了解技术(Docker)容器架构
【发布时间】:2020-07-05 16:36:01
【问题描述】:

我是容器新手,想深入了解容器技术 (Docker) 是如何从“零开始”组成的。我必须写一篇论文,希望到目前为止我已经正确理解了所有重要的事情。

下图是我自己做的,展示了我目前对容器的理解。

显然,我们需要一个带有内核的操作系统,让我们能够使用硬件。对于 Docker,这就是 Linux。 Docker for Windows 使用带有 Linux 的 VM。

然后在我们的 Linux 操作系统之上运行我们的 Docker 引擎。我们的 Docker 引擎负责启动、构建、配置……我们的镜像和容器。但最重要的是,Docker 引擎处理与容器隔离有关的所有事情,例如,它维护命名空间或 cgroup 的使用方式,以便每个容器都有自己的完整文件系统。

然后我们就有了实际的容器。容器本身几乎每次都需要一种操作系统本身。这主要是一个非常紧凑的,比如 Alpine 或 Busybox。他们收集了大多数软件肯定需要的少量标准函数,例如'file'、'tar'、'grep'。这个紧凑的操作系统现在使用我们完整的 Linux 操作系统的内核。 他们没有自己的内核。

然后我们在紧凑的操作系统之上放置我们的实际软件,例如 Node.js 或 NGINX 服务器。该软件仅使用紧凑型操作系统,而后者使用我们完整 Linux 操作系统的内核。并且在运行时生成或完成的所有数据或修改都是在我们容器的可写层上进行的。


如果我理解正确,我们的容器或在我们容器中运行的所有东西都没有使用我们的完整 Linux 操作系统或与之交互,而只是使用它的内核? 我也不太明白容器中的可写层是如何工作的。例如,我的软件如何知道来自只读层的修改文件现在存在于可写层中并且应该使用它?

我非常感谢对我迄今为止错过的内容的一些更正或建议。谢谢

【问题讨论】:

  • 如果你想简单地理解 docker arch,它就像我们的其他 web 应用程序一样是一个客户端-服务器架构。 docker cli 是客户端,docker-machine 是服务器。
  • 对于可写层,请阅读 Docker Volumes 上的文档 - docs.docker.com/storage/volumes
  • 不使用我们完整的 Linux 操作系统或与其交互,而只是使用它的内核? -> 它共享几个东西并运行 ONE 内核,实际上它可以通过网络与主机系统交互,甚至在用作卷时直接与 docker 套接字交互......你应该阅读特权模式用于使用例如tun devices ,并且由于 UNIX/Linux 方式是“一切都是文件”,(例如,“设备”是文件,套接字可以是文件,硬盘是文件)也适用于这里..您可以将其“挂载”一个卷

标签: linux docker architecture containers busybox


【解决方案1】:

如果我理解正确,我们的容器或在我们容器中运行的所有东西都没有使用或与我们的完整 Linux 操作系统交互,而只是与它的内核?

容器只是进程。对于内核,Docker 守护进程、NodeJS 应用程序和 Nginx 都是进程。这就是容器没有自己的内核的原因。 Docker 守护进程(和主机上的其他进程)和在容器中运行的进程之间的区别在于它们的范围(称为命名空间)。容器中的进程是独立运行的,它们在其命名空间周围看不到任何东西。有许多不同的命名空间,例如,pid 命名空间就是其中之一,它限制了其他进程的可见性。这就是容器中的 ps 命令不显示来自主机或其他容器的进程的原因。命名空间是内核的东西,它们更多的是关于进程可以看到和访问的内容,同时还有 cgroups 对 CPU 和内存使用进行限制。

我希望这对你有所帮助,至少,我试图更多地关注内核,因为 Docker 只是一个守护进程,它使用已配置的命名空间、cgroups 和自己的文件系统来旋转新进程。

以下是一些可能有用的链接:

如果您想深入了解,我建议您查看Namespaces: from chroot() to containers 幻灯片并阅读the article about creation of own containers

【讨论】:

  • 感谢您的详细解释和非常有用的链接:)