开发者学堂课程【4天 Docker 实战-1024程序员节创造营公益课:docker 原理及在运维工作的地位和作用 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/892/detail/14271
docker 原理及在运维工作的地位和作用
目录:
一、运维工作进化论测试环境和生产环境
二、运维生产环境的发展
三、Docker 概念
四、Docker 与容器区别
五、进程级封装概念
六、微服务生产环境
七、K8s- 容器编排管理功能及其作用
八、云原生技术栈的概念及技术
九、容器介绍
十、容器和虚拟化介绍和比较
十一、答疑环节
一、运维工作进化论
1. 测试环境
(1) 一套 LNMP 应用
LNMP 是一套技术的组合,L=Linux、N=Nginx、M=MySQL、P=PHP
Nginx 服务是不能处理动态请求
静态请求:请求静态文件或者 html 页面,服务器上存在的 html 文件(静态文件,指上传时什么样子,访问时还是什么样子)
动态请求:请求的是动态内容,带参数的请求。动态页面不存在于服务器上,它可能是取2数据库或者 redis 等地方取值拼凑成的页面。
当用户发起 http 请求,请求会被 Nginx 处理,如果是静态资源请求 Nginx 则直接返回,如果是动态请求,Nginx 则通过 fastcgi 协议转交给后端的 PHP 程序处理。
(2) 一台服务器。
(3)更新用 ftp 更新。
FTP 有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间,会非常长;并且不时的必须执行一些冗长的登录进程。
2. 解决的问题
(1) 上生产后有了一定程度的流量,需要运营和测试等部门给出数据,根据数据考虑冗余。
(2) 防止单点故障和保证业务稳定,做 HA 集群。
(3) 成本角度考虑,先使用公有云服务器,提前部署。
(4) 更新方式太过原始,测试环境开始先改用 git 。并搭建使用 gitlab 或 gogs。
2.原生产环境
(1)多点集群单体应用。
(2)公有云。
一种按使用量付费的模型,用户可以随时随地、便捷地、按需地从可配置的计算资源共享池中获取所需的计算资源(网络、服务器、存储、应用程序等服务),这些资源可以快速供给和释放,用户只需投入较少的管理工作。公有云:云计算运营商拥有超大规模基础设施,对外提供云服务。
(3) git 更新。
多点集群单体应用,把它分成两块,一块是多点集群
架构图,这是附带均衡器( Load balance )下边是 Local Network,Local Network 里面有包括真实服务器( Real Server ),也就我们的原站。这是多个服务器,多个点,共同为一套代码进行服务。
多点集群就是很多服务器在服务,服务的是一个单体应用,架构里面,服务的单体应用就是服务的某一个应用,这四个服务器里面,原站里面都是一套代码
3. 虚拟化和云计算
(1)物理隔离
A. 概念:
指采用物理方法将内网与外网隔离从而避免入侵或信息泄露的风险的技术手段。物理隔离主要用来解决网络安全问题的,尤其是在那些需要绝对保证安全的保密网,专网和特种网络与互联网进行连接时,为了防止来自互联网的攻击和保证这些高安全性网络的保密性、安全性、完整性、防抵赖和高可用性,几乎全部要求采用物理隔离技术。物理隔离包含隔离网闸技术 、物理隔离卡等。
物理隔离产品是用来解决网络安全问题的。尤其是在那些需要绝对保证安全的保密网,专网和特种网络与互联网进行连接时,为了防止来自互联网的攻击和保证这些高安全性网络的保密性、安全性、完整性、防抵赖和高可用性,几乎全部要求采用物理隔离技术。
B.特点:
资源利用率极低
灵活性差
成本高
(2)虚拟化的技术
通过硬件和软件支持实现物理架构资源的重新整合利用,可以用一台物理机,通过虚拟化就可以划分为多套系统,然后在系统之内进行一个多方位的隔离,隔离以后就相当多台服务器.
虚拟化是资源的一种逻辑表示,并不会受限于物理资源。运行的环境不在真实的硬件上,而是硬件之上的虚拟内存中的一段,或者说是虚拟的环境中。虚拟化为数据、计算能力、存储资源等提供了一个逻辑视图,而不是物理视图。虚拟化的发展,大幅降低了IT硬件成本,减少了资源的浪费,并且提升了系统的稳定性和安全性。
(3) 云计算(概念)
A.概念
分布式计算技术的一种,其最基本的概念,是透过网络将庞大的计算处理程序自动分拆成无数个较小的子程序,再交由多部服务器所组成的庞大系统经搜寻、计算分析之后将处理结果回传给用户。透过这项技术,网络服务提供者可以在数秒之内,达成处理数以千万计甚至亿计的信息,达到和“超级计算机”同样强大效能的网络服务。
B.特点
(1) 超大规模
“云”具有相当的规模,Google 云计算已经拥有100多万台服务器, Amazon、IBM、微软、Yahoo 等的“云”均拥有几十万台服务器。企业私有云一般拥有数百上千台服务器。“云”能赋予用户前所未有的计算能力。
(2) 虚拟化
云计算支持用户在任意位置、使用各种终端获取应用服务。所请求的资源来自“云”,而不是固定的有形的实体。应用在“云”中某处运行,但实际上用户无需了解、也不用担心应用运行的具体位置。只需要一台笔记本或者一个手机,就可以通过网络服务来实现我们需要的一切,甚至包括超级计算这样的任务。
(3) 高可靠性
”云”使用了数据多副本容错、计算节点同构可互换等措施来保障服务的高可靠性,使用云计算比使用本地计算机可靠。
(4) 通用性
云计算不针对特定的应用,在“云”的支撑下可以构造出千变万化的应用,同一个“云”可以同时支撑不同的应用运行。
(5) 高可扩展性
“云”的规模可以动态伸缩,满足应用和用户规模增长的需要。
(6) 按需服务
“云”是一个庞大的资源池,你按需购买;云可以像自来水,电,煤气那样计费。
(7) 极其廉价
由于“云”的特殊容错措施可以采用极其廉价的节点来构成云,“云”的自动化集中式管理使大量企业无需负担日益高昂的数据中心管理成本,“云”的通用性使资源的利用率较之传统系统大幅提升,因此用户可以充分享受“云”的低成本优势,经常只要花费几百美元、几天时间就能完成以前需要数万美元、数月时间才能完成的任务。云计算可以彻底改变人们未来的生活,但同时也要重视环境问题,这样才能真正为人类进步做贡献,而不是简单的技术提升。
(8) 潜在的危险性
云计算服务除了提供计算服务外,还必然提供了存储服务。但是云计算服务当前垄断在私人机构(企业)手中,而他们仅仅能够提供商业信用。对于政府机构、商业机构(特别像银行这样持有敏感数据的商业机构)对于选择云计算服务应保持足够的警惕。
云计算解决的问题:
1. 普通用户硬盘可以用云。
2. 互联网从业服务器可以用云。(阿里云,腾讯云,小鸟云)
3. 云计算依靠网络
4. 新生产环境
版本更新频率大增:
推广运营也大大加强了力度,产品用户量增加,需求提高,更改 bug 多,更新频率高
熬夜加班:
更新一般在半夜,尤其是大更新,如果出现问题的话,运维团队都不能离开,必须协助处理
生产环境不稳定
扯皮——对立:部门协调不稳定
压力更大恶性循环
自动化:
脚本自动化
Jenkins:
Jenkins 是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台。这是一个免费的源代码,可以处理任何类型的构建或持续集成。集成Jenkins 可以用于一些测试和部署技术。Jenkins 是一种软件允许持续集成。
功能开关:
为了快速发布开发完成的功能,现代的互联网企业通常会以比较快的迭代周期来持续的发布。但是有时候因为技术或者业务上的原因,需要在发布的时候将某些功能隐藏起来。一种解决方案是,在独立的分支上开发新功能,全部开发测试完成之后,才合并回主干,准备发布。这也就是我们经常提到的功能分支( feature branch )。本文将介绍如何使用功能开关( feature toggle )来更好地解决这个问题,及其在一个典型 Spring web 应用程序中的具体实现,最后讨论了功能开关和持续集成如何协同工作。
蓝绿发布:
蓝绿部署是一种以可预测的方式发布应用的技术,目的是减少发布过程中服务停止的时间。
简单来说,我们把整个服务集群分成两组(或更多组,为了显示蓝/绿,分为两组),一组认为是绿色,另一组认为是蓝色,此时通过 LB LIVE 都能够为用户提供服务。
(1) 多点负载均衡单体应用。
(2) 混合云。
混合云提供既在公共空间又在私有空间中的服务。当公司需要使用既是公共云又是私有云的服务时,选择混合云比较合适。混合云把公用云模式与专用云模式结合在一起。混合云有助于提供所需的、外部供应的扩展。用公用云的资源扩充专用云的能力,可用来在发生工作负荷
(3)devops。
DevOps 是一个必然趋势,是一种方法,也是一种观念。
1:原始的互联网公司工作模式是瀑布流,但用户越多,需求越大,公司的管理,人力成本都是问题。而如果更新间隔太慢,一定会导致用户的满意程度下滑。DevOps 的观念应运而生。
2:DevOps 实际上是两个单词:Development 和 Operations。
3:开发人员:根据需求情况,把需求拆分成多个小需求,小步快跑大幅增加需求完成的频率。
运维人员:运用自动化和 CI/CD 的概念,运用工具,实现稳定、快速的版本更新上线。
4:打破开发人员和运维人员的壁垒。
5:对运维人员的技术要求和经验大大提升。
开发人员根据需求情况,把需求拆分成多个小需求,小步快跑大幅增加完成需求频率。运维人员是运用自动化 CI/CD 的概念,运用工具,实现稳定,快速的版本更新上线,运维和开发往底层说,实际就是岗位要的东西不一样,运维要的是保持业务的稳定持续运行,开发是为了快速开发,开发完就快速上线,一个要稳定,一个要赶紧上线,开发上线的越多,更新得就越多,运维就更不稳定
新环境产生问题:
问题1:资源利用率。
服务器的治理,环境的迁移容灾上会产生问题,一个虚拟机要管多个配置的话,治理起来一定是难度更大的,端口容易冲突
*一个虚拟机跑多个项目。治理、迁移、容灾?
问题2:扩容不及时。
*脚本化启动50台虚拟机要多久?脚本化启动50台容器要多久?环境部署要多久?风险大不大?
问题3:环境不一致导致的问题。
多点负载均衡单体应用始终不变,然后又做成了 docker ,开始用了 docker ,第三个 devops 也没有变
5. 新兴生产环境
多点负载均衡单体应用。
docker。
devops。
二、docker
1.概念
docker13 年初开源,公司本来叫 dotcloud,后改名叫 docker 。被 Mitantis 收购。基于 Linux 内核的 cgroup ,namespace ,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
2. docker 与容器区别
docker 就是容器,容器就是 docker ,并不是这样的,容器就是一个技术类型。而 docker 是当下最主流的,容器的一种实现容器的方案, docker 只是容器其中一种实现方案,其他方案包括:LXC,Mesos,RKT 等等,最大区别当容器和服务器的数量达到一定规模的时候,就会碰到管理的问题,即如何有效管理大量的服务器和容器,保证应用的稳定运行、方便升级和故障的快速解决。容器编排工具提供图形化界面或者命令行来管理容器和服务器集群,提供容器配置、任务发布、服务发现、负载均衡、系统监控和故障恢复、声明式系统配置以及有关容器部署和性能的规则和约束定义机制等。
3. 进程级封装
docker 或者容器和传统虚拟化最大的一点区别,就是虚拟化的封装是系统级的封装,docker 或者其他容器是进程级的封装。和传统虚拟化最大的一点区别,就是虚拟化是系统级的封装,进程级封装。
用户量越来越大,功能越来越多。
代码越来越重。
耦合越来越高。一旦某个哪怕小的逻辑出错,甚至会影响整个站点。
bug 频率大增,bug 频率增加加耦合越来越高,简直对于互联网公司来说就是灾难。
代码重复率高,维护难度大。
代码越来越吃性能。服务器成本大增。
4. 微服务生产环境
微服务。
混合云 +docker+k8s。
devops。
三、k8s- 容器编排管理工具
1.k8s 功能
微服务需要跑多个容器,容器多又会涉及到通信、架构、伸缩、更新、监控等等问题。
自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器。
弹性伸缩: 通过监控容器的 cpu 的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改应用程序来使用不熟悉的服务发现机制,
2.k8s 作用
Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视
应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会恢复更改,利用日益增长的部署解决方案的生态系统。
要使用 Kubernetes ,你需要用 Kubernetes API 对象 来描述集群的 预期状态(desired state) :包括你需要运行的应用或者负载,它们使用的镜像、副本数,以及所需网络和磁盘资源等等。你可以使用命令行工具 kubectl 来调用 Kubernetes API 创建对象,通过所创建的这些对象来配置预期状态。你也可以直接调用 Kubernetes API 和集群进行交互,设置或者修改预期状态。
一旦你设置了你所需的目标状态,Kubernetes 控制面(control plane) 会通过 Pod 生命周期事件生成器( PLEG ),促成集群的当前状态符合其预期状态。为此,Kubernetes 会自动执行各类任务,比如运行或者重启容器、调整给定应用的副本数等等。Kubernetes 控制面由一组运行在集群上的进程组成
四、云原生技术栈
1.概念
云原生是一个生态概念、是一线互联网公司发展到某个极端的必然选择。
包含三大要素:容器及编排管理、DevOps、微服务。
2. 技术模块
应用定义及部署( App Definition and Development )
编排与管理 ( Orchestration & Management )
运行环境( Runtime )
配置( Provisioning )
平台( Platform )
可观测性和分析( Observability and Analysis )
无服务( Serverless )
3. 云原生时代
1:技术升级,概念先行。云原生、容器、devops 等一定是未来若干年的发展方向。
2:为什么说容器划时代?一方面容器解决了大型架构的发展瓶颈,另一方面,从运维岗位讲,传统运维已经跟不上脚步了,会新技术的运维一定会取代传统运维,更别说其他运维岗位。
3:在我刚学运维时候有人和我说了一句话:运维这个岗位慢慢会消失。
4:docker 是云原生时代的基石也是应用基础。而这个基础也需要有一定的经验积累才能学通。
5:对运维的要求越来越高。
五、容器
镜像( Image )和容器( Container )的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。
容器可以被创建、启动、停止、删除、暂停等 。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。
因此,任何保存于容器存储层的信息都会随容器删除而丢失。
六、容器和虚拟化
1.介绍
1:传统虚拟机,利用 hypervisor ,模拟出独立的硬件和系统,在此之上创建应用。
2:虚拟机是一个主机模拟出多个主机。
3:虚拟机需要先拥有独立的系统。
docker 是把应用及配套环境独立打包成一个单位。
docker 是在主机系统中建立多个应用及配套环境。
docker 是进程级的隔离。
2. 容器和虚拟化比较
特性:
启动速度 容器->秒级 虚拟机->分钟级
性能 容器->接近原生 虚拟机->较弱
内存代价 容器->很小 虚拟机->较多
硬盘使用 容器->一般为 MB 虚拟机->一般为GB
运行密度 容器->单机支持千个容器 虚拟机->一般几十个
隔离性 容器->安全隔离 虚拟机->完全隔离
迁移性 容器->优秀 虚拟机->一般
容器:再次提高服务器资源利用率
虚拟机:安全性较差
容器:重量更轻,体积更小。
虚拟机:多容器管理存在难度。
容器:匹配微服务的需求
虚拟机:稳定性较差
容器:保持多环境运行的一致性
容器:快速部署迁移,容错高。•
虚拟机:排错难度较大
Docker 底层技术:
Namespaces:
作用:访问隔离
Docker 主要就是借助 Linux 内核技术 Namespace 来做到隔离的,Linux Namespaces 机制提供一种资源隔离方案。PID,IPC,Network 等系统资源不再是全局性的,而是属于某个特定的 Namespace 。每个 namespace 下的资源对于其他 namespace 下的资源都是透明,不可见的。
因此在操作系统层面上看,就会出现多个相同 pid 的进程。系统中可以同时存在两个进程号为0,1,2的进程,由于属于不同的 namespace ,所以它们之间并不冲突。而在用户层面上只能看到属于用户自己 namespace 下的资源,例如使用 ps 命令只能列出自己 namespace 下的进程。这样每个 namespace 看上去就像一个单独的 Linux 系统。
IPC\NetWork\mount\PID\UTS\User
Control groups:
作用:做资源控制,CPU\MEM\ 宽带等
提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘 IO 等等) 的机制,被 LXC、docker 等很多项目用于实现进程资源控制。
cgroup 将任意进程进行分组化管理的 Linux 内核功能。
cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
Rootfs:
作用:文件系统隔离
1. 访问隔离案例
(1) 挂载镜像文件 iso
[root@docker ~] mount -t iso9660 zechen.iso /mnt
[root@docker ~] ls /mnt
(2)管理服务器
#创建命名空间
[root@docker ~] unshare -m /bin/bash
#重新挂载
[root@docker ~] mount -t iso9660 -0 loop zechen.iso /mnt
#重新查看
[root@docker ~] ls /mnt
自己能看到,切换到其他用户就不能看见文件
2. 退出访问隔离
[root@docker ~] exit
Docker版本:
docker 官方提供2种版本,一个是 docker 企业版 docker-EE ,另外一个则是社区版 docker-ce ,我们在学习或者测试环境使用 docker-ce 版本即可。发布版本 docker 更新很快,现在最新的是:
20.10
进入官网查看版本发行时间和版本号
七、答疑环节
1.docker 容器怎么迁移
docker 容器迁移,前期持久化数据,固定的目录,数据然后映射到这个目录上面永久存储到某一个目录上面,导致的一些配置出现问题。还有要注意的就是 docker 的版本
2.关于云原生的技术栈
云原生的技术栈实际上三个方面,devops,微服务,还有一块是容器 K8s ,从系统层次来看,从上到下分别是:
应用层:应用定义及部署( App Definition and Development )、配置 ( Provisioning )、可观测性和分析( Observability and Analysis )、无服务( Serverless )
集群:编排与管理( Orchestration & Management )
底层运行环境:运行环境( Runtime )
3. 数据库应该安装 docker 里面
建议数据库不要装 docker ,放到你的虚拟机里边,数据库本身这个软件也不太可能和其他的软件共同装在一个,毕竟容器里你进去以后你要排错,为了避免这种麻烦,建议数据库这一块就尽量不要放在容器里边
4. 启动 docker 用什么脚本
建议学一下K8s,自己的脚本也可以运行
5. docker 镜像是简化的 linux
镜像里面只包含两种东西,它的依赖环境和它实际要做的一个应用,镜像是把它两个融合在一起的,就是应用和它底层的一些依赖环境环境变量,或者一些参数也好等等。它把它们融合到一起了