【Docker基础】理解 Docker:本质、性质、架构与核心组件
文章目录
- Docker 本质
- Docker 的引擎迭代
- Docker 和虚拟机的区别
- Docker 为什么比虚拟机资源利用率高,速度快?
- Docker 和 JVM 虚拟化的区别
- Docker 版本
- 1. LXC (Linux Containers)
- 2. libcontainer
- 3. Moby
- 4. docker-ce
- 5. docker-ee
- 总结:
- Docker 架构
- 1. Docker 仓库 (Registry)
- 2. Docker 守护进程 (Daemon)
- 3. Docker 客户端 (Client)
- 4. Docker 主机 (Host)
- 5. Docker 镜像 (Images)
- 6. Docker 容器 (Container)
- 补充组件
Docker 本质
-
Docker本质上类似于LXC(Linux Container,一种 Linux 下的虚拟化解决方案),但它本身并不是容器,而是容器的易用工具。容器技术源自于 Linux 内核,Docker 的主要作用是将这一技术进行普及和简化。早期版本的 Docker 实际上是对 LXC 的二次封装和发行。 -
作为容器技术的实现,
Docker是一个基于 Go 语言开发的开源项目,其核心目标是“Build, Ship and Run Any APP, Anywhere”。简单来说,Docker 通过对应用组件的封装、分发、部署和运行等生命周期的管理,帮助用户实现“一次封装,到处运行”的目标。 -
在早期,Docker 使用 LXC 作为容器管理引擎,但它对容器创建过程进行了改进。Docker 不再通过模板去安装容器,而是采用镜像技术。镜像文件将操作系统用户空间所需的所有组件预先编排并打包成一个文件(即镜像)。这些镜像文件集中存储在镜像仓库中。当需要创建容器时,Docker 会调用 LXC 的工具
lxc-create,但是不再通过 LXC 模板安装,而是连接到镜像仓库,下载匹配的镜像文件,并基于镜像启动容器。
因此,Docker 极大地简化了容器的使用过程。用户创建和启动容器时,只需使用简单的命令:docker run 启动容器,docker stop 停止容器。
Docker 的引擎迭代
Docker 在早期是基于 LXC 容器管理引擎实现的,但随着技术的逐步成熟,Docker 自行开发了一个新的容器引擎,名为 libcontainer。随后,随着 CNCF(Cloud Native Computing Foundation)的介入,Docker 又研发了一个符合工业化标准的容器引擎——runC。目前,最新版的 Docker 已经采用了 runC 作为其默认的容器引擎。
Docker 和虚拟机的区别
| 对比项 | 传统虚拟机 | Docker 容器 |
|---|---|---|
| 磁盘占用 | 几个 GB 到几十个 GB | 几十 MB 到几百 MB |
| CPU/内存占用 | 虚拟操作系统非常占用 CPU 和内存,需要通过虚拟层调用,占用率高 | Docker 引擎占用资源极低,直接作用于硬件资源,占用少 |
| 启动速度 | 几分钟(从开机到运行项目) | 几秒(从开启容器到运行项目) |
| 安装/管理 | 需要专门的运维技术 | 安装、管理方便,应用部署 |
| 部署 | 手动部署,速度慢 | 体系化部署,可以自动化,速度快 |
| 隔离性 | 系统级别(每个虚拟机有独立的操作系统) | 进程级别(共享宿主机操作系统内核) |
| 封装程度 | 打包整个操作系统 | 打包项目代码和依赖信息 |
Docker 为什么比虚拟机资源利用率高,速度快?

从上图可以看出来:
Docker 相比虚拟机具有更少的抽象层。Docker 不依赖 Hypervisor 进行硬件资源虚拟化,容器中的程序直接访问宿主机的物理硬件资源。
因此,在 CPU 和内存的利用率上,Docker 显著优于虚拟机,具备更高的效率。
Docker 使用的是宿主机的内核,而不需要独立的 Guest OS,这也节省了操作系统所占用的资源。 当创建 Docker 容器时,不需要像虚拟机那样重新加载操作系统内核。这样避免了加载和启动操作系统内核时所消耗的时间和资源。当创建一个虚拟机时,虚拟机管理软件需要加载 Guest OS,整个过程通常需要几分钟;而创建 Docker 容器则只需几秒钟。
Docker 和 JVM 虚拟化的区别
| 对比项 | JVM | Docker 容器 |
|---|---|---|
| 性能 | JVM 需要占用一定的 CPU 和内存 | 基本没有损失 |
| 虚拟层面 | 基于 JVM 虚拟机,属于更高层的虚拟化 | 基于操作系统,更加通用,不依赖特定代码 |
| 代码无关性 | 一个特定代码的执行平台,运行时才存在,只能支撑特定代码的执行,并且必须在 JVM 进程内 | 模拟了整个操作系统,是静态存在的,可以支撑任何相同平台的应用程序 |
| 主机隔离性 | JVM 不隔离主机 | 通过命名空间实现隔离 |
Docker 版本
1. LXC (Linux Containers)
LXC 是最早的 Linux 容器技术,Docker 早期版本使用 LXC 来实现容器的底层功能。虽然使用者较少,但 LXC 仍在持续发展中。
2. libcontainer
从 Docker 0.9 版本开始,Docker 开发了 libcontainer,作为 LXC 的替代方案。在 Docker 1.10 版本中,完全移除了 LXC 支持,并在 1.11 版本中将 libcontainer 拆分成 runc,后者成为容器的标准。
3. Moby
Moby 是 Docker 推出的开源项目,核心组件就是 moby。moby 是 Docker 引擎(dockerd)使用的开源项目,现已从 moby 仓库 fork 并使用 containerd 作为运行时标准。
官方网站
4. docker-ce
Docker 的开源版本,CE 代表 Community Edition(社区版)。docker-ce 的组件来源于 moby 和 containerd 等开源项目。
定价页面
5. docker-ee
Docker 的收费版本,EE 代表 Enterprise Edition(企业版)。与 docker-ce 相同,但添加了企业级功能和支持。
定价页面
总结:
- LXC:早期的容器技术,现已被 Docker 替代。
- libcontainer:Docker 自主开发的容器实现,后与
runc合并。 - Moby:Docker 开源项目,包含 Docker 引擎的核心。
- docker-ce:Docker 开源社区版。
- docker-ee:Docker 企业收费版,提供额外的企业级功能。
Docker 架构
Docker 使用 客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。
Docker 容器通过 Docker 镜像来创建。

1. Docker 仓库 (Registry)
Docker 仓库用于存储和管理 Docker 镜像。可以类比为代码仓库(如 Git)。
- 公共仓库:例如 Docker Hub,提供了丰富的公共镜像供用户使用,如 Nginx、MySQL、Redis 等。
- 私有仓库:企业或个人可以搭建私有仓库(如 Docker Registry)来存储私有镜像,确保数据的安全性和定制化。
- 功能:仓库支持镜像的推送(push)和拉取(pull),并且可以管理不同版本的镜像。
2. Docker 守护进程 (Daemon)
Docker 守护进程是运行在后台的服务,负责管理 Docker 容器的生命周期(包括容器的创建、运行、停止等)。它通常也被称为 Docker Daemon,负责:
- 启动和停止容器
- 构建、拉取和推送镜像
- 处理 Docker 客户端的请求
- 管理网络和存储等资源
- 通常,守护进程通过
dockerd启动。
3. Docker 客户端 (Client)
Docker 客户端是与 Docker 守护进程通信的接口,用户可以通过客户端与 Docker 守护进程交互,发送命令(如 docker run、docker build 等)。客户端主要通过以下方式进行通信:
- 命令行接口 (CLI):最常见的方式,用户通过命令行与 Docker 守护进程交互。
- REST API:开发者可以通过 Docker 提供的 API 进行集成和自动化管理。
4. Docker 主机 (Host)
Docker 主机是指运行 Docker 守护进程和容器的物理机或虚拟机。Docker 主机负责:
- 执行容器的运行时环境
- 提供计算资源(CPU、内存等)
- 执行网络和存储管理等功能
- 在单主机上运行多个容器,多个主机可以通过 Docker Swarm 或 Kubernetes 集群进行管理。
5. Docker 镜像 (Images)
Docker 镜像是容器的构建模板,包含运行某个应用所需要的操作系统环境、依赖库、应用程序代码等。镜像具有以下特点:
- 只读:镜像本身是不可修改的,一旦构建完成,它就保持不变。
- 分层存储:每个镜像由多个层组成,每一层都包含一些更改。Docker 镜像利用联合文件系统来实现这一点,这样可以有效地减少存储空间的浪费。
- 构建和定制:用户可以使用 Dockerfile 来定义镜像的构建过程,包括安装软件、配置环境等。
6. Docker 容器 (Container)
Docker 容器是由 Docker 镜像创建的运行实例,是应用程序和服务的封装体。容器在隔离环境中运行,具有以下特点:
- 轻量级:容器共享主机的操作系统内核,因此比虚拟机更节省资源。
- 可移植性:容器内部的应用与其依赖环境封装在一起,可以在不同的主机上运行,保证一致性。
- 短暂性:容器可以快速启动、停止和销毁,支持弹性扩展。
- 隔离性:容器在操作系统级别提供进程和文件系统的隔离,使得不同的容器能够相互独立运行,避免冲突。
补充组件
除了基本的架构组成,Docker 生态系统还包括以下相关组件:
- Docker Compose:用于定义和运行多容器应用的工具。通过一个 YAML 文件,用户可以定义多个服务,并使用单个命令来启动或停止整个应用。
- Docker Swarm:Docker 原生的集群管理工具,支持容器的集群部署、负载均衡、自动伸缩等功能。
- Kubernetes:容器编排工具,是一种跨平台的解决方案,支持高效管理容器的部署、扩展和管理。
相关文章:
【Docker基础】理解 Docker:本质、性质、架构与核心组件
文章目录 Docker 本质Docker 的引擎迭代Docker 和虚拟机的区别Docker 为什么比虚拟机资源利用率高,速度快?Docker 和 JVM 虚拟化的区别Docker 版本1. LXC (Linux Containers)2. libcontainer3. Moby4. docker-ce5. docker-ee总结: Docker 架构…...
LeetCodehot 力扣热题100 全排列
这段代码的目的是计算给定整数数组的所有全排列(permutations),并返回一个包含所有排列的二维数组。 思路解析 在这段代码中,采用了 深度优先搜索(DFS) 和 回溯 的方法来生成所有的排列。 关键步骤…...
SQL笔记#数据更新
一、数据的插入(INSERT语句的使用方法) 1、什么是INSERT 首先通过CREATE TABLE语句创建表,但创建的表中没有数据;再通过INSERT语句向表中插入数据。 --创建表ProductIns CREATE TABLE ProductIns (product_id CHAR(4) NOT NULL,product_name VARCHAR(1…...
GCC 和 G++的基本使用
GCC 和 G 命令 GCC 和 G 命令GCC(GNU C 编译器)基本用法常用选项示例 G(GNU C 编译器)基本用法常用选项示例 GCC 与 G 的区别选择使用 GCC 还是 G C编译流程1. 预处理(Preprocessing)2. 编译(Co…...
Maven中一些基础知识点
早些时候只知道创建或者开发springboot项目时候,有一个叫pom.xml的文件可以用来管理项目所需的依赖/第三方工具。 索性稍微深入了解了一下,然后把自己认为重要的记录下来。 首先我们要引入新的依赖自然是在dependencies下写dependency,这个…...
论文阅读笔记:Deep Face Recognition: A Survey
论文阅读笔记:Deep Face Recognition: A Survey 1 介绍2 总览2.1 人脸识别组件2.1.1 人脸处理2.1.2 深度特征提取2.1.3 基于深度特征的人脸对比 3 网络结构和损失函数3.1 判别损失函数的演化3.1.1 基于欧式距离的损失3.1.2 基于角度/余弦边距的损失3.1.3 Softmax损失…...
JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能
提到飞行记录器,或许你的脑海中并未立刻浮现出清晰的画面,但一说起“黑匣子”,想必大多数人都能恍然大悟,知晓其重要性及用途。在航空领域,黑匣子作为不可或缺的设备,默默记录着飞行过程中的每一项关键数据…...
爬虫框架与库
爬虫框架与库是用于网络数据抓取的核心工具,帮助开发者高效地从网页中提取结构化数据。 Requests:用于发送HTTP请求。 BeautifulSoup:用于解析HTML和XML。 Scrapy:强大的爬虫框架,适合大规模爬取。 Selenium&#…...
PyTorch常用函数总结(持续更新)
本文主要记录自己在用 PyTorch复现经典模型 过程中遇到的一些函数及用法,以期对 常见PyTorch函数 更加熟练~ 官方Docs:PyTorch documentation — PyTorch 2.6 documentation 目录 数据层面 torch.sign(tensor) torch.tensor(np.eye(3)[y]) torch.on…...
代码异常(js中push)NO.4
1. 环境 Vue3,Element Plsu 2. 示例代码 const { updateBy, updateTime, ...curObj } form.valuecurObj.id props.tableData.length 1var newTableData props.tableData.push(curObj)updateTableData(newTableData)3. 情景描述 newTableData变成了整数&#…...
Anaconda 2025 最新版安装与Python环境配置指南(附官方下载链接)
一、软件定位与核心功能 Anaconda 2025 是Python/R数据科学集成开发平台,预装1500科学计算库,新增AI模型可视化调试、多环境GPU加速等特性。相较于传统Python安装,其优势包括: 环境隔离:通过conda工具实现多版本Pyth…...
Vue 中动态实现进度条
在 Vue 中动态实现进度条,基本上有两种常见的方法:直接通过 Vue 数据绑定控制样式,或者利用外部库来实现更复杂的功能。我们会深入探讨这两种方式,并且详细说明每种方法的实现步骤、优缺点以及使用场景。 1. 使用 Vue 数据绑定来…...
CSS滚动条原理与自定义样式指南,CSS滚动条样式失效,滚动条样式无效,-webkit-scrollbar无效,overflow不显示滚动条
滚动内容形成的必要条件 CSS Overflow属性解析 MDN官方文档-Overflow属性 菜鸟教程-Overflow属性 overflow 属性控制内容溢出元素框时在对应的元素区间内是否添加滚动条。 值描述visible默认值。内容不会被修剪,会呈现在元素框之外。hidden内容会被修剪…...
Three.js 入门(辅助、位移、父子关系、缩放旋转、响应式布局)
本篇主要学习内容 : 三维坐标系与辅助坐标系物体位移与父子元素物体的缩放与物体的旋转设置响应式画布与全屏控制 点赞 关注 收藏 学会了 本文使用 Three.js 的版本:171 基于 Vue3vite开发调试 1.三维坐标系与辅助坐标系 1.1) 导入three和轨道控制器 // 导入…...
python算法-用递归打印数字3的幂--Day017
文章目录 前言采用创新方式,精选趣味、实用性强的例子,从不同难度、不同算法、不同类型和不同数据结构进行总结,全面提升算法能力。例1.用递归打印数字例2.相对排名 总结 前言 采用创新方式,精选趣味、实用性强的例子,…...
Selenium 与 Coze 集成
涵盖两者的基本概念、集成步骤、代码示例以及相关注意事项。 基本概念 Selenium:是一个用于自动化浏览器操作的工具集,支持多种浏览器(如 Chrome、Firefox 等),能够模拟用户在浏览器中的各种操作,如点击、输入文本、选择下拉框等,常用于 Web 应用的自动化测试。Coze:它…...
AWS CLI将读取器实例添加到Amazon Aurora集群
Amazon Aurora是AWS提供的一种兼容MySQL和PostgreSQL的关系数据库服务。Aurora集群由一个写入器实例和多个读取器实例组成,可以提供高可用性、高性能和可扩展性。在本文中,我们将介绍如何使用AWS命令行界面(CLI)将读取器实例添加到现有的Aurora集群中。 © ivwdcwso (ID: u…...
NTS库学习,找bug中......
基础知识 Coordinate: 表示一个二维坐标点,包括 X 和 Y 坐标值。 CoordinateSequence: 由一系列 Coordinate 对象组成的序列,可以表示线、多边形等几何对象的顶点。 CoordinateFilter: 用于对几何对象的坐标进行过滤或修改的接口。 Geometry: 表示一个几…...
五十天精通硬件设计第40天-硬件测试流程
目录 一、硬件测试流程概述 二、详细测试流程 1. 需求分析与测试计划 2. 测试环境搭建 3. 测试执行 3.1 基本功能测试 3.2 性能测试 3.3 环境与可靠性测试 3.4 安全与合规性测试 4. 问题分析与调试 5. 回归测试与报告输出 三、关键注意事项 四、常见问题与解决 五…...
R语言安装教程(附安装包)R语言4.3.2版本安装教程
文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手,还是希望更新知识体系的专业人士,只要按照本…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
