在docker容器中使用操作系统有什么意义?
在 docker 存储库中,您可以找到一个 Ubuntu docker 镜像:https://registry.hub.docker.com/_/ubuntu/ 我认为 Docker 更处于“应用程序”级别。
那么 Ubuntu docker 容器和 Ubuntu 虚拟机之间有什么区别呢?如果你的整个操作系统都在 docker 容器中,那么使用 Docker 是不是毫无意义呢?
谢谢
答案1
你缺乏基本的 Docker 概念。这是完全不同的事情。
你首先需要知道的是 Docker 的哲学:运行一个过程在容器中隔离。您不会在 Docker 容器中运行操作系统,而是在容器内运行进程,该进程的根文件系统内容基于您选择的 Linux 发行版。Ubuntu 是众多选择之一。
现在你应该想知道如何让一个进程在不同于你的主机正在运行的 Linux 发行版的 Linux 基础映像中运行。要运行操作系统,你基本上需要:
- 启动文件系统:包含引导加载程序和内核,一旦加载,它们将驻留在内存中。在 Docker 容器的情况下,我们不必关心这一点,因为内核与主机共享,并且是所有 Linux 发行版之间的通用部分。
- 根文件系统:包含文件系统结构。不同的 Linux 发行版可能有所不同。在启动序列完成之前,它是只读的。
Docker 使用 UnionFS 来管理容器内的磁盘块层,以便您可以堆叠它们。
在后台,它使用联合挂载,允许同时挂载多个文件系统,看起来像一个完整的虚拟文件系统。它实际上将基础映像层作为读写模式放在只读模式的基础根文件系统之上。
这里有一堆磁盘块,它们以某种方式分层排列,基础映像所来自的 Linux 发行版一旦安装在真实主机中就会包含相同的文件系统,但这次它是在容器内。
现在缺少的最后一件事是:你如何独立运行这个东西?
答案是:命名空间。我不会在这里详细阐述,因为这会偏离原始问题。但您需要知道的是,自内核 2.4.19 以来,多年来出现了各种命名空间。目前可用的命名空间如下:
- IPC :IPC 命名空间(进程间通信)
- MNT :挂载命名空间
- NET :网络命名空间
- PID : pid 命名空间
- USER :用户命名空间 (uid)
- UTS :UTS 命名空间(主机名)
命名空间是内核中的独立结构,允许进程在特定环境中运行。例如,MNT 命名空间将是使进程在基础映像根文件系统特性中运行的关键功能。NET 命名空间将是容器具有特定网络接口以便与 docker bridge 等进行通信的另一个关键功能。
所以,是的,所有这些的主要目的是运行一个独立应用程序,并通过一个称为容器的盒子轻松地将其从本地环境运送到生产环境。
阅读是个好主意docker 的文档然后再进一步深入研究。