这两个东西都是编译好的二进制文件.就是用法不同而已.为什么要分为动态和静态两种库呢?先看下图:
上篇文章的最后,我们自定义了一个带属性的标签,并使用它完成了一个简单的案例.其实到这我们已经可以看出来,前端jsp页面只需要写一个类似html语法的标签,就可以完成将集合中的数据取出来并展示这么相对复 ...
当一个数的二进制表示中,0的个数大于或等于1的个数时,叫做RoundNumber.求从S到F两个数(包含)之间的RoundNumber个数. 这类题一般都是先求出0到N的个数,然后两个相减. 由于题目 ...
给亲分享阿里技术专家的文章,带您快速了解Kubernetes,希望对您有帮助!!!
在介绍容器的具体概念之前,先简单回顾一下操作系统是如何管理进程的。
首先,当我们登录到操作系统之后,可以通过 ps 等操作看到各式各样的进程,这些进程包括系统自带的服务和用户的应用进程。那么,这些进程都有什么样的特点?
这样的三个特点会带来什么问题呢?
针对上述的三个问题,如何为进程提供一个独立的运行环境呢?
那么,应该如何定义这样的进程集合呢?
其实,容器就是一个视图隔离、资源可限制、独立文件系统的进程集合。所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。容器就是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。
容器具有一个独立的文件系统,因为使用的是系统的资源,所以在独立的文件系统内不需要具备内核相关的代码或者工具,我们只需要提供容器所需的二进制文件、配置文件以及依赖即可。只要容器运行时所需的文件集合都能够具备,那么这个容器就能够运行起来。
综上所述,我们将这些容器运行时所需要的所有的文件集合称之为容器镜像。
那么,一般都是通过什么样的方式来构建镜像的呢?通常情况下,我们会采用 Dockerfile 来构建镜像,这是因为 Dockerfile 提供了非常便利的语法糖,能够帮助我们很好地描述构建的每个步骤。当然,每个构建步骤都会对已有的文件系统进行操作,这样就会带来文件系统内容的变化,我们将这些变化称之为 changeset。当我们把构建步骤所产生的变化依次作用到一个空文件夹上,就能够得到一个完整的镜像。 changeset 的分层以及复用特点能够带来几点优势:
8 分钟入门 K8s | 详解容器基本概念
当有了 Dockerfile 之后,就可以通过 docker build 命令构建出所需要的应用。构建出的结果存储在本地,一般情况下,镜像构建会在打包机或者其他的隔离环境下完成。
那么,这些镜像如何运行在生产环境或者测试环境上呢?这时候就需要一个中转站或者中心存储,我们称之为 docker registry,也就是镜像仓库,其负责存储所有产生的镜像数据。我们只需要通过 docker push 就能够将本地镜像推动到镜像仓库中,这样一来,就能够在生产环境上或者测试环境上将相应的数据下载下来并运行了。
运行一个容器一般情况下分为三步:
简单回顾一下,容器就是和系统其它部分隔离开来的进程集合,这里的其他部分包括进程、网络资源以及文件系统等。而镜像就是容器所需要的所有文件集合,其具备一次构建、到处运行的特点。
容器是一组具有隔离特性的进程集合,在使用 docker run 的时候会选择一个镜像来提供独立的文件系统并指定相应的运行程序。这里指定的运行程序称之为 initial 进程,这个 initial 进程启动的时候,容器也会随之启动,当 initial 进程退出的时候,容器也会随之退出。
因此,可以认为容器的生命周期和 initial 进程的生命周期是一致的。当然,因为容器内不只有这样的一个 initial 进程,initial 进程本身也可以产生其他的子进程或者通过 docker exec 产生出来的运维操作,也属于 initial 进程管理的范围内。当 initial 进程退出的时候,所有的子进程也会随之退出,这样也是为了防止资源的泄漏。 但是这样的做法也会存在一些问题,首先应用里面的程序往往是有状态的,其可能会产生一些重要的数据,当一个容器退出被删除之后,数据也就会丢失了,这对于应用方而言是不能接受的,所以需要将容器所产生出来的重要数据持久化下来。容器能够直接将数据持久化到指定的目录上,这个目录就称之为数据卷。
数据卷有一些特点,其中非常明显的就是数据卷的生命周期是独立于容器的生命周期的,也就是说容器的创建、运行、停止、删除等操作都和数据卷没有任何关系,因为它是一个特殊的目录,是用于帮助容器进行持久化的。简单而言,我们会将数据卷挂载到容器内,这样一来容器就能够将数据写入到相应的目录里面了,而且容器的退出并不会导致数据的丢失。
通常情况下,数据卷管理主要有两种方式:
moby 容器引擎架构
moby 是目前最流行的容器管理引擎,mobydaemon 会对上提供有关于容器、镜像、网络以及 Volume的管理。moby daemon 所依赖的最重要的组件就是 containerd,containerd 是一个容器运行时管理引擎,其独立于 moby daemon ,可以对上提供容器、镜像的相关管理。
本节课程只是针对于 moby 进行一个大致的介绍,在后续的课程也会详细介绍。
容器和 VM 之间的差异
VM 利用 Hypervisor 虚拟化技术来模拟 CPU、内存等硬件资源,这样就可以在宿主机上建立一个 Guest OS,这是常说的安装一个虚拟机。
每一个 Guest OS 都有一个独立的内核,比如 Ubuntu、CentOS 甚至是 Windows 等,在这样的 Guest OS 之下,每个应用都是相互独立的,VM 可以提供一个更好的隔离效果。但这样的隔离效果需要付出一定的代价,因为需要把一部分的计算资源交给虚拟化,这样就很难充分利用现有的计算资源,并且每个 Guest OS 都需要占用大量的磁盘空间,比如 Windows 操作系统的安装需要 10~30G 的磁盘空间,Ubuntu 也需要 5~6G,同时这样的方式启动很慢。正是因为虚拟机技术的缺点,催生出了容器技术。 容器是针对于进程而言的,因此无需 Guest OS,只需要一个独立的文件系统提供其所需要文件集合即可。所有的文件隔离都是进程级别的,因此启动时间快于 VM,并且所需的磁盘空间也小于 VM。当然了,进程级别的隔离并没有想象中的那么好,隔离效果相比
总体而言,容器和 VM 相比,各有优劣,因此容器技术也在向着强隔离方向发展。
作者:阿里巴巴高级开发工程师 傅伟
Kubernetes 脱胎于 Google 的 Borg 系统,是一个功能强大的容器编排系统。Kubernetes 及其整个生态系统(工具、模块、插件等)均使用 Go 语言编写,从而构成一套面向 API、可高速运行的程序集合,这些程序文档精良、易于参与贡献或在其上构建应用程序。
每个开发、运维或感兴趣的读者都应熟悉它的一些核心概念,以便理解这个系统及其不同的功能,以及为什么几乎所有人都在使用它。
在继续之前,我想提一下 Kubernetes 的几个顶级朋友(或竞争对手):ECS、Nomad 和 Mesos。ECS 是 AWS 自己的编排解决方案,最近它又推出了托管在 AWS 上的 Kubernetes 系统——EKS。两者都支持 FARGATE,让用户无须关心所运行的物理资源。
Kubernetes 毫无疑问是最大赢家,作为一个开源系统,三大主流云服务商都以托管的方式提供了这项功能。但是,它比其他几个产品都要来得复杂和混乱。Kubernetes 可以处理几乎任何类型的容器负载,也有很多技巧,但这并不意味着每个人都应该使用它。其他解决方案或许也能满足某些公司的要求,例如,完全部署在 AWS 上的互联网产品公司,使用 ECS 会比 Kubernetes 具有更佳的生产环境体验,是的,也好于 EKS。
话虽如此,Kubernetes 的魔力在于:它可以部署在任何地方、它拥有一个活跃的社区,有数百个核心开发人员及数千个生态系统开源贡献者。它运行快速、具有创新性、模块化且面向 API,是一个对构建插件或服务非常友好的系统。
好了,闲话少说,开始我们的旅程。
作者:平名 阿里服务端开发技术专家
更多云计算干货敬请关注阿里云官网知乎机构号: