浅谈Docker底层原理

简介: 浅谈Docker底层原理

1 Docker和虚拟机异同

如下图,来自Docker官网,左边为Docker,右边为虚拟机,VM虚拟机是在宿主机器操作系统的基础上创建操作系统Docker是在宿主机器的操作系统上创建Docker引擎,直接调用硬件资源

但是Docker和虚拟机都有的相同点,那就是隔离性,Docker最大优势就是相对于虚拟机更加的轻量级。

因此,我们可以总结出:

Docker和虚拟机相同点:

  • 隔离性
  • 资源可分配

Docker和虚拟机不同点:

  • 虚拟机是硬件层抽象,虚拟硬件和操作系统,而Docker是应用层抽象,只虚拟化操作系统
  • Docker相比虚拟机更加轻量级和便携
  • Docker启动速度更快

2 Docker底层原理

说到Docker的底层原理,不得不说下Linux中的两个关键性概念:cgroupsnamespace,下面我们利用wiki的参考来进行下讲解。

2.1 cgroups

cgroups,其名称源自控制组群(英语:control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。

cgroups的一个设计目标是为不同的应用情况提供统一的接口,从控制单一进程到操作系统层虚拟化(像LXC)。

LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱执行环境,使得Linux用户可以容易的创建和管理系统或应用容器。

在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。

LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。软件Docker被用来管理LXC的环境。

cgroups功能:

  • **资源限制:**组可以被设置不超过设定的内存限制;这也包括虚拟内存。
  • **优先级:**一些组可能会得到大量的CPU 或磁盘IO吞吐量。
  • **结算:**用来度量系统实际用了多少资源。
  • **控制:**冻结组或检查点和重启动。
2.2 Namespace

名字空间(英语:Namespace),也称命名空间名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个名字空间中定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。

在编程语言中,名字空间是对作用域的一种特殊的抽象,它包含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。许多现代编程语言都支持名字空间。在一些编程语言(中,名字空间本身的标识符也属于一个外层的名字空间,也即名字空间可以嵌套,构成一个名字空间树,树根则是无名的全局名字空间

命名空间最典型的是在Spring的IOC配置文件中:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <property name="basePackage" value="org.ymx.Dao"/>
</bean>

3 总结

Docker是采用Go语言编写的项目,底层原理就是利用Linux的cgroups和namespace,本质上就是操作系统的一个进程,cgroups主要负责资源分配,namespace主要负责容器间的隔离(包括进程和网络等等)。

参考链接:

https://upload.wikimedia.org/wikipedia/commons/e/e7/Linux_kernel_unified_hierarchy_cgroups_and_systemd.svg

https://zh.wikipedia.org/wiki/Cgroups

https://zh.wikipedia.org/wiki/LXC

https://zh.wikipedia.org/wiki/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4

https://www.docker.com/resources/what-container

相关文章
|
1月前
|
存储 缓存 Linux
docker的底层原理六: 联合文件系统(UnionFS)
本文介绍了Docker使用的联合文件系统(UnionFS),它通过分层存储和写时复制(CoW)机制,实现了容器的轻量级、高性能存储,支持了镜像继承、数据持久化和隔离性。
49 0
|
1月前
|
安全 Linux 调度
docker的底层原理三: 内核共享
本文阐述了Docker容器通过共享宿主机的内核来实现轻量级运行,同时利用命名空间、控制组、文件系统和网络隔离等技术确保容器的安全性和资源控制。
61 6
|
1月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
38 5
|
1月前
|
存储 API 数据中心
docker的底层原理
本文概述了Docker的底层原理,包括客户端-服务器架构、容器运行时环境、内核共享、资源隔离、控制组、联合文件系统、可移植性、镜像构建以及插件和API等方面。
25 4
|
1月前
|
Linux 调度 数据安全/隐私保护
docker的底层原理五: 控制组
本文介绍了Docker中控制组(cgroups)的功能,包括CPU和内存控制、磁盘I/O和网络带宽限制、设备访问控制、审计和报告,以及层次化控制结构,确保容器资源使用的隔离性和限制性。
19 0
|
1月前
|
存储 Linux 数据中心
docker的底层原理四: 资源隔离
本文详细解释了Docker利用Linux内核的Namespace和Cgroups技术实现资源隔离,包括CPU、内存、网络、存储、文件系统、进程间通信、用户和用户组以及进程ID和主机名的隔离,确保容器的独立性和系统的安全性。
47 0
|
1月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
20 0
|
3月前
|
消息中间件 Linux Docker
在Docker中,资源限制原理是什么?
在Docker中,资源限制原理是什么?
|
3月前
|
存储 缓存 Docker
Docker系列.Docker镜像分层原理
Docker系列.Docker镜像分层原理
179 4
|
4月前
|
Java 应用服务中间件 持续交付
Java面试题:简述Docker等容器化技术的原理及其在Java应用部署中的作用。
Java面试题:简述Docker等容器化技术的原理及其在Java应用部署中的作用。
70 0