【Docker】简介
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:Docker_秦jh_的博客-CSDN博客
目录
前言
💬 hello! 各位铁子们大家好哇。
今日更新了Docker相关内容
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
Docker 简介
什么是虚拟化、容器化
物理机:实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理 机提供给虚拟机以硬件环境,有时也称为“寄主”或“宿主”。
虚拟化:是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上 同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都 可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化(Operating system level virtualization),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例 (instances)被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运 行。这个软件实例,也被称为是一个容器(containers)。对每个实例的拥有者与用户 来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。 docker 是现今容器技术的事实标准。
案例
举个生活中的例子。 物理机如下,就像一个庄园,独立占用了一块土地,花园都是自己的,其他人无法共 享使用。
虚拟机相当于开发商的一个楼盘,一栋楼一套房子一户人家,共享一块宅基地,共享 小区的花园,共享小区的游乐设施。
容器相当于在1个房子里面,开辟出来一个又一个的胶囊公寓,共享这套房子的卫生 间、共享厨房、共享WiFi,只有衣服、电脑等私人物品是你自己的。
虚拟化实现方式
应用程序执行环境分层

硬件层:提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
操作系统层 :提供系统调用接口,管理硬件资源
程序库层:提供数据结构定义及函数调用接口
虚拟化常见类别
虚拟机
存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过“伪造”一个硬件抽象接口, 将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样 的功能。比如我们在一台 Windows 系统的电脑上使用 Android 虚拟机,就能够用这台 电脑打开 Android 系统上的应用。
容器
存在于操作系统层和函数库层之间的虚拟化技术。容器通过“伪造”操作系统的接口, 将函数库层以上的功能置于操作系统上。以 Docker 为例,其就是一个基于 Linux 操作 系统的 Namespace 和 Cgroup 功能实现的隔离容器,可以模拟操作系统的功能。简单 来说,如果虚拟机是把整个操作系统封装隔离,从而实现跨平台应用的话,那么容器 则是把一个个应用单独封装隔离,从而实现跨平台应用。所以容器体积比虚拟机小很多,理论上占用资源更少。容器化就是应用程序级别的虚拟化技术。容器提供了将应 用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。容 器共享一个内核(操作系统),它安装在硬件上。
JVM之类的虚拟机
存在于函数库层和应用程序之间的虚拟化技术。Java 虚拟机同样具有跨平台特性,所 谓跨平台特性实际上也就是虚拟化的功劳。我们知道 Java 语言是调用操作系统函数库 的,JVM 就是在应用层与函数库层之间建立一个抽象层,对下通过不同的版本适应不 同的操作系统函数库,对上提供统一的运行环境交给程序和开发者,使开发者能够调 用不同操作系统的函数库。
常见虚拟化实现
主机虚拟化(虚拟机)实现
主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可 以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之 上,将虚拟化划分为Type1和Type2.
Type1类的Hypervisor(Hypervisor 是一种系统软件,它充当计算机硬件和虚拟机之间 的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主 机上单独工作,因此,Hypervisor也称为虚拟机管理器。)直接运行在硬件之上,没有 宿主机操作系统,Hypervisor直接控制硬件资源和客户机。典型框架为Xen、Vmware ESX。

Type2类的Hypervisor运行在一个宿主机操作系统之上(Vmware Workstation)或者 系统里面,Hypervisor作为宿主机操作系统中的一个应用程序,客户机就是在宿主机操 作系统上的一个进程。
容器虚拟化实现
容器虚拟化实现原理
容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过namespace进行各程 序的隔离,加上cgroups进行资源的控制,以此来进行虚拟化。
容器虚拟化基础之NameSpace
什么是Namespace(命名空间)
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进 程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的 资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程 的相关资源指定在同一个 namespace 中。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的 进程拥有独立的全局系统资源,改变一个 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,可以使用 | (按位或)组合 这些参数。
举个例子
三年一班的小明和三年二班的小明,虽说他们名字是一样的,但是所在班级不一样, 那么,在全年级排行榜上面,即使出现两个名字一样的小明,也会通过各自的学号来 区分。对于学校来说,每个班级就相当于是一个命名空间,这个空间的名称是班级号。 班级号用于描述逻辑上的学生分组信息,至于什么学生分配到1班,什么学生分配到 2班,那就由学校层面来统一调度。

以上命名空间在容器环境下的隔离效果:
UTS:每个容器能看到自己的hostname,拥有独立的主机名和域名。
IPC:同一个IPC namespace的进程之间能互相通讯,不同的IPC namespace之间 不能通信。
PID:每个PID namespace中的进程可以有其独立的PID,每个容器可以有其PID为 1的root进程。
Network:每个容器用有其独立的网络设备,IP地址,IP路由表,/proc/net目录,端 口号。
Mount:每个容器能看到不同的文件系统层次结构。 User:每个container可以有不同的user和group id。
想想以下如果我们要隔离两个进程需要怎么办?
- 首先容器进程与进程之间需要隔离,所以需要PID隔离
- 首先容器A进程不能读取容器B进程通讯内容需要隔离信号量等,所以需要IPC 隔离
- 首先容器A进程不能读取容器B进程的文件,所以需要Mount隔离
- 首先容器A进程不能读取容器B进程的socket,所以需要网络隔离、主机隔离
- Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限, 这就容易让容器突破资源限制。需要借助用户空间来完成用户之间的隔离。
空间隔离
参考《空间隔离》文章
容器虚拟化基础之cgroups
什么是cgroups
cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一 系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源 管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资 源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时 对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
为什么使用cgroups
其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器Docker 及k8s中的pod就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部 分的资源控制。
比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使 用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算 模块。
cgroups 的用途
Resource limitation: 限制资源使用,例:内存使用上限/cpu的使用限制
Prioritization: 优先级控制,例:CPU利用/磁盘IO吞吐
Accounting: 一些审计或一些统计
Control: 挂起进程/恢复执行进程
cgroups 可以控制的子系统

资源控制
参考《资源控制》文章
容器虚拟化基础之LXC
LXC是什么?
LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容 器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container), 内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和 共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境, 使得Linux用户可以容易的创建和管理系统或应用容器。
LXC是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了 容器技术使用的一个方案
LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术, 其复杂程度其实并没有多大降低,因为我们必须要学会LXC的一组命令工具,且由于 内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性 也没有虚拟机那么强大。
后来就出现了docker,所以从一定程度上来说,docker就是LXC的增强版。

LXC容器化
参考《LXC容器化》文章
Docker 是什么
Docker 本质
Docker 本质其实是LXC之类的增强版,它本身不是容器,而是容器的易用工具。容 器是linux内核中的技术,Docker只是把这种技术在使用上简易普及了。Docker在早 期的版本其核心就是LXC的二次封装发行版。
Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。 Docker 是基于Go语言实现的一个开源项目,它的主要目标是“Build,Ship and Run Any APP,Anywhere”,即通过对组件的封装、分发、部署、运行等生命周期的 管理,使得用户的应用及其运行环境能够做到“一次封装,到处运行”。
早期Docker利用LXC做容器管理引擎,但是在创建容器时,不再使用模板去安装生 成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好, 并整体打包成一个文件,image文件),镜像文件集中放在一个仓库中。当需要创建容 器时,Docker调用LXC的工具lxc-create,但不再通过lxc的模板去安装,而是连接 到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以,Docker极大的 简化了容器的使用难度。以后我们创建启动容器,只需要一个命令,docker-run, docker-stop 就可以启动停止一个容器了。
Docker 的引擎迭代
Docker 早期是基于LXC容器管理引擎实现,当后来成熟之后,Docker自建了一个容 器引擎叫libcontainer,后来CNCF的介入,Docker又研发了一个工业化标准的容器 引擎runC,目前所使用的新版Docker,所使用的容器引擎就是RunC。
Docker 和虚拟机的区别

Docker 为什么比虚拟机资源利用率高,启动快

docker 有比虚拟机更少的抽象层。docker不需要Hypervisor实现硬件资源虚拟化,运 行在docker容器上的程序直接使用的是实际物理机的硬件资源。因此在cpu、内存利 用率上docker将会在效率上有明显的优势。docker利用的是宿主机的内核,而不需要 Guest OS,节省了Guest OS占用的资源。
docker 不需要Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作 系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个 虚拟机时,虚拟机软件需要加载Guest OS,返回新建过程是分钟级别的。而新建一个 docker 容器只需要几秒钟。
Docker 和JVM虚拟化的区别?

Docker 架构
官方架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建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)
容器是独立运行的一个或一组应用。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)