文章目录
- 容器技术 vs 虚拟机
- 操作系统
- 容器
- Docker与操作系统
容器技术 vs 虚拟机
操作系统
操作系统是一个很重而且很笨的程序,简称笨重,有多笨重呢?
操作系统运行起来是需要占用很多资源的,大家对此肯定深有体会,刚装好的系统还什么都没有部署,单纯的操作系统其磁盘占用至少几十G起步,内存要几个G起步。
我们没有办法划分出更过虚拟机从而部署更多的应用程序,可是我们部署的是应用程序,要用的也是应用程序而不是操作系统。
如果有一种技术可以让我们避免把内存浪费在“无用”的操作系统上岂不是太香?这是问题一,主要原因在于操作系统太重了。
还有另一个问题,那就是启动时间问题,我们知道操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢,动辄数分钟,因此操作系统还是太笨了。
容器
现代软件开发的一大目的就是隔离,应用程序在运行时相互独立互不干扰,这种隔离实现起来是很不容易的,其中一种解决方案就是上面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。
与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。
从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间容器几乎瞬时启动,容器技术为打包服务栈提供了一种更加高效的方式,So cool。
Docker与操作系统
把image理解为可执行程序,container就是运行起来的进程。dockerfile就是image的源代码,docker就是"编译器"
Docker 是一种容器化平台,它的底层实现原理涉及多个组件和技术,与操作系统的关系密切,并且使用操作系统的特性来实现容器化。以下是 Docker 的底层实现原理以及与操作系统的关系的一些关键点:
命名空间(Namespaces):Docker 使用 Linux 内核的命名空间来隔离进程、网络、文件系统、用户等资源。每个容器都有自己的命名空间,使得它们看起来像是在独立的操作系统环境中运行。这些命名空间允许容器拥有自己的进程树、网络接口、文件系统根目录等。
控制组(Control groups):控制组是 Linux 内核的一个特性,它用于限制和管理进程组的资源使用,包括 CPU、内存、磁盘 I/O、网络带宽等。Docker 使用 cgroups 来分配和控制容器的资源使用,以确保容器在宿主系统上得到适当的资源分配。
联合文件系统(Union File System):Docker 使用联合文件系统来创建容器的文件系统。联合文件系统允许多个文件系统层叠在一起,形成一个容器的文件系统。这使得镜像的分层存储和容器的快速启动变得可能,因为它们可以共享相同的底层文件系统层。
容器镜像:容器镜像是一个不可变的文件系统快照,包含应用程序和其依赖项。镜像可以根据层叠文件系统的方式进行构建和共享,这使得容器可以轻松地创建和部署。镜像也是 Docker 容器的基础,每个容器都是基于一个或多个镜像启动的。
宿主操作系统:Docker 运行在宿主操作系统之上,并与宿主操作系统共享内核。这意味着 Docker 容器与宿主操作系统相互影响,并且宿主操作系统必须是支持容器技术的,通常是基于 Linux 的发行版。
关于资源分配,Docker 使用 cgroups 来限制容器的资源使用,可以通过 Docker 命令或配置文件来指定容器的 CPU、内存、磁盘等资源限制。这样可以确保容器在运行时不会过度消耗宿主系统的资源,同时允许多个容器在同一宿主系统上并发运行。
总的来说,Docker 的底层实现原理涉及 Linux 内核的各种特性和技术,它与操作系统紧密合作,通过命名空间、cgroups、联合文件系统等机制来实现容器的隔离和资源管理,从而提供了轻量级、可移植和可扩展的容器化解决方案。
参考:https://zhuanlan.zhihu.com/p/187505981