云原生介绍
1 、云原生的定义
云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展、可复制的方式最大化地利用云的能力、发挥云的价值的最佳路径。
2 、云原生思想两个理论
第一个理论基础是:不可变基础设施。
第二个理论基础是:云应用编排理论。
3 、基础设施向云演进
(1) 过程:
① 传统的应用基础设施是可变的:需要发布或者更新一个软件,流程大致是这样的,先通过 SSH 连到服务器,然后手动升级或者降级软件包,逐个调整服务器上的配置文件,并且将新代码直接都部署到现有服务器上。因此,这套基础设施会不断地被调整和修改。
② 在云上,应用基础设施是不可变的。一旦应用部署完成之后,那么这套应用基础设施就不会再修改了。如果需要更新,那么需要现更改公共镜像来构建新服务直接替换旧服务。
(2) 意义:
基础设施保持一致性和可靠性;
镜像本身是自包含的,其包含了应用运行所需要的所有依赖;
云原生的基础设施还提供了简单、可预测的部署和运维能力;
应用本身也可以更好地扩容。
容器的基本概念
一、容器与镜像:
1 、容器
(1) 操作系统中进程的特点:
第一,这些进程可以相互看到、相互通信;
第二,它们使用的是同一个文件系统,可以对同一个文件进行读写操作;
第三,这些进程会使用相同的系统资源。
这三个特点带来的问题:
具有高级权限的进程可能会将其他进程的数据进行增删改查;进程与进程之间的依赖可能会存在冲突;这些进程使用的是同一个宿主机的资源,存在资源抢占的问题。
(2) 什么是容器:
容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。
① 视图隔离:就是能够看到部分进程以及具有独立的主机名等;
② 控制资源使用率:对于内存大小以及 CPU 使用个数等进行限制;
③ 独立文件系统:容器将系统的其他资源隔离开来,具有自己独立的资源视图。
2 、镜像
(1) 什么是镜像
容器运行时所需要的所有的文件集合称之为容器镜像。
通常采用 Dockerfile 来构建镜像。描述构建的每个步骤,每个构建步骤都会对已有的文件系统进行操作,带来文件系统内容的变化,这些变化称之为 changeset。当我们把构建步骤所产生的变化依次作用到一个空文件夹上,就能够得到一个完整的镜像。
changeset 的分层以及复用特点带来的优势:
① 提高分发效率:对于大的镜像而言,将其拆分成各个小块能够并行下载这些数据,提高镜像的分发效率;
② 具有了复用能力之后,可以节约大量的磁盘空间。
(2) 如何构建镜像
① FROM 行表示以下的构建步骤基于什么镜像进行构建;
② WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目录下进行,类似于 Shell 里面的 cd;
③ COPY 行表示的是可以将宿主机上的文件拷贝到容器镜像内;
④ RUN 行表示在具体的文件系统内执行相应的动作,运行完毕后就得到一个应用了;
⑤ CMD 行表示使用镜像时的默认程序名字。
当有了 Dockerfile 之后,就可以通过 docker build 命令构建出所需要的应用。
docker registry 镜像仓库,负责存储所有产生的镜像数据。只需要通过 docker push 就能够将本地镜像推动到镜像仓库中,就能够在生产环境上或者测试环境上将相应的数据下载下来并运行了。
(3) 如何运行容器:
① 从镜像仓库中将相应的镜像下载下来;
② 通过 docker images 来查看本地镜像,在列表中选中想要的镜像;
③ 当选中镜像之后,通过 docker run 来运行这个镜像得到想要的容器,可以通过多次运行得到多个容器。
一个镜像就相当于是一个模板,一个容器就像是一个具体的运行实例,因此镜像就具有了一次构建、到处运行的特点。
二、容器生命周期:
1 、容器运行时的生命周期
在使用 docker run 的时候会选择一个镜像来提供独立的文件系统并指定相应的运行程序。这里指定的运行程序称之为 initial 进程。这个 initial 进程启动的时候,容器也会随之启动,当 initial 进程退出的时候,容器也会随之退出。可以认为容器的生命周期和 initial 进程的生命周期是一致的。
容器内不只有这样的一个 initial 进程,initial 进程本身也可以产生其他的子进程或者通过 docker exec 产生出来的操作,也属于 initial 进程管理的范围内。当 initial 进程退出的时候,所有的子进程也会随之退出。
2 、数据卷
当一个容器退出被删除之后,数据也就会丢失了。所以需要将容器所产生出来的重要数据持久化到指定的目录上,这个目录就称之为数据卷。
(1) 数据卷特点:
数据卷的生命周期是独立于容器的生命周期的,也就是说容器的创建、运行、停止、删除等操作都和数据卷没有任何关系。将数据卷挂载到容器内,容器就能够将数据写入到相应的目录里面了,而且容器的退出并不会导致数据的丢失。
(2) 数据卷管理的方式:
① 通过 bind 的方式,直接将宿主机的目录直接挂载到容器内。
② 将目录管理交给运行引擎。
三、容器和 VM 之间的差异
① VM 利用 Hypervisor 虚拟化技术来模拟 CPU、内存等硬件资源,这样就可以在宿主机上建立一个 Guest OS,每一个 Guest OS 都有一个独立的内核,比如 Ubuntu、CentOS 甚至是 Windows 等,在这样的 Guest OS 之下,每个应用都是相互独立的,VM 可以提供一个更好的隔离效果。但是需要把一部分的计算资源交给虚拟化,很难充分利用现有的计算资源,并且每个 Guest OS 都需要占用大量的磁盘空间。
② 容器是针对于进程而言的,因此无需 Guest OS,只需要一个独立的文件系统提供其所需要文件集合即可。所有的文件隔离都是进程级别的,因此启动时间快于 VM,并且所需的磁盘空间也小于 VM。