【Docker基础】理解 Docker:本质、性质、架构与核心组件

news/2025/2/26 10:08:02

文章目录

  • 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 虚拟化的区别

对比项JVMDocker 容器
性能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 推出的开源项目,核心组件就是 mobymoby 是 Docker 引擎(dockerd)使用的开源项目,现已从 moby 仓库 fork 并使用 containerd 作为运行时标准。
官方网站

dockerce_76">4. docker-ce

Docker 的开源版本,CE 代表 Community Edition(社区版)。docker-ce 的组件来源于 mobycontainerd 等开源项目。
定价页面

dockeree_80">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 rundocker 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容器编排工具,是一种跨平台的解决方案,支持高效管理容器的部署、扩展和管理。

http://www.niftyadmin.cn/n/5868527.html

相关文章

DeepSeek个人知识库

deepseek构建个人知识库 安装软件链接 : 安装链接 先在本地把deepseek跑起来,本地部署deepseek见前文链接: 本地部署ollama # 目前软件只支持1.5b小模型,将就着用 ollama run deepseek-r1:1.5b等服务器启动后开启软件 上传文件 输入消息 &#xff08…

结构型模式 - 外观模式 (Facade)

结构型模式 - 外观模式 (Facade) 又名门面模式,通过为多个子系统提供一个一致的接口,使得子系统使用起来更加容易. 外观模式是“迪米特法则”的典型应用. // CPU 类,代表 CPU 子系统 class CPU {public void start() {System.out.println("CPU 启动");}p…

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件(推荐、更容易)4.2 加载.Safetensors文件(不建议使用) 5.配置大模型文件 参考: 1、 如…

文件下载技术的终极选择:`<a>` 标签 vs File Saver.js

文件下载技术的终极选择&#xff1a;<a> 标签 vs File Saver.js 在 Web 开发中&#xff0c;文件下载看似简单&#xff0c;实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…

【Elasticsearch】script_fields 和 runtime_fields的区别

script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能&#xff0c;但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比&#xff1a; 1.定义和应用场景 • script_fields&#xff1a; • 定义&#xff1a;通过 Painless 脚本…

蓝桥杯 Java B 组之记忆化搜索(滑雪问题、斐波那契数列)

Day 5&#xff1a;记忆化搜索&#xff08;滑雪问题、斐波那契数列&#xff09; &#x1f4d6; 一、记忆化搜索简介 记忆化搜索&#xff08;Memoization&#xff09; 是一种优化递归的方法&#xff0c;它利用 哈希表&#xff08;HashMap&#xff09;或数组 存储已经计算过的结果…

架构思维:架构的演进之路

文章目录 引言为什么架构思维如此重要架构师的特点软件架构的知识体系如何提升架构思维大型互联网系统架构的演进之路一、大型互联网系统的特点二、系统处理能力提升的两种途径三、大型互联网系统架构演化过程四、总结 引言 在软件开发行业中&#xff0c;有很多技术人可能会问…

1.4常规es报错问题

问题一&#xff1a;unable to install syscall filter [2016-11-06T16:27:21,712][WARN ][o.e.b.JNANatives ] unable to install syscall filter: Java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5 with CONFIG_SECCOMPandCONFIG_SECCOM…