【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 的具体步骤。无论你是初涉数据领域的新手,还是希望更新知识体系的专业人士,只要按照本…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...