【发布时间】: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