背景:
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如: pid=2 --> python pid=3–>java pid4–>php ,三个服务可能会相互影响
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本
延伸出一-》能否将这三种服务分别封装起来一》KVM虛拟化技术,实现了一-个操作系统模拟多个操作系统/不同的运行时
环境
随着技术发展—》虚拟化技术开销较大( 例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)
延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine
来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销
1232
2464
docker与虚拟机区别之一( 资源利用率/损耗)
###那如何实现应用A和应用B隔离
应用和应用的隔离,如何进行判断
以操作系统维度
应用A.与应用B隔离,在操作系统中,是通过namespaces( 名称空间、命名空间)实现的,只要实现以下6个空间隔离,才能
认为两个应用实现了完全/完整隔离
一、名称空间
容器隔离了6个名称空间(namespace次元隔离-用容器化技术封装)* * * * *
mount 文件系统,挂载点 ——》一个文件系统内,不能重复挂在一个指定目录,例如: /mnt
user 操作进程的用户和用户组 .。。。。。。。。。。
pid 进程编号
uts 主机名和主机域
ipc 信号量、消息队列,共享内存 (理解,不同的应用调用内存资源的时候应该使用不同的内存空间)
net 网络设备、网络协议栈、端口等
-
cgroups 管理 3.8版本
-
cgroups linux 内核态中资源管理的模块
-
cgroups 管理一些系统资源
Namespaces
Docker使用-种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker 会为该容器创建- -组名称空间。这些名称空间提供了一-层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
Docker Engine在Linux.上使用以下名称空间:
该pid命名空间:进程隔离(PID:进程ID)
该net命令空间:管理网络接口(NET:网络)
该ipc命名空间:管理访问IPC资源(IPC: 进程间通信)
该mnt命名空间:管理文件系统挂载点(MNT:mount)
该uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)
docker 引擎 对内核版本是有要求的 (至少是3.8+)
docker 需要cgroups 的资源管理功能
最晚的一个名称空间是3.8
使用docker有什么意义?
ECS,属于IAAS、Docker(k8s) 属于PAAS
IASS : 基础设施服务
SAAS : 应用即服务
PAAS : 平台及服务
Docker images :镜像
Docker container:容器
Docker registry:镜像仓库
存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库
二、docker与虚拟化
2.1cgroups
Linux上的Docker引擎还依赖于另一种称为控制组( cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。
例如,您可以限制特定容器可用的内存。
2.2全虚拟、半虚拟、容器技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SS6HlBWQ-1641814563053)(C:\Users\赵金华\Desktop\整理复习\docker图片\1.png)]
2.3那如何区分虚拟机中的不同应用呢?
虚拟机一般不可能只跑一个应用,因为这样确实也太浪费资源了,我们可以想想,现在手上的电脑,可以用 Vmvare 导入几个虚拟机,所以诸如 Cloud Foundry通过引入操作系统的 Cgroups 和 Namespace 等机制,从而来为每个应用单独创建一个叫做「沙盒」的隔离环境,然后在这些「沙盒」中启动应用,通过这样的方法就让虚拟机中应用各自互不干扰,让其自由翱翔,至于 Cgroups 和 Namespace 的实现原理,后续我们再共同的探讨
这里所谓的隔离环境就是「容器」。
2.4微服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynGF9ZOG-1641814563054)(C:\Users\赵金华\Desktop\整理复习\docker图片\2.png)]
将40G的包拆分成4组10G的包来同时进行运作,化整为零就是微服务的概念,本来需要一台机器跑40G的包,但是微服务进行细小化,分成多个小块,同时进行处理,极大的加快了部署的速度。
在更新的时候包的时候一般需要全部更新,这样极度的消耗时间,而这个时候可以单独给单拆分的模块来进行镜像升级,一般只有10G左右,升级时间就减少了。
2.5企业中——开发运维整体流程
①首先由开发进行代码研发,研发好之后进行编译、打包
PS: 打包:一般会使用maven.工具打war包或者jar包.
②打完包之后,放置对应的运行时环境中,进行试运行
PS: 这里的运行时环境指:例如tomcat ( java环境) php (php环境)等1
③中间会加.上一些测试过程,测试代码的有效性、可用性和可执行性
④以上测试完成,运维会将这个软件包拉过来,运行在实际生产的运行时
环境中
问题:在以上的第o点中,不同开发语言的运行时环境混淆在一起运行会有很大的隐患,以及不便
传统中,所谓的运行时环境,例如tomcat (java环境) php ( php环境)等
容器中,所谓的运行时环境,指的试"容器”内部
在此之前,容器一》是一个运行时环境,构成容器的组件是image镜像(一个运行时环境的模板)
2.6docker数据流向图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5c6mNTg-1641814563055)(C:\Users\赵金华\Desktop\整理复习\docker图片\3.png)]
Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker images:镜像
Docker container:容器
Docker registry:镜像仓库65却55lo’iuu
2.7docker镜像流向
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e9idnL4L-1641814563055)(C:\Users\赵金华\Desktop\整理复习\docker图片\4.png)]
2.8Container和VM(虚拟机)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQJZNElH-1641814563056)(C:\Users\赵金华\Desktop\整理复习\docker图片\5.png)]
2.9docker和虚拟化比有什么优势
不同点 | container | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生(直接在内核中运行) | 50%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般十几台 |
隔离性 | 进程级别 | 系统级别(更彻底) |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享主机内核 | 完整的 |