目录
三,Docker的引擎(Docker architeture)
引言
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如:
- pid=2——python
- pid=3——jave
- pid=4——php
三个服务可能会互相影响
使用者期望将这三个不同的服务,跑在不同的运行环境中实现相互不影响,同时不会增加服务器成本
- 延伸出——能否将这三种服务分别封装起来——KVM虚拟化技术,实现了一个操作系统模拟多个操作系统/不同的运行时环境
- 随着技术发展——虚拟化技术开销较大(例如:只要运行一个py脚本,想要实现虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)
衍生出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine来替代(来bin操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销。
一,虚拟化简介
通过虚拟化技术将一台计算机虚拟成多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,同时每个逻辑计算机可运行不同的操作系统,应用程序都可以在相互独立的空间内运行而互不影响,从而提高了计算机的工作效率。
- 在一个操作系统中(win10)模拟多个操作系统(centos,win10,suse),同时每个操作系统可以跑不同的服务(nginx+tomcat),从而实现一台宿主机搭建一个集群(从整体)。
- 通过软件/应用程序的方式,来实现物理硬件的功能。例如ensp,以软件形式实现物理设备的功能(二层交换机,路由器,三层交换机)。
1,虚拟化概述
虚拟化:将应用程序和系统内核资源进行解耦,以操作系统级别进行隔离,目的是提高资源利用率
2,耦合和解耦合
耦合性是程序结构中各个模块之间互相关联的度量。它取决于各个模块之间的接口的复杂程度,调用模块的方式以及哪些信息通过接口。
2.1 耦合
- 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用彼此影响以至联合起来的现象。
- 对象之间的耦合度就是对象之间的依赖性
- 对象之间的耦合度越高,维护成本越高
2.2 解耦合
1,字面以上就是解除耦合关系
2,在软件工程中,降低耦合度即可以理解为解耦,模块键有依赖关系必然存在耦合理论上的绝对零耦合是做不到的,但可以通过一些现有的方法将耦合度降至最低。
设计的核心思想:尽可能的减少代码耦合,如果发现代码耦合,就才去解耦技术,让数据模型,业务逻辑和视图显示三层之间彼此降低耦合,把关联依赖降至最低,而不至于牵一发而动全身,原则就是A功能的代码不要写在B的功能代码中,如果两者之间需要交互,可以通过接口,通过消息,甚至可以引入框架,但总之就是不要直接交叉写
3,虚拟化的作用
缓解/解决了资源利用率的问题
**注:**物理硬件的性能就会比虚拟化的性能高,在极度吃资源的情况下,例如mysql高并发这种,就不适合用虚拟化。
4,虚拟化工作原理
虚拟机管理器功能:调用资源
两大核心组件:QEMU,KVM
4.1 QEMU
- QEMU是i/o控制的模块,可以理解为队列,核心目的是调用系统内核中的资源,需要把KVM逻辑分割出来给资源运输给QEMU,再给虚拟机。
- QEMU它并不是直接调用,而是用I/O方式调用,QEMU把资源调用来的过程借用ioctl,QEMU借助libvirt这个工具调用ioctl,再通过接口,给虚拟机应用程序。
4.2 KVM
1,用来逻辑分割物理资源,抽象化为虚拟化资源,根据KVM里的配置,会逻辑分割出多少G,给应用程序,去进行虚拟化。
2,只介绍来着QEMU的请求指令,对于应用程序直接过来的敏感指令进行拦截,然后通过接口发给QEMU,让QEMU判断是否需要执行,可以的话,再下来,不可以的话,不执行该敏感指令。
对于workstation而言,——硬件辅助虚拟化,表达形式在处理器里面有一个虚拟化引擎,可以勾取硬件辅助虚拟化,看到虚拟接口/dev/kvm,可以加强辅助调用,在应用程序需要频繁调用的时候,需要开启,比如openstack.
4.3 虚拟化类型
1,全虚拟化:将物理硬件资源全部通过软件的方式进行抽象化,最后进行调用
2,半虚拟化:需要修改操作系统
3,直通:直接使用物理硬件资源
全虚拟化:kvm——产品vmware-ce
把虚拟号:EXSI——workststion vsphere
4.4 虚拟化功能
- 在一个操作系统内,模拟多个操作系统
- 以软件的方式模拟物理设备的功能
二。Docker概述
1,IT架构演变
云计算涌现出很多改变传统IT架构和运维方向的新技术,比如虚拟机,容器,微服务,serverless,无论这些技术应用在那些场景,降低成本,提供效率是云服务永恒的主题。
1,Bare Metal(裸金属):运行物理机,也称为裸金属,
2,Virual machines(虚拟机):可以在一台物理机上创建多个虚拟机,并把物理配置分发成为多个虚拟配置
缺点:性能损耗大,大约损耗50
虚拟机常用软件:VMware workstation(windows,vm sphere+ESXI(Windows server)),KVM(linux内核))
3,Containers(容器):容器内部自身有一个小型1操作系统
常用软件:docker,podman,rocket,container
4,functions函数(函数化,代码化)
2,Docker 是什么
- Docker 是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源
- Docker 是在linux 容器里运行应用的开源工具,是一种轻量级的“虚拟机”
- Docker的容器技术可以在一台主机上轻松为如何应用创建一个轻量级的,可移植的,自给自足的容器。
Docker 的Logo设计为蓝色鲸鱼,拖着许多集装箱,鲸鱼可以看作为宿主机,集装箱可以理解为相互隔离的容器,每个集装箱都包含自己的应用程序。
3,Docker的设计宗旨
Build,Ship and Run Any App,Anywhere,即通过对应用组件的封装,发布,部署,运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系统。
4,Docker特点
容器化越来越受欢迎,因为容器是:
- 灵活:即使是最复杂的应用也可以集装箱化。
- 轻量级:容器利用并共享主机内核
- 可互换: 可以即使部署更新和升级。
- 便携式:可以在本地构建,部署到云,并在任何地方运行。
- 可扩展:可以增加并自动分发容器副本。
- 可堆叠:可以垂直和即使堆叠服务。
容器是在linux上本机运行,并与其他容器共享主机的内核,他运行的是一个独立的进程,不占用其他任何可执行文件的内存,非常全量。
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
Docker从一开始就以提供标准化的运行时环境为目标,真正做到"Build,Ship and Run any APP,Angwhere",可以将同一个构建版本用于开发,测试,预发布,生产等任何环境,并且做到了与底层操作系统的解耦。在此基础上进一步发展出了Caas(容器即服务)技术。
5,Docker与KVM(虚拟机)的区别
5.1 隔离与共享
虚拟机通过添加Hypervisor层(虚拟化中间层),虚拟出网卡,内存,cpu等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的系统内核。而Docker容器则是通隔离(那么namesapce)的方式,将文件系统,进程,设备,网络等资源进行隔离,再对权限,CPU资源等进行控制(cgroup),最终让容器之间互不影响,容器无法影响宿主机。
容器与宿主机共享内核,文件系统,,硬件等资源。
5.2 性能与损耗
与虚拟机相比,容器资源损耗要少。
同样的宿主机下,能够建立容器的数量要比虚拟机多
但是,虚拟机的安全性要比容器稍好,要从虚拟机攻破到宿主机或其他虚拟机,需要先攻破Hypervisor层,这是及其困难的
而Dorker容器与宿主机共享内核,文件系统等资源,更有可能对其他容器,宿主机产生影响。
不同点 | Docker容器 | 虚拟机 |
启动速度 | 快,几秒钟 | 慢,几分钟 |
运行性能 | 接近原生(直接在内核中运行) | 运行于Hypervisor上,50%左右损失 |
磁盘占用 | 小,甚至几十KB(根据镜像层的情况) | 非常大,上GB |
并发性 | 一台宿主机可以启动成百上千个容器 | 最多几十个虚拟机 |
隔离性 | 进程级别 | 资源隔离/限制 |
操作系统 | 主要支持Linux | 主要支持Linux |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
5.3 docker在内核中支持2种重要技术
docker 本质就是宿主机的一个进程,docker 通过namespace 实现资源隔离,通过==cgroups==实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似于虚拟机的磁盘。比如分配500G,并不是实际占用物理磁盘500g,二是随着使用扩展)
6,Docker有哪些优势?和虚拟化比有什么优势?
把容器化技术做成了标准化平台
- docker引擎同一了基础设施环境——docker容器环境(引擎)
- docker引擎统一了程序打包(装箱)方式——docker镜像(把引擎放在镜像中,带着镜像到处跑)
- docker引擎统一了程序部署(运行)方式——docker容器(利用引擎把这个镜像再去运行为之前的相同的一模一样的容器了)
镜像——》封装的一个时刻的服务/应用状态
容器——》应用跑起来的状态(正常提供服务的状态-运行时)
实现了一次构建,多次,多次使用。
三,Docker的使用场景
1,打包应用程序部署简单
2,可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦)
例如:需要把服务器从腾讯云迁移到阿里云,如果采用的是Docker容器技术,整体迁移的过程只需要在新的服务器上启动我们需要的容器就可以了。
3,适合做微服务的部署
4,适合持续集成的持续交付(CI/CD):开发到测试发布
5,部署微服务
提供PASS产品(平台即服务)
三,Docker的引擎(Docker architeture)
Docker engine是具有以下主要组件的客户端-服务器(C/S架构)应用程序
1,slave段:服务端是一种长期运行的程序,称为守护程序进程(docker命令)
2,client段:REST API,他指定程序可以用来与守护进程进行通信并指示其操作的接口。
3,命令行界面(cli)客户端(docker命令)。
docker run
docker start
docker rm
四,docker的架构
- 1,docker使用客户端-服务端(c/s)架构。Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
- 2,Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快。
- 3,Docker daemon:守护进程,
- 4,Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象。例如图像、容器、网络和卷,守护程序还可以与其他守护程序通信以管理Docker服务
1,简述docker体系架构
docker客户端-docker
docker客户端则扮演着docker服务端的运程控制器,可以用来控制docker的服务端进程。
docker服务端-docker daemon资源限制
docker服务端是一个服务进程,管理着所以的容器
docker镜像-lmagefont
docker的镜像是创建容器的基础,类似于虚拟机的快照,可以理解为一个面向docker容器引擎的只读
docker容器-docker container
docker的容器是从镜像创建的运行实例,他可以被启动,停止和删除,所创建的每一容器都是相互隔离,互不可见,以保证平台的安全性。
docker镜像仓库-registryfont
docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将他上传到公有仓库或者私有仓库,,当下次要在另外一台机器上使用这个镜像时,只需要仓库获取。
docker的镜像,容器,日志等内容全部都默认存储在/var/lib/docker目录下啊。
2,docker三要素(核心组件)
Docker images:镜像:统一的封装方式——模板
Docker container:容器:统一的运行时环境——基于镜像,运行状态/运行时的状态
Docker registry:镜像文件:放置镜像的仓库——存放镜像模板
存储镜像的地方,默认在公共的docker hub上查找,可以搞个人仓库。
仓库大类:公共仓库-docker hub 私有仓库registry harbor
3,docker运行流程
工作流程:
- 客户端发送各种各样的命令,给予主机
- 主机会调用镜像,如果有镜像直接用,运行为容器
- 如果镜像里没有会到registry公共仓库拉取镜像,拉倒本地后在运行为容器
4,linux的namespace(命名空间)
namespace | 系统调用参数 | 隔离内容 |
utc | CLONE_NEWUTS | 主机名和主机域 (同一个环境里不能又叫node1又叫node2) |
ipc | CLONE_NEWWIPS | 信号量、消息队列、共享内存(不同的应用调用内存资源的时候应该使用不同的内存空间) |
pid | CLONE_NEWPID | 进程编号 |
network | CLONE_NEWNET | 网络设备、网络协议栈(在同一个网络名称空间中的网络规则)、端口等 |
mount | CLONE_NEWNS | 文件系统,挂载点——>一个文件系统内,不能重复挂载一个指定目录 |
user | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
5,控制组-cgroups(control groups)
六种名称空间是由cgroups管理的
最后一种是centos的cgroups管理版本的是3,8版本,3.6和3.5用不了
- cgroups管理linux内核态中资源管理的模块
- cgroups管理一些系统资源
- 不是docker原生的。
五,总结
使用docker实现了3个统一
- docker引擎统一了基础设施环境-docker环境——image——封装——一个简易的操作系统
- docker引擎统一了程序打包(装箱/封装/类比于集装箱)方式-docker镜像——images
- docker引擎统一了程序部署运行方式-docker容器——基于镜像——运行环境为容器(可运行的环境)
实现了一次构建,多次,多处使用