容器技术是云原生的核心技术之一,利用容器化技术,可以将微服务以及它所需要的配置、依赖关系、环境变了等都可以便捷地部署到新的服务器节点上,而不用再次重新配置,这就使得微服务具备了强大的可移植性。
一、Docker 概述
Docker 仅是容器化技术,它不等于容器。容器的概念是 1979 年提出的 Unix chroot(实现进程间隔离),而 Docker 是 2013 年发布第一个版本。容器和虚拟机是类似的,容器技术本质上是一种资源隔离的虚拟化技术。
容器 = cgroups(资源控制)+ namaspace(访问隔离)+ rootfs(文件系统)+ engine(容器生命周期管理)
1、容器与虚拟机
维基百科:Virtualization
虚拟化是指创建某些资源的虚拟(而不是实际)版本的行为,包括虚拟计算机硬件平台、存储设备和计算机网络资源。虚拟化始于 20 世纪 60 年代,是一种将大型计算机提供的系统资源在不同应用程序之间进行逻辑划分的方法。
虚拟化技术可针对具体应用系统创建特定目的的虚拟环境,安全,效率高,快照、克隆、备份、迁移等非常方便。系统虚拟化是将一台物理计算机虚拟成一台或多台虚拟计算机系统,每个计算机系统都有自己的虚拟硬件,其上的操作系统认为自己运行在一台独立的主机上,计算机软件在一个虚拟平台上,而不是真实的硬件平台上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程,允许一个平台同时运行多个操作系统,并且应用程序可以在相互独立的空间内运行而互不影响。虚拟化技术在降低硬件成本的同时,还可以显著提高系统的工作效率和安全性。
容器和虚拟机都是虚拟化技术,其目标是为上层应用提供资源隔离的运行环境,但容器和虚拟机在实现技术上有着本质的区别。两者架构对比如下图所示:
(图片来自于网络)
容器是在 Linux 主机上本机运行的独立进程,与其他容器共享主机的内核,无须模拟操作系统指令,通过在操作系统层面进行虚拟化和进程资源隔离,容器可以在宿主机上轻松运行,几乎不占用额外的 CPU 和内存资源。典型的容器镜像大小通常在 MB 级别,可以在数秒内启动,提供了快速部署和轻量级的应用环境。
而虚拟机事需要运行完整的操作系统,并且每个虚拟机都有自己独立的操作系统内核,虚拟机通用软件模拟宿主机的操作系统指令,创建多个相对独立的操作系统实例,并在其上构建程序运行环境。因此虚拟机的隔离性更好,但相应地需要更多的资源,虚拟机的体积通常在 GB 级别,启动时间比较长,一般在数分钟以上。
容器相比虚拟机具有更快的启动时间和更轻量级的资源占用,适用于快速部署和轻量级应用场景。而虚拟机则提供了更好的隔离性,适用于需要更严格隔离和安全性的场景。
2、Docker 的发展史
Docker 的发展历程一般包括以下四个阶段:
起源阶段:2013 年前
Docker 的前身可以追溯到 Linux 容器技术的发展,该技术最早由 Linux 内核开发人员创建。2013 年,Docker 公司成立,由于 Docker 引入了易于使用的容器管理工具,使得容器技术开始受到广泛关注。
引爆点:2013 年-2014 年
Docker 在 2013 年推出首个公开测试版本,并在同年 3 月发布了第一个稳定版本。由于 Docker 的简单易用性和高效性,迅速引发了开发者和企业的关注。越来越多的公司开始使用 Docker 来构建、部署和管理应用程序。
生态系统的建立:2014 年-2016 年
在 Docker 的成功推动下,以 Docker 为核心的容器生态系统开始建立起来。越来越多的开源项目和商业产品围绕 Docker 进行开发和集成,如 Kubernetes、Docker Compose、Docker Swarm 等。这一时期,Docker 成为了容器技术的事实标准。
容器编排工具的崛起:2016 年后
随着容器技术的普及,容器编排工具成为了管理大规模容器集群的必备工具。Kubernetes 作为最流行的容器编排工具之一,在 2016 年后开始迅速崛起,并逐渐超越 Docker Swarm 成为容器集群管理的首选方案。此外,Docker 公司也将重心从容器编排转向了容器安全和开发者工具链等领域的发展。
Docker 的发展历程经历了从容器技术的开创阶段到容器生态系统的建立和壮大阶段,最终到容器编排工具的崛起阶段。作为容器技术的先驱和领导者之一,Docker 在推动整个容器生态系统的发展过程中发挥了重要作用。
3、Docker 的构成
(图片来自于网络)
上图是官方 Docker 引擎的组成架构,作为 Docker 的核心,采用 C/S 架构模式,包含三个组成部分:
服务器
这是 Docker 的守护进程,对应指令是:dockerd,用于创建管理 Docker 对象,包括容器、镜像、网络、卷等。
API
也称为描述性状态转移 API,提供用于与 Docker 守护进程进行通信并下达指令的接口。
客户端
指命令行界面,提供命令行接口,对应指令是:docker,通用 REST API 与守护进程进行通信并下达指令。
Docker 客户端和守护进程既可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程,CLI 使用 REST API 通过脚本或直接通过 CLI 命令来控制 Docker 守护进程或与之交互。守护进程创建并管理 Docker 对象,如镜像、容器、网络和数据卷。Docker 客户端通过守护进程操作 Docker 容器,而容器是通过镜像创建的,Docker 镜像保存在 Docker 仓库中,整个 Docker 架构如图所示:
(图片来自于网络)
从上图可以看出,在 Docker 宿主机上启动和运行 Docker 容器需要涉及三个关键组件:Docker 镜像、Docker 镜像仓库和 Docker 容器。
Docker 镜像(Image)
镜像是容器的基石,它类似于容器的源代码,包含了启动容器所需的所有条件,如应用代码、依赖库、环境变量和配置文件等。
Docker 镜像仓库(Registry)
Docker 镜像仓库用于存储用户创建的镜像,分为公共和私有两种类型。Docker 公司提供了 Docker Hub 作为官方的镜像仓库,用户可以在其中创建账户、分享和管理自己的镜像。此外,用户也可以搭建私有镜像仓库,用于内部部署和管理镜像。
Docker 容器(Container)
容器是 Docker 的运行实体,通过镜像启动。容器可以包含多个客户端进程,在容器内部运行。如果说镜像是 Docker 生命周期中构建和打包阶段的产物,那么容器则扮演了启动和执行阶段的角色。
4、Docker 的处理流程
(图片来自于网络)
如上图所示,启动一个 Docker 应用 app1 的流程说明如下:
- 通过 Docker 客户端向守护进程发送启动 app1 指令
- Docker 守护进程发请求给镜像仓库,检索 app1 的镜像
- 找到 app1 镜像,下载到服务器
- Docker 守护进程启动 app1 应用
- app1 应用是否启动成功的结果返回给 Docker 客户端
5、Docker 的优势
Docker 重新定义了应用程序的开发、测试和部署流程,将其打包成一个可移植的容器,核心理念是“一次构建,多次运行”。这一革命性的技术在开发和运维领域提供了持续集成和持续部署的服务。
标准化和版本控制
Docker 是软件工程领域的“标准化”交付组件,类似于货物运输中的集装箱。集装箱提供了一种通用的封装货物的标准,大大提高了物流效率。同样地,Docker 的标准化交付物称为“镜像”,包含了应用程序及其所依赖的运行环境,使应用交付变得简单和标准化。此外,Docker 容器还类似于 Git 仓库,允许将变更提交到镜像中,并通过版本管理进行管理,轻松实现应用程序的回滚和管理。
一次构建,多次交付
Docker 镜像实现了“一次构建,多次交付”的理念,类似于货物运输中的“一次装箱,多次运输”。这使得 Docker 镜像在应用程序多副本部署或应用程序迁移等方面展现出了巨大的价值。由于容器技术已经形成了事实标准,并且 Docker 提供了良好的可移植性,Docker 镜像能够轻松地在不同的云平台之间移植,而不需要做任何修改。
应用隔离
Docker 容器实现了应用程序之间的隔离,类似于货物运输中的货物隔离。与传统的虚拟机相比,Docker 容器的开销更小。每个容器都拥有自己的资源,并与其他容器隔离。这意味着可以在不同的容器中运行使用不同堆栈的应用程序,同时确保资源的分配和利用的合理性。此外,Docker 还能够确保应用程序的彻底清除,通过简单地删除容器即可完成,不会在宿主机操作系统上留下任何的临时文件或配置文件。
以上是 Docker 技术带来的革命性变革,它为软件开发、测试和部署提供了全新的方式,使得应用程序的交付变得更加简单、标准化和可靠。
6、Docker 的常用命令
关于 Docker 的常用命令,本文灸哥就不再一一赘述了,各位读者自行查阅学习,送上 Docker 官网的 Docker 命令关系图:
(图片来自于网络)