文章目录
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
作为运行时标准。
官方网站
dockerce_76">4. docker-ce
Docker 的开源版本,CE 代表 Community Edition(社区版)。docker-ce
的组件来源于 moby
和 containerd
等开源项目。
定价页面
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,负责:
3. Docker 客户端 (Client)
Docker 客户端是与 Docker 守护进程通信的接口,用户可以通过客户端与 Docker 守护进程交互,发送命令(如 docker run
、docker build
等)。客户端主要通过以下方式进行通信:
- 命令行接口 (CLI):最常见的方式,用户通过命令行与 Docker 守护进程交互。
- REST API:开发者可以通过 Docker 提供的 API 进行集成和自动化管理。
4. Docker 主机 (Host)
Docker 主机是指运行 Docker 守护进程和容器的物理机或虚拟机。Docker 主机负责:
5. Docker 镜像 (Images)
Docker 镜像是容器的构建模板,包含运行某个应用所需要的操作系统环境、依赖库、应用程序代码等。镜像具有以下特点:
- 只读:镜像本身是不可修改的,一旦构建完成,它就保持不变。
- 分层存储:每个镜像由多个层组成,每一层都包含一些更改。Docker 镜像利用联合文件系统来实现这一点,这样可以有效地减少存储空间的浪费。
- 构建和定制:用户可以使用 Dockerfile 来定义镜像的构建过程,包括安装软件、配置环境等。
6. Docker 容器 (Container)
Docker 容器是由 Docker 镜像创建的运行实例,是应用程序和服务的封装体。容器在隔离环境中运行,具有以下特点:
- 轻量级:容器共享主机的操作系统内核,因此比虚拟机更节省资源。
- 可移植性:容器内部的应用与其依赖环境封装在一起,可以在不同的主机上运行,保证一致性。
- 短暂性:容器可以快速启动、停止和销毁,支持弹性扩展。
- 隔离性:容器在操作系统级别提供进程和文件系统的隔离,使得不同的容器能够相互独立运行,避免冲突。
补充组件
除了基本的架构组成,Docker 生态系统还包括以下相关组件: