云计算期末复习

本文最后更新于:2023年3月23日 上午

1.1 云计算概述

1.1.4 云计算的推动力

1,网络带宽的提升(拨号上网-> 光纤入户->4/5G)
2,技术成熟度(云计算的数据服务中心高效智能可靠经济)
3,移动互联网的发展(多设备同步信息)
4,数据中心的演变(云计算是企业拥有高效经济的数据中心的选择之一,因为企业不需要装自己的服务器什么的)
5,经济因素(云计算资源集中,智能分配资源使资源最大化利用降低成本)
6,大数据(大厂们有了处理大数据的需求,推动云计算发展)

1.2.1 云计算的公共特征

  • 弹性伸缩
  • 快速部署
  • 资源抽象
  • 按用量收费
  • 宽带访问

1.2.2 云计算的分类

(1)根据云的部署模式和云的使用范围进行分类

  • 公共云
  • 私有云(专属云)
  • 社区云
  • 混合云
  • 行业云

(2)针对云计算的服务层次和服务类型进行分类(云计算开源软件以前俩为主)

  • 基础设施即服务(IaaS)[Infrastructure as a Service]
    把IT基础设施像水电一样以服务的形式提供给用户。(毛坯房给用户自己找人按照自己想法装修)
    开源软件:OpenStack, CloudStack, oVirt, ZStack
  • 平台即服务(PaaS)[Platform as a Service]
    服务提供商提供经过封装的IT能力,用户使用它来进行开发。(毛坯房和装修队给用户,用户用它们来装修)
    开源软件:OpenShift, Rancher, CloudFounds以及调度平台Kubernetes(k8s),Mesos
  • 软件即服务(SaaS)[Software as a Service]
    服务供应商负责维护和管理软硬件设施,并以免费或按需租用方式直接向最终用户提供服务。(精装房,拎包入住)

1.2.3 与云计算有关的技术

(1)并行计算

指同时执行多个指令的计算模式,原理为将一个大问题分解为多个同时处理的小问题,加快计算速度,结构上是紧耦合的

(2)SOA(面向服务的体系结构)[Service-Oriented Architecture]

一套设计和开发软件的原则和方法,使实现服务的平台或系统中所构建的各类服务可以通过一种统一和通用的方式进行交互

(3)虚拟化

比如一台1TB的硬盘划分为5个200GB的盘给5个用户使用,把硬件资源虚拟化了,目的是用逻辑方法摆脱物理资源具有的各种限制

2.5 典型的分布式系统

2.5.1 分布式计算的理论基础

ACID原则

  • 原子性(Atomicity)
    一个事务的所有系列操作步骤被看成一个动作,所有的步骤要么全部完成,要么一个也不会完成。如果在事务过程中发生错误,则会回滚到事务开始前的状态,将要被改变的数据库记录不会被改变。
  • 一致性(Consistency)
    一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏,即数据库事务不能破坏关系数据的完整性及业务逻辑上的一致性。
  • 独立性/隔离性(Isolation)
    主要用于实现并发控制,隔离能够确保并发执行的事务按顺序一个接一个地执行。通过隔离,一个未完成事务不会影响另外一个未完成事务。
  • 持久性(Durability)
    一旦一个事务被提交,它应该持久保存,不会因为与其他操作冲突而取消这个事务。

BASE理论

  • 基本可用
    基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用
  • 软状态
    软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性
  • 最终一致性
    最终一致性是指系统中的所有数据副本经过一定时间后,最终能达到一致的状态

分布式存储案例:Hadoop

Namenode, Datanode, Secondary Namenode

namenode的定义和作用
(1)定义:

NameNode(元数据节点,主节点)是整个文件系统的管理节点。

(2)作用:
  • 它维护着整个文件系统的文件目录树、文件/目录的元信息和每个文件对应的数据块列表。
  • 接收用户的操作请求。
datanode的定义和作用
(1)定义:

是文件系统的数据结点。

(2)作用:
  • 客户端或者元数据信息可以向数据节点请求写入或者读出数据块。
  • 其周期性的向元数据节点汇报其存储的数据块、元数据信息。
  • 提供真实文件数据的存储服务。
secondary namenode的定义和作用
(1)定义:

是namenode的冷备份。

(2)作用:

周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。

Git命令

1
2
3
git remove -v # 查看Fork当前配置的远程仓库
git remote add upstream URL # 验证Fork里新指明的upstream仓库
git remote -v # 看到Fork的URL作为原始的地址,原始仓库的URL作为upstream

2.5.2 P2P系统

对等网络系统,简称P2P系统,即媒体及公众所称的“点对点系统”,是一种应用在对等者之间分配任务和工作负载的分布式应用架构系统。

2.5.3 透明计算

区块链模式

区块链的核心特征(3方面):
  • 块链结构:每一块有时间戳,每一块都含有前面一块的散列加密信息,对每个交易进行验证。
  • 多独立拷贝存储:区块链系统的每个节点都存储同样信息。
  • 拜占庭容错:容忍少于1/3结点恶意作弊或者被黑客攻击,系统仍然能够正常工作。
区块链体系架构
  • 网络层
  • 共识层
  • 数据层
  • 智能合约层
  • 应用层

3.2 云计算架构

REST架构:云计算的软件架构

  • 组件交互的伸缩性:参与交互的组件数量可以无线扩展。
  • 界面的普遍性:IT界人士都熟悉REST的界面风格。
  • 组件发布的独立性:组件可以独立发布,无须与任何组件进行事先沟通。
  • 客户机/服务器模型:使用统一的界面来分离客户机和服务器。
  • 无状态连接:客户机上下文不保存在服务器中,每次请求都需要提供完整的状态。

3.3 云栈和云体

  • 云体是云计算的物质基础,是云计算所用到的资源集合。
  • 云栈又称云平台,是在云上面建造的运行环境。

3.3.1 逻辑云栈

软件即服务层(SaaS)特点

  • 基于网络(一般为web模式)进行远程访问的商用软件
  • 集中式管理,而非分散在每个用户站点
  • 应用交付一般接近一对多模型,即所谓的单个实例多个租户架构
  • 按照用量计费(实际中按一个月或其他时间周期进行计费)

4.1 虚拟化定义

虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这取决于他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。

虚拟化技术分类

  • 服务器虚拟化
  • 网络虚拟化
  • 桌面虚拟化
  • 软件定义的存储

5.1 分布式存储

分布式表系统

典型分布式表系统包括Google Bigtable, Microsoft Azure Table Storage, Amazon DynamoDB等

  • 基于光纤通道的存储区域网络(SAN):通过将磁盘存储系统和服务器直接相连的方式提供一个易扩展、高可靠的存储环境,高可靠的光纤通道交换机和光纤通道网络协议保证各个设备间链接的可靠性和高效性。
  • 网络附连存储(NAS):通过基于TCP/IP的各种上层应用在各工作站和服务器之间进行文件访问,直接在工作站客户端和NAS文件共享设备之间建立连接,NAS隐藏了文件系统的底层实现,注重上层的文件服务实现,具有良好的扩展性。
  • GFS(Google File System):GFS采用单Master Server多Chunk Server来实现系统间的交互。

6.1.2 覆盖网络

覆盖网络(Overlay Network)是一种在原有网络基础上构建的网络连接抽象及管理的技术。

7 Docker的常用命令

查看Docker是否正常工作

1
docker info

命令用于查询环境中docker程序是否存在,功能是否正常。
该命令会返回

  • 所有的容器和镜像的数量
  • Docker使用的执行驱动和存储驱动
  • Docker的 基本配置

启动Docker

docker run:包含创建和运行两个指令。

1
2
3
4
#启动第一个docker,运行ubuntu,使用交互模式-i,启动一个虚拟终端连接该系统-t,并执行bin/bash命令
#该容器为ubuntu操作系统,拥有自己的网络和IP地址,以及一个用来和宿主主机进行通信的桥接网络接口。
#然后我们告诉docker在新容器中要运行bash命令。
docker run -i -t ubuntu /bin/bash
  • -i:保持STDIN输入是打开的
  • -t:启用一个伪tty终端
    同时启用 -i -t参数可以在容器运行的时候,提供一个可交互的shell。而不是运行一个后台的服务器。

查看容器信息

1
2
3
4
5
#正常情况下,我们使用docker ps只能看到当前正在运行中的所有容器信息
docker ps
#如果想看到所有已经关闭的容器信息,可以使用参数-a
#查看当前系统中容器的列表,-a代表列出所有容器,包含正在运行的和已经停止的。
docker ps -a

查看容器的长ID

1
2
3
4
#检视容器66896的信息
docker inspect bb896
#检视容器66896的信息,只看Id
docker inspect bb896 | grep Id

给容器命名

1
docker run --name my_docker_ubuntu -i -t ubuntu /bin/bash
  • 上述命令将会创建一个名为my_docker_ubuntu的容器。
  • 一个合法的容器名称只能包含以下字符:小写字母az、大写字母AZ、数字0~9、下划线、圆点、横线(如果用正则表达式来表示这些符号,就是[a-zA-Z0-9_.一])
  • 在很多Docker命令中,我们都可以用容器的名称来替代容器ID
  • 容器的命名必须是唯一的。如果我们试图创建两个名称相同的容器,则命令将会失败。如果要使用的容器名称已经存在,可以先用 docker rm 命令删除已有的同名容器后,再来创建新的容器。

重新启动停止的容器

1
2
3
4
5
6
7
8
#使用名字启动容器
docker start my_docker_ubuntu
#除了使用名字启动,我们也可以使用id来启动容器
docker start 6071e53ff9ea
#直接启动容器,并使用终端登录
docker start -i 6071353ff9ea
#查看当前正在运行的docker容器
docker ps

附着到容器上

Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行,因此我们容器重新启动后会
运行过一个交互式会话shell。此外,我们也可以 用docker attach命令重新附着到该容器的会话上。

1
2
3
4
#使用名字附着
docker attach my_docker_ubuntu
#使用id附着
docker attach 6071353ff9ea

这样,我们就又能重新回到容器的Bash提示符。
如果退出容器shell,容器将会随之停止运行。

创建后台容器

1
2
3
4
5
6
#使用-d参数在后台启用一个守护式容器
#我们还在容器里要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进
程停止运行。
docker run --name my_docker_ubuntu_daemon -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done"
#查看当前容器
docker ps -a

查看容器内日志

1
2
3
4
5
6
#可以使用docker logs命令来获取容器的日志,日志将显示不断输出的hello world
docker logs my_docker_ubuntu_daemon
#使用docker logs -f参数来监控docker日志,该命令与tail -f命令相似,可以使用ctrl+c退出日志跟踪。
docker logs -f my_docker_ubuntu_daemon
#查看容器内的进程
docker top my_docker_ubuntu_daemon

在容器内部运行进程

1
2
3
4
5
6
#在容器my_docker_ubuntu_daemon中/etc目录中创建一个文件new_config_file
docker exec -d my_docker_ubuntu_daemon touch /etc/new_config_file
#在容器my_docker_ubuntu_daemon中启动一个shell交互式任务
docker exec -it my_docker_ubuntu_daemon /bin/bash
#进入容器后,可以查看刚才创建的new_config_file文件
cat /etc/new_config_file

停止容器

1
2
3
4
#通过名字停止容器
docker stop my_docker_ubuntu_daemon
#通过id停止容器
docker stop 493bb4a22d65

自动重启容器

1
2
3
#可以使用--restart标志,让docker自动重新启动容器。
docker run --restart=always --name my_docker_ubuntu_daemon -d ubuntu /bin/sh "while true;do echo hello world;sleep 1;done"
#可以设置--restart=on-failure:5来设置失败后可以重启5次。

删除容器

1
2
3
4
#删除my_docker_ubuntu_daemon容器
docker rm my_docker_ubuntu_daemon
#目前还没有办法一次删除所有容器,但是可以通过下面的方法来删除所有容器。
docker rm 'docker ps -a -q'

else(好多啊……)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#查找所有ubuntu镜像
docker search ubuntu
#拉取镜像ubuntu
docker pull ubuntu
#拉取docker.io的ubuntu镜像
docker pull docker.io/ubuntu
#拉取最新版的ubuntu
docker pull ubuntu:latest
#使用commit命令构建新的镜像
docker commit 493bb4a22d65 z33/my_ubuntu_vim
#使用inspect命令查看创建的镜像的信息
docker inspect z33/my_ubuntu_vim
#使用history来查看镜像构建信息
docker history z33/my_ubuntu_vim
#从新构建的镜像中运行一个新的容器
docker run -t -i z33/my_ubuntu_vim /bin/bash
#删除镜像
docker rmi z33/static_web:0.0.

8 Dockerfile

什么是Dockerfile

Dockerfile使用基本的DSL语句来构建一个Docker镜像。配合docker build命令,可以帮助我们快速的创
建镜像。我们推荐使用Dockerfile和docker build命令,而不是使用docker commit来创建镜像。

常用Dockerifle命令

1. CMD

用于指定一个容器启动时要运行的命令。该指令有点类似与RUN指令,区别在于:RUN指令是指定镜像
被构建时要运行的命令,而CMD则是容器被启动的时候要运行的命令。

1
2
docker run -i -t z33/statice_web /bin/true
CMD ["/bin/true"]

以上两句是一致的。

  • CMD中需要执行的命令,要使用数组的方式设定,比如 [“/bin/true”,”-l”]
  • 使用docker run命令可以覆盖CMD指令

2. ENTRYPOINT

ENTRYPOINT命令类似与CMD,但它不会被 docker run 命令所覆盖,所以 docker run 命令会以数组
的方式加入到原先的命令后。

1
ENTRYPOINT ["/bin/bash","-l"]

3. RUN

执行命令。
如:

1
RUN nginx

对于命令中带有参数,则应该以数组的方式来执行
如:

1
RUN ["nginx","-g","daemon off;"]

4. WORKDIR

该命令可以在容器内部设置一个工作目录,ENTRYPOINT和/或者CMD指定的程序会在这个目录下执
行。类似与Linux中的cd命令。

1
2
3
4
WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT ["backup"]

该Dockerfile的工作流程如下

  1. 切换工作目录为/opt/webapp/db
  2. 创建镜像时,运行bundle install命令
  3. 切换工作目录为/opt/webapp
  4. 容器启动后,执行backup命令

5. ENV

该指令用来在镜像构建过程中设置环境变量

1
ENV RVM_PATH /home/rvm

示例:

1
2
ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR

该dockerfile创建了一个环境变量TARGET_DIR,然后将工作目录设置为TARGET_DIR

  • 设置路径的时候,如果有需要,可以通过在环境变量前加一个反斜线来进行转移
  • 使用docker run命令时,可以使用-e参数来传递环境变量。例如:
1
docker run -ti -e "WEB_PORT=8080" ubuntu

6. USER

该指令用来指定镜像会以什么样的用户去运行,如果不指定,默认用户为root

1
2
USER scott
USER user:group
  • 使用docker run命令时,可以使用参数-u选项来设置执行的用户

7. VOLUME

我们会在下一个章节中着重讲解。
该指令用来向基于镜像创建的容器添加卷。卷就是可以存在与一个或者多个容器内的特定的目录,这个
目录可以绕过联合文件系统,并提供如下共享数据或者对数据进行持久化(保存数据)

  • 卷可以在容器间共享和重用
  • 一个容器可以不和其他容器共享卷
  • 对卷的任何修改都是立即生效的
  • 对卷的修改不会影响镜像
  • 卷会一直存在知道没有任何容器再使用它

我们可以把程序的数据、数据库或者其他的内容添加到镜像中。

1
VOLUME ["/opt/project","/data"]

8. ADD

用来将构建环境下的文件和目录复制到镜像中。
如:将software.li文件拷贝到容器中,并存放在容器的/opt/application/目录下。如果容器中该文件目
录不存在,Docker会自动帮我们创建该目录。

  • 如果该目的位置中已经存在了相同的文件,那么目的位置中的文件或者目录不会被覆盖。
  • 注意:目录必须在最后面加/结束
1
ADD software.lic /opt/application/software.lic

该命令会指定解压,如:

1
ADD latest.tar.gz /var/www/wordpress/

会自动解压latest文件,并拷贝到/var/www/wordpress/文件夹中

9. COPY

COPY和ADD相同,但是不会进行解压缩。文件源路径必须是一个与当前构建环境相对的文件或者目
录,本地文件都要放到和Dockerfile同一个目录下。不能复制该目录之外的任何文件。

如果目的地址以/结尾,那么Docker就会认为这是一个目录。

例:把本地conf.d目录中的文件复制到/etc/apache2/目录中

1
COPY conf.d/ /etc/apache2/

10. ONBUILD

为镜像添加触发器。当一个镜像被用作其他镜像的基础镜像时,该镜像中的触发器会被执行。

1
ONBUILD ADD . /app/src

11. 示例

使用Dockerfile创建Tomcat8.5服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# version: 0.1
# 使用镜像centos7
FROM centos:7
# 安装jdk,这步将会很慢
RUN ["yum", "install", "-y" , "java-1.8.0-openjdk*"]
# 安装wget
RUN ["yum", "install", "-y", "wget"]
# 设置工作空间为/opt
WORKDIR /opt
# 下载tomcat8.5.65
RUN ["wget" , "https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz"]
# 解压缩
RUN ["tar","-zxvf","apache-tomcat-8.5.65.tar.gz"]
# 重命名tomcat-8.5.65文件夹为tomcat
RUN ["mv","apache-tomcat-8.5.65","tomcat"]
# 设置容器运行时的命令为catalina.sh run
ENTRYPOINT ["/opt/tomcat/bin/catalina.sh","run"]
# 暴露端口8080
EXPOSE 8080

编译

1
docker build -t="z33/tomcat8:0.1" .

运行容器

1
docker run -d -p 8080:8080 --name mytomcat8 z33/tomcat8:0.1

在浏览器中查看


云计算期末复习
https://moechun.fun/2022/05/25/云计算期末复习/
作者
Knight Kilito
发布于
2022年5月25日
更新于
2023年3月23日
许可协议