“容器”无疑是近年IT业界的buzzword,不过,在不一样语境下,它对不一样的人有不一样的含义。在本文中,我将从Linux容器、容器镜像、写时复制等方面来阐释容器的具体含义。git
Linux容器github
传统意义上的Linux容器实际上只是Linux系统上的普通进程。这些进程组使用资源约束(控制组,即[cgroups])、Linux安全约束(Unix权限、功能、SELinux、AppArmor、seccomp等)和命名空间(PID、网络、挂载等)与其余进程组隔离开来。web
若是你启动一个Linux系统而且查看使用cat /proc/PID/cgroup的任意进程,你将看到在cgroup中的某一进程。若是你查看 /proc/PID/status,则会看到其功能。若是你查看/ proc / self / attr / current,你将会获取SELinux的标签们。若是你查看/proc/PID/ns,你会在其中看到一系列命名空间的进程。安全
因此,若是你将容器定义为具备资源限制、Linux安全约束以及命名空间的进程,那么根据这必定义,Linux系统上的每一个进程都运行在容器中。这就是为何有人说“Linux即容器,容器即Linux”。而容器运行时则是修改这些资源限制、安全约束以及命名空间,而且能够启动容器的程序。网络
容器镜像架构
Docker引入了容器镜像的概念,这是一个标准的TAR文件,它包含了:app
Rootfs (容器根文件系统):在操做系统上带有根目录(/)标识的目录,例如:/usr 、/var 、 /home 等等。框架
JSON文件(容器配置):JSON文件会来规定如何运行rootfs,例如:当容器启动时应该在rootfs中运行什么指令或entrypoint,应该为容器设置什么样的环境变量,容器的工做目录是什么等等。工具
Docker基础镜像由根文件系统和JSON文件组成,能够经过在基础镜像的根文件系统中安装所需的内容,以更新JSON文件,而且新建一个镜像层,经过这种方式能够制做一个新的镜像。学习
容器镜像的定义最终由Open Container Initiative(OCI)标准化为OCI镜像规范。
用于构建容器镜像的工具被称为容器镜像构建器(如Dockerfile),有时容器引擎也可以完成构建容器镜像的工做,固然也可使用一些能够构建容器镜像的独立工具。
Docker获取了这些容器镜像(tarballs)而后将他们上传到一个web服务中,你能够从中拉取他们。而后Docker会开发一个协议以便你顺利拉取这些镜像,而这一web服务便被称为容器镜像仓库。
容器引擎能够从容器镜像仓库中拉取镜像,而后将其重组到容器存储上。此外,容器引擎也能启动容器运行时(以下图)。
Copy On Write(COW)
容器存储一般是一个写时复制(COW)分层文件系统。当你从镜像仓库中拉取一个镜像时,首先,你要从镜像中提取rootfs而且将其放到磁盘上。若是你的镜像由多层组成,那么在COW文件系统中须要将下载的每一层镜像文件储存在不一样的层中。COW文件系统容许每一层分开存储,这将分层镜像的共享最大化了。容器引擎一般支持不一样类型的容器存储,如overlay、devicemapper、 btrfs、 aufs和 zfs等。
容器运行时
容器引擎将容器镜像下载到容器存储中后,它须要建立一个容器运行时的配置文件。这一配置文件结合了来自调用程序/用户的输入以及容器镜像规范的内容。举个例子,调用程序可能想要对正在运行的容器进行指定的安全性修改、添加环境变量或者将volumes挂载到容器上,这些都是调用程序输入的内容。
容器运行时配置和分解的rootfs一样也被OCI标准化为OCI运行时规范。
最后,容器引擎启动读取运行时规范的容器运行时,修改Linux cgroup、Linux安全约束以及命名空间,而且启动容器命令以建立PID1(Process ID1)。此时,容器引擎能够将stdin / stdout传回调用程序并控制容器(如,中止、启动、附加等)。
请注意,许多新的容器运行时正在让Linux的不一样部分来隔离容器。人们先可使用KVM分离(如迷你虚拟机)运行容器,或者可使用其余hypervisor策略(例如,拦截容器进程中的全部系统调用)。既然咱们已经拥有一个标准的运行时规范,那么就可以经过相同的容器引擎启动这些工具。甚至Windows也可使用OCI运行时规范来启动Windows容器。
容器编排引擎
容器编排引擎,相比其余容器工具而言,则处于更高的级别。容器编排是用于协调多个不一样节点上的容器执行工具。容器编排引擎能够经过与容器引擎通讯以管理容器,如启动容器而且将其网络链接在一块儿。它还可以监控容器以及在负载增长时启动其余容器。
Kubernetes是目前使用最为普遍的容器编排引擎,被大量的中小型企业用户用于开发或生产环境,而且已经成为业界公认的容器编排管理的标准框架。可是原生的Kubernetes因其学习曲线陡峭对于大多数开发人员而言很难直接上手使用。Rancher做为一个开源的企业级Kubernetes容器管理平台,其简洁直观的界面风格和操做体验能够极大程度地解决这一问题。而且Rancher实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,能统一纳管位于不一样基础架构上的Kubernetes集群。此外,Rancher也将用户的安全问题放在首位。Kubernetes于8月6日发布新的补丁版本以后,Rancher反应迅速,在1天以后发布了全新版本Rancher 2.2.7,修复了新近的CVE并支持Kubernetes新版本。
访问Rancher Github主页,了解更多新版本信息: