Docker的底层原理及分析

 更新时间:2025年09月28日 09:18:36   作者:三傻317  
Docker通过命名空间实现进程、网络等隔离,利用Cgroups控制资源,联合文件系统分层存储并支持数据持久化,数据卷技术确保容器数据不受生命周期影响

Docker底层原理

docker实际上类似于一种“进程隔离技术”,利用Linux系统的一些特性功能,将不同容器隔离开来,使其不受外界的影响。

docker使用的Linux特性功能主要有:

1、命名空间(Namespace):把不同容器的进程、网络、文件系统隔离开来

2、控制组(Cgroups):限制容器使用CPU、内存等资源

3、联合文件系统(UnionFS):支持镜像的分层构建

一、命名空间

命名空间可以将全局资源分为若干块,命名空间内部的进程无法看到其他命名空间的进程,利用这一特点,就可以做到容器的隔离。

命名空间有很多类型,docker主要使用的如下:

  • 1、PID命名空间:该命名空间的第一个进程的PID为1,其他的进程都挂在这个第一个进程下面,这样容器内部就无法看到宿主机进程
  • 2、NET命名空间:控制网络资源,每个容器都可以有独立的IP、路由表、端口号,然后由宿主机通过虚拟网卡把容器网络连到外面。值得注意的是,docker本身并没有硬件或者模拟硬件,docker与宿主机共用一个内核(特别地,docker容器中的网络协议栈是独立的,但是最终走宿主机的内核TCP/IP协议栈,网络并非完全共用)
  • 3、IPC命名空间:控制进程间通信,如信号量等,以防与宿主机的IPC冲突
  • 4、UTS命名空间:控制主机名和域名,使每个容器都有自己的hostname
  • 5、MNT命名空间:控制系统挂载点,容器内部能看到的根目录/实际上是宿主机的某个子目录
  • 6、USER命名空间:控制用户和权限,容器内的root用户可以映射为宿主机的普通用户

二、控制组

为了防止被隔离的容器吃光宿主机的资源,docker还利用了Linux提供的Cgroups来进行资源控制,如CPU,内存,磁盘I/O,网络等资源。

Cgroups实际上是一颗资源管理的层级树,每个Cgroup节点都能设置资源限制,进程加入某个Cgroup,就必须遵守对应的限制。

三、联合文件系统

UnionFSUnion File System,联合文件系统)是一种分层的文件系统。

它的特点是:

  • 1、可以把多个目录(层)“联合”挂载在一起,对外呈现成一个目录。
  • 2、上层可以覆盖下层的文件(像透明胶片叠加)。
  • 3、支持写时复制(Copy-On-WriteCOW)。

为了保证docker拉取后镜像干净不被修改,镜像被拉取下来都是只读的层,运行容器时,会在镜像的最上层加上一层可写层,由于上层可以覆盖下层的特性,修改上层文件就能达到修改容器运行逻辑的目的,同时,保证了这个镜像内部不被修改;容器删除后,可写层会消失,镜像层保持不变 。

当需要修改可写层时,将需要修改的对应数据找到并复制到可写层,再进行修改,这就是写时复制。

四、数据卷挂载

通过学习联合文件系统我们知道,容器内部的文件系统是独立的,也是一次性的,每次容器重启后,原有的数据就会消失,对于需要数据持久化的程序,就需要使用数据卷技术。

数据卷实际上是容器与宿主机之间共享的一块目录/文件,它不受容器的生命周期影响,因此可以被用来持久化数据

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker+daocloud实现前端项目自动构建部署

    docker+daocloud实现前端项目自动构建部署

    这篇文章主要介绍了docker+daocloud实现前端项目自动构建部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • docker安装rocketMq5x以上的版本

    docker安装rocketMq5x以上的版本

    本文主要介绍了docker安装rocketMq5x以上的版本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01
  • Docker搭建Portainer可视化界面步骤详解

    Docker搭建Portainer可视化界面步骤详解

    在本篇文章里小编给大家分享的是一篇关于Docker搭建Portainer可视化界面的实例操作方法,需要的朋友们参考下。
    2019-10-10
  • Dockerfile的CMD指令用法

    Dockerfile的CMD指令用法

    这篇文章主要介绍了Dockerfile的CMD指令用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • docker启动mysql5.7服务详细说明

    docker启动mysql5.7服务详细说明

    这篇文章主要给大家介绍了关于docker启动mysql5.7服务的相关资料,文中通过代码示例介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • docker打包Python环境的过程详解

    docker打包Python环境的过程详解

    这篇文章主要介绍了docker打包Python环境过程,准备工作需要大家复制python程序启动程序,具体操作流程跟随小编一起看看吧
    2021-08-08
  • 不重启Docker容器就能修改时间的全方案总结

    不重启Docker容器就能修改时间的全方案总结

    在使用Docker的过程中,很多开发者会遇到需要修改容器时间的场景,本文会梳理Docker容器时间的底层逻辑,以及不重启容器修改时间的所有可行方案,大家可以根据需要进行选择
    2025-12-12
  • docker-compose的build使用方式

    docker-compose的build使用方式

    这篇文章主要介绍了docker-compose的build使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Ubuntu安装Docker及配置镜像加速与常见命令超详细教程

    Ubuntu安装Docker及配置镜像加速与常见命令超详细教程

    Docker是一种流行的容器化平台,它能够简化应用程序的部署和管理,这篇文章主要介绍了Ubuntu安装Docker及配置镜像加速与常见命令的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • 基于Maven+Docker的WebApp打包与部署全过程

    基于Maven+Docker的WebApp打包与部署全过程

    这篇文章主要介绍了基于Maven+Docker的WebApp打包与部署的相关资料,文中通过代码讲解了如何找到正确的JAR包、覆盖Docker使用的JAR、构建Docker镜像、解决Docker构建失败的问题以及在服务器上部署,需要的朋友可以参考下
    2026-02-02

最新评论