引言:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是一个用于开发,交付和运行的开放平台。Docker使您能够将应用程序与架构分开,从而可以快速交付软件。Docker是一个开源的应用引擎,让开发者可以打包大门的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或者Windows机器上,也可以实现虚拟化。
一、为什么会容器技术的出现
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务。
例如: pid=2 ——> python ,pid=3——>java ,pid4——>php,三个服务可能会相互影响。
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本
——> 延伸出——>能否将这三种服务分别封装起来——>KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境。
随着技术发展——>虚拟化技术开销较大(例如:只 要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)单单想要做个测试就要安装一个操作系统。
——>延伸出容器技术。
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。
docker引擎对内核版本是有要求的(至少是3.8+)。
docker 需要cgroups(Linux内核态中资源管理的模块) 的资源管理功能。
二、虚拟化概述
上文提到为了能够将三种服务分别封装起来出现KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境。那么什么是虚拟化呢?
2.1什么是虚拟化
通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间运行而互相不影响,从而提高计算机的工作效率
在一个操作系统中(win10)模拟多个操作系统(centos、win10、suse),同时每个操作系统可以跑不同的服务(ngint tomcat),从而实现一台宿主机搭建一个集群(从整体)
通过软件/应用程序的方式,来实现物理硬件的功能(ensp)
以软件形式实现物理设备的功能(二层交换机、路由器、三层交换机等)
2.2虚拟化的作用
将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
2.3cpu的时间分片(cpu虚拟化)
正常每个任务以轮询的方式去处理,这个时候一个CPU一个整体。
以下是针对的CPU单位时间内的一个资源。按时间划分,1秒划分成10个0.1秒,每个0.1秒可以全力处理10单位的任务。在1秒内,都在全力工作。
cpu 1s全力运转的性能——>逻辑分割成分成了10份,可以理解为在单位时间内可以处理10个任务,每一个0.1s cpu是满的。原先分片前100M以下的任务一次只可以处理1个,现在100M的任务一次可以处理10个。这就是时间分片的一个概念。
虚拟化作用——>缓解/解决了资源利用率的问题
2.4cpu虚拟化性能出现的问题
cpu分片后每个任务处理性能会打对折特别又虚拟化实际处理能力会变弱。
首先,虚拟化的用处是当任务是50以及小于50m时,本来1s可使用50m处理1个请求,如今可以将1s划分成10个0.1s每一个0.1s都拥有50m的处理能力。虚拟化后的,1s模拟10个cpu,可以处理10个。虚拟化后的性能更高。对于1s来说是并行,对于0.1s来说串行。
但是一旦请求的资源是大于50m时,物理硬件的性能就会比虚拟化的性能高了。虚拟化的cpu会卡顿。主要原因是资源不够。所以在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。这时可以使用物理硬件。
2.5虚拟化工作原理
将应用程序和系统资源进行解耦提高资源利用率
隔离性上:操作系统级别的隔离性如果某台虚拟机出现问题,可以迁移vm性能损耗50%
vmware workstation硬件辅助加速虚拟化将虚拟化的性能优化趋近于物理资源的性能
虚拟化三种模式:
1.全虚拟化(50%)
2.半虚拟化(软硬件结合)
3.直通(以全硬件的方式,实现虚拟化功能)
虚拟机管理器功能:调用资源
两大核心组件:QEMU、KVM
QEMU:
①可以理解为队列,核心目的是调用资源内核中的资源,需要把KVM逻辑分割出来的资源运输给QEMU,再给虚拟机。
②QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
KVM:
①用来逻辑分割物理资源,抽象化为虚拟化资源,根据VMM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
②只接受来自QEMU的请求指令。对于应用程序直接过来的敏感指令会拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,打回去,不执行该敏感指令。
对于workstation而言——>硬件辅助虚拟化,表现形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启。比如openstack。
2.5.1虚拟化类型
虚拟化类型
全虚拟化:将物理硬件资源全部通过软件的方式抽象化,最后进行调用
半虚拟化:需要修改操作系统
直通:直接使用物理硬件资源
全虚拟化:基于硬件为基础以软件的形式模拟硬件设备(在一定程度上解决了性能利用率的问题)
半虚拟化:趋近于物理设备的性能 (在提高利用率的同时,尽可能的提高性能)
全虚拟化:KVM——产品 vmware(资源损耗大)
半虚拟化:EXSI——产品 workstation vsphere
2.5.2虚拟化功能
①在一个操作系统内,模拟多个操作系统
② 以软件的方式模拟物理设备的功能
三、Docker容器概述
3.1为什么出现了Docker
环境配置的烦恼
软件开发最大的麻烦事之一,就是环境配置
相信每位编程初学者都会在环境配置上倒腾很久,而作为老师也会因为不同机器出现五花八门的环境配置问题而烦恼
想要软件正常运行,那么系统的设置和各种库、组件正确的安装才能如期运行
举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量
当你需要换机器的时候,你之前所配置的环境又要重头来一遍,非常麻烦
Docker 简介
Docker 是一个开源的应用容器引擎,基于 Go 语言
可以打包应用以及依赖包到一 个轻量级、可移植的容器中
Docker 打包好了的容器,可以发布到任何流行的 Linux 机器上,也可以实现虚拟化
容器是完全使用沙箱机制,相互之间不会有任何接口(独立)
容器性能开销极低
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器
Docker 是实现容器技术的一种工具
Docker 容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样
3.2 Docker是什么
是一种轻量级的“虚拟机”,Docker是一个用于开发,交付和运行应用程序的开放平台。
在Linux容器里运行应用的开源工具——>容器引擎,让开发者可以打包大门的应用及依赖包到一个可移植的镜像中,然后发布到任何流行的linux或者window机器中。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
鲸鱼可看作为宿主机,集装箱可理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。
Docker的设计宗旨:Build,Ship and Run Any App,Anywhere
即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
3.3 使用docker有什么意义
把容器化技术做成了标准化平台
docker引擎
docker引擎统一了基础设施环境——docker环境
docker引擎统一了程序打包(装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
docker引擎统一了程序部署(运行)方式——docke容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——》封装的一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态 - 运行时)
3.4docker的使用场景
打包应用程序部署简单
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是 Docker 容器技术,整个迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
适合做微服务的部署
适合持续集成和持续交付(CI/CD):开发到测试发布
提供PASS产品(平台即服务)
CI/CD流程:war jar —>github gitlab 私有仓库(代码仓库)—>
jenkins(测试(应用程序封装/构建镜像)—>运维下载,使用容器技术进行运行/发布