文章目录
- 概念铺垫(1)
- 概念铺垫(2)
- 概念铺垫 (3)
- 概念铺垫(4)
- Docker 定义
- Docker 特点
- Docker 架构
概念铺垫(1)
虚拟化相关概念
物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。docker 是现今容器技术的事实标准。
(对【他们使用的服务器程序,看起来就像是自己专用的】这句话的理解: 每个实例运行的进程只看到自己所占的硬件资源,其他的硬件资源不可见,也不可用,每个实例都被相互隔离了。
概念铺垫(2)
虚拟化常见分类
①虚拟机:
存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口,将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。比如,在一台 Windows 系统的电脑上使用 Android 虚拟机,就能够用这台电脑打开 Android 系统上的应用。
②容器,存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口,将函数库层以上的功能置于操作系统上。Docker就是通过容器实现的虚拟化。 Docker是一个基于Linux 操作系统的Namespace 和Cgroup 功能实现的隔离容器,可以模拟操作系统的功能。虚拟机是把整个操作系统封装隔离,容器则是把一个个应用单独封装隔离。所以容器体积比虚拟机小。容器共享一个内核(操作系统),(内核)它安装在硬件上。
③类JVM: 存在于函数库层和应用程序之间的虚拟化技术 。
概念铺垫 (3)
容器化的优势
(部分看不懂,直接跳过,使用以后就明白了)
① 资源利用率高 : 对硬件资源更充分的利用。(简单理解为:A进程和B进程都不会使服务器硬件资源满载,但A和B进程无法在同一种操作系统上运行,容器化解决了这样一个问题,使A和B能在同一服务器上运行,这样就不用开两台服务器分别给A和B,提高了资源利用率)
② 使环境标准化 : 一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
③资源弹性伸缩: 根据业务情况,动态调整计算、存储、网络等硬件及软件资源。(例如高峰期启动更多的服务器)
④差异环境提供: 同时提供多套差异化的执行环境,限制环境使用资源。比如一个服务依赖 Ubuntu 操作系统,另一个服务依赖CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。
⑤实现沙箱安全:为避免不安全或不稳定软件对系统安全性、稳定性造成影响,可使用虚拟化技术构建虚拟执行环境。例如,在容器里面执行 rm -rf /* 不会把整个服务器搞死,也不影响其他人部署的程序使用。
⑥比虚拟机轻量:传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。docker 不需要虚拟内核,所以启动可以更快,相当于 windows 的开机时间省去了。
⑦维护和扩展容易:使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。比如 docker hub 提供了很多镜像,各个系统的一个命令就可以拿到了,研发也可以自己定制镜像分享给各个产品
概念铺垫(4)
容器虚拟化实现
①namespace:namespace 是Linux 内核用来隔离内核资源的方式。通过namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个namespace 中。
namespace使用:Linux 提供了多个API 用来操作namespace,它们是clone()、setns() 和unshare() 函数,为了确定隔离的到底是哪项namespace,在使用这些API 时,通常需要指定一些调用参数:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和CLONE_NEWCGROUP。如果要同时隔离多个namespace,可以使用| (按位或)组合这些参数。
(仅作了解,总而言之这些接口可以帮助隔离网络、进程ID等操作系统资源)
/*
clone() 函数是用于创建新进程的系统调用之一,
它允许你指定要复制的命名空间类型。
例如,如果你想要创建一个新的网络命名空间,你可以这样使用 clone():*/
clone(CLONE_NEWNET | CLONE_NEWPID | CLONE_NEWUTS, NULL);
/*
setns() 函数允许一个进程加入到一个已存在的命名空间中
fd 是一个指向已存在命名空间的文件描述符。
通过调用 setns(),你可以将当前进程加入到该命名空间中,
从而让其与该命名空间中的其他进程进行通信和协作*/
setns(fd, CLONE_NEWNET);
/*
unshare() 函数允许一个进程脱离当前的命名空间,
创建一个新的独立命名空间。
*/
unshare(CLONE_NEWNET | CLONE_NEWPID);
②cgroups:cgroups(Control Groups) 是linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
cgroups的作用具体包括
1.Resource limitation: 限制资源使用,内存使用上限/cpu的使用限制
2.Prioritization: 优先级控制,例:CPU利用/磁盘IO吞吐
3.Accounting: 一些审计或一些统计
4.Control: 挂起进程/恢复执行进程
cgroups的使用(仅作了解,知道cgroups可以用于限制、分配和监控系统资源(如 CPU、内存、磁盘 I/O 等)的使用即可):
# 创建 cgroup
sudo mkdir /sys/fs/cgroup/cpu/mygrou
# 创建 cgroup cgroup v2
sudo mkdir /sys/fs/cgroup/unified/mygroup
# 要将一个进程分配到特定的 cgroup 中,12345为PID
echo 12345 > /sys/fs/cgroup/cpu/mygroup/cgroup.procs
# 限制 cgroup 中的进程使用的 CPU 时间,这里50000代表50ms
echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
# 通过查看 cgroup 文件系统中的各种文件,实时监控 cgroup 中进程的资源使用情况
cat /sys/fs/cgroup/memory/mygroup/memory.usage_in_bytes
③LXC,或者 Linux 容器,是一种操作系统级虚拟化技术,允许多个独立的 Linux 系统容器(container)在单个 Linux 主机上共享相同的内核。这种技术提供了比传统的虚拟机更轻量级的虚拟化解决方案,能够更高效地利用硬件资源。 LXC 使用 cgroups 控制组和 namespaces 命名空间来实现容器之间的隔离,使得每个容器都能够拥有自己的文件系统、网络、进程等资源。
Docker 定义
①Docker本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容器是linux内核中的技术,Docker只是把这种技术在使用上简易普及了。Docker在早期的版本其核心就是LXC的二次封装发行版。Docker作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。
② Docker 是一个开源的平台,用于开发、交付和运行应用程序。它利用容器化技术,将应用程序及其依赖项打包到一个称为容器的独立单元中。这使得应用程序能够在任何环境中快速部署和运行,无需担心环境差异或依赖问题。 Docker 提供了一种轻量级、可移植和自包含的解决方案,使开发人员能够更加高效地构建、交付和管理应用程序。
Docker 特点
Docker的特点和容器化的特点基本一致,大致如下:
docker有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利用率上docker将会在效率上有明显的优势。docker利用的是宿主机的内核,而不需要Guest OS,节省了Guest OS占用的资源。
docker不需要Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个docker容器只需要几秒钟。
Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。了解Docker 架构是使用Docker的前提。
例如国内企业的架构:
Docker 仓库(Registry)
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub 供了庞大的镜像集合供使用。
Docker daemon
Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护进程。
Docker 客户端(Client)
Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
Docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器(Container)
容器是独立运行的一个或一组应用。