目录
[2.传统虚拟机 vs 容器](#2.传统虚拟机 vs 容器)
[5.Docker 平台架构](#5.Docker 平台架构)
1.Docker简介
- Docker是基于Go语言实现的云开源项目。
- Docker的主要目标是:
Build, Ship and Run Any App, Anywhere
,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP及其运行环境能做到一次镜像,处处运行 - 解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
2.传统虚拟机 vs 容器
|--------|-----------|-------|
| 特性 | 容器 | 虚拟机 |
| 启动 | 秒级 | 分钟级 |
| 大小 | 一般为Mb | 一般为Gb |
| 速度 | 接近原生 | 比较慢 |
| 系统支持数量 | 单机支持上千个容器 | 一般几十个 |
传 统虚拟机(virtual machine):
- 传统虚拟机技术基于安装在主操作系统上的虚拟机管理系统(如VirtualBox、VMware等),创建虚拟机(虚拟出各种硬件),在虚拟机上安装从操作系统,在从操作系统中安装部署各种应用。基于内核的隔离
- 缺点:资源占用多、冗余步骤多、启动慢
Linux容器(Linux Container,简称LXC):
- Linux容器是与系统其他部分分隔开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
- Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一的运行。
3.Docker运行速度快的原因
Docker有比虚拟机更少的抽象层:
- 由于Docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上docker有明显优势。
Docker利用的是宿主机的内核,而不需要加载操作系统OS内核:
- 当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较耗时耗资源的过程。当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
- Docker容器的本质就是一个进程。
4.Docker基本组成三要素
Docker并非一个通用的容器工具,它依赖于已经存在并运行的Linux内核环境。(在Windows上安装Docker时需要依赖WLS,也即Windows下的Linux子系统)。
Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。
Docker的基本组成部分:
- 镜像(image)
- 容器(container)
- 仓库(repository)
Docker镜像:
- Docker镜像就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建多个容器。
-
- 相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。
- 相当于"源代码",docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
Docker容器:
- 从面向对象角度
- Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
- 从镜像容器角度
- 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
Docker仓库
- Docker仓库是集中存放镜像文件的场所。
- 仓库分为公开仓库和私有仓库两种。
- 最大的公开仓库是Docker官方的Docker Hub:https://hub.docker.com/
5.Docker 平台架构
入门版
Docker是一个 C/S(Client-Server) 结构的系统,后端是一个松耦合架构,众多模块各司其职。
Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从容器接收命令并管理运行在主机上的容器。
Docker Daemon (`dockerd`) 是 Docker 的后台服务进程,负责管理 Docker 容器、镜像、网络和存储卷等资源。它在后台运行,等待 Docker 客户端(`docker` 命令)发送请求,并根据这些请求执行相应的操作,例如启动或停止容器、构建镜像等。Docker Daemon 还处理与底层操作系统的交互,通过调用 Linux 内核的功能(如 cgroups 和 namespaces)来实现容器的隔离和资源管理。
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说到的集装箱。可以对比mysql演示对比讲解
架构版
Docker运行的基本流程为:
- 用户是使用Docker Client 与 Docker Daemon 建立通信,并发送请求给后者
- Docker Daemon 作为 Docker 架构的主体部分,首先提供 Docker Server 的功能使其可以接收 Docker Client 的请求
- Docker Engine (docker 引擎)执行 Docker 内部的一系列工作,每一项工作都是以一个 Job(作业) 的形式存在
- Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph Driver 将下载镜像以 Graph 的形式存储
- 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境
- 当需要限制 Docker 容器运行资源或执行用户指令等操作时,则通过 Exec driver 来完成
- Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过 Libcontainer 来实现具体对容器进行的操作
Graph Driver
- Graph Driver 是 Docker 中负责管理和存储容器镜像和层的组件。它定义了如何在文件系统中存储和访问这些镜像和层。常见的 Graph Driver 包括 `overlay2`、`aufs`、`btrfs`、`devicemapper` 和 `zfs`。这些驱动程序通过不同的文件系统和存储技术,实现了对镜像层的高效管理和操作。
Graph
- Graph 在 Docker 中指的是容器镜像的层次结构(Layer)。每个镜像由多个只读层(Layer)组成,每一层都基于前一层进行构建,最终形成一个有向无环图(DAG, Directed Acyclic Graph)。这种结构可以有效地共享和复用镜像层,减少存储空间和网络传输的开销。
Docker 使用 Graph Driver 将下载的镜像按层次结构存储,每个镜像由多个层组成,这些层之间形成有向无环图,以实现高效的存储和访问。
Libcontainer 是 Docker 中的一个库,用于直接与容器的底层 Linux 内核功能进行交互。它提供了一套 API,使得 Docker 可以使用 Linux 的 cgroups、namespaces 和其他内核特性来创建和管理容器。Libcontainer 使 Docker 不再依赖于其他外部工具(如 LXC)来实现容器化,而是可以直接通过自己的实现来管理容器的生命周期和资源隔离。这样增强了 Docker 的灵活性和可控性。