目录
引言
一、容器技术产生的背景
二、虚拟化
1.什么是虚拟化
2.虚拟化的作用
3.CPU的时间分片(CPU虚拟化)
4.cpu虚拟化性能瓶颈
5.虚拟化工作原理
6.虚拟化类型
7.虚拟化的优缺点
三、Docker
1.什么是docker
2. 使用docker的意义
3.docker的使用场景
4. Docker引擎(Docker Engine)
5.docker三要素
6.docker与虚拟化的区别
7.六大名称空间
8.资源控制cgroups
9.容器特性
10.容器小的架构体系
11. Docker体系架构
四、总结
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主操作系统中,极大减小了开销。
docker引擎对内核版本是有要求的(至少是3.8+)
docker需要cgroups(Linux内核态中资源管理的模块)的资源管理功能
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间运行而互不影响,从而提高计算机的工作效率。
- 在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(ngint tomcat),从而实现一台宿主机搭建一个集群(从整体)
- 通过软件/应用程序的方式,来实现物理硬件的功能(ensp),以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)
将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率。
- 正常每个任务以轮询的方式去处理,这个时候一个CPU一个整体。
- 上图是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。
- cpu 1s全力运转的性能——》逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。
虚拟化作用:缓解/解决了资源利用率的问题
cpu分片后每个任务处理性能效率会打折
如果是50m及50m以下的任务,进行虚拟化后,1s模拟10个cpu可以处理10个。虚拟化后的性能更高。
如果是50+m的任务,物理硬件的性能比虚拟化的性能高,因为虚拟化的cpu会发生卡顿。所以在极度吃资源的情况下,例如MySQL高并发这类,就不适合用虚拟化。
两大核心组件:QEMU、KVM
QEMU
- 可以理解为队列,核心目的是**调用资源内核中的资源**,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
- QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
KVM
- 用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
- 只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。
对于workstation而言——>硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
全虚拟化:
半虚拟化:
直通:直接使用物理硬件资源
虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
优点
- 集中化管理(远程管理、维护)
- 提高硬件利用率(物理资源利用率低-例如峰值,虚拟化解决了"空闲"容量)
- 动态调整机器/资源配置(虚拟化把系统的应用程序和服务硬件分离、提高了灵活性)
- 高可靠(可部署额外的功能和方案,可提高透明负载均衡、迁移、恢复复制等应用环境)
缺点
- 前期高额费用(初期的硬件支持)
- 降低硬件利用率(特定场景-例如极度吃资源的应用不一定适合虚拟化)
- 更大的错误影响面(本地物理机down机会导致虚拟机均不可用,同时可能虚拟机中文件全部损坏)
- 实施配置复杂、管理复杂((管理人员运维、排障困难)
- 一定的限制性(虚拟化技术涉及各种限制,必须与支持/兼容虚拟化的服务器、应用程序及供应商结合使用)
- 安全性(虚拟化技术自身的安全隐患)
是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台。
在Linux容器里运行应用的开源工具——》容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
沙箱(Sandbox):在计算机安全领域,沙箱是一种程序的隔离运行机制
Docker在2013年一炮而红,直到现在,已经成为容器技术的代名词。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到“build once, run anywhere即构建一次能在所有地方运行”,可以将同一个构建版本用于开发、测试、预发布、生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上还进一步发展出了CaaS(容器即服务)技术。
把容器化技术做成了标准化平台
- docker引擎统一了基础设施环境——docker环境
- docker引擎统一了程序打包(集装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
- docker引擎统一了程序部署(运行)方式——docke容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——》封装的一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态 - 运行时)
CI/CD流程:war jar —》github gitlab 私有仓库(代码仓库)—》
jenkins(测试(应用程序封装/构建镜像)—》运维下载,使用容器技术进行运行/发布
Docker Engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序:
server端:服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
client端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
命令行界面(cLI)客户端((docker命令)
docker run
docker start
docker rm
Docker images:镜像:统一的封装方式——》模板
Docker container:容器:统一的运行时环境 ——》基于镜像,运行状态/运行时状态
Docker registry:镜像仓库:放置镜像的仓库——》存放镜像模板
存储镜像的地方,默认在公共的 Docker Hub上查找,可以搞个人仓库。
docker自己提供了,hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库。设置镜像仓库时可以改为阿里镜像或者其他的国内镜像,docker官网在海外,国内访问很多时候会报超时
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
仓库大类:公共仓库----->docker hub; 私有仓库registry harbor
客户端发起各种各样的命令,给与主机
主机会调用镜像,如果有镜像直接用,运行为容器
如果镜像里没有会到registry公共仓库去拉去镜像,拉到本地后再运行为容器
特性 |
Docker容器(一个进程控制) |
虚拟机虚拟化(完整的操作系统) |
启动速度 |
秒级 |
分钟级 |
运行性能 |
接近原生(直接在内核中运行)10%-20%左右的损失 |
50%左右损失(全虚拟化类型) |
磁盘占用 |
50-100MB |
3-5G |
数量 |
成百上千,每个进程可控制一个容器 |
几十个 |
隔离性 |
进程级别 |
操作系统(更彻底,安全级别高) |
操作系统 |
主要支持Linux |
几乎所有 |
封装程度 |
只封装目标代码和依赖关系,共享宿主机内核 |
完整的操作系统,与宿主机隔离 |
容器是依赖于内核来隔离,彼此的关系像共享一样,所以安全性较之虚拟机差一些,毕竟不是完全隔离。所以若一个容器被黑客攻破,宿主机基本也就没了。
这里也不是完全没有办法,那就是 cgroup 资源分配,其能提供一定的安全机制。
docker把容器化技术做成了标准化平台,只要安装了docker引擎,就能使用docker。
使用docker有什么意义(实现了3个统一)
docker引擎统一了基础设施环境-docker环境——>image——>封装一一个简易的操作系统(3.0+G)
docker引擎统一了 程序打包(装箱/封装-类比于集装箱)方式-docker镜像——>images
docker引擎统—了程序部署(运行)方式-docker容器——>基于镜像——>运行为容器(可运行的环境)
实现了一次构建,多次、多处使用。
namespace 资源隔离——用容器技术封装
mount | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
user | 操作进程的用户和用户组 |
pid | 进程编号 |
uts | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
net(网络资源) | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
六种名称空间是由cgroups管理的
最后一种centos的cgroups管理版本是3.8版本,3.6和3.5用不了
cgroups 管理linux内核态中资源管理的模块
cgroups 管理一些系统资源
不是docker原生的
特性——>性能损耗10-20%
灵活:即使是最复杂的应用也可以集装箱化。
轻量级:容器利用并共享主机内核。
可互换:可以即时部署更新和升级。
便携式:可以在本地构建,部署到云,并在任何地方运行。
可扩展:可以增加并自动分发容器副本。
可堆叠:可以垂直和即时堆叠服务。
Docker客户端 - Docker
docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。
Docker服务端-Docker Daemon资源限制
docker服务端是一个服务进程,管理着所有的容器。
Docker镜像一Imagefont>
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码。运行时间,库,环境变量,和配置文件
Docker容器-Docker Container
Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。所创建的每一个容器都是相互隔离、互不可见,以保证平台的安全性。
Docker镜像仓库-- Registryfont>
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private、常用)。当下次要在另外一台机器上使用这个镜像时,只需从仓库获取。
Docker的镜像、容器、日志等内容全部都默认存储在**/var/lib/docker**目录下。