在服务器时代,应用直接跑在服务器上。业务部门想要增长一个新的应用服务,IT部门就须要采购新的服务器服务器来知足需求,而IT部门为了避免让业务因为服务器瓶颈而出现问题,就会采购大幅因为业务需求的服务器。这种作法,致使了公司大量的服务器处于低负荷运行状态下,浪费了大量的资源和资产。git
而虚拟机技术解决了如上的问题,经过虚拟机技术,实现了一个服务器安全稳定运行多个应用。虚拟机是一种有划时代意义的技术,每当业务部门须要增长应用的时候,IT部门直接在空闲的服务器上启动虚拟机就能够部署应用了,从而大大增长了服务器的利用率,为公司节省了大量资金。github
虚拟机技术也有本身的缺点,最大缺点为每一个虚拟机必须拥有本身独立的完整操做系统,而操做系统自己会占用额外的cpu,内存和存储资源。而且,每一个操做系统自己须要许可证,打补丁,监控等,从而增长了运营成本。虚拟机技术也面临启动速度慢,跨平台移植性差的挑战。安全
容器技术能够很好的解决虚拟机的缺点,能够把服务跑在容器中解决虚拟机模型的缺点。对比虚拟机主要区别在于容器运行不须要独占一个完整的操做系统。运行在同一主机的容器能够共享主机上的操做系统,这样就节省了大量的cpu,内存和存储资源。容器也不须要许可证和打补丁,下降了运营和资金成本。服务器
现代的容器技术起源于Linux,是不少人长期努力持续贡献的产 物。对容器发展影响比较大的技术包括内核命名空间 (Kernel Namespace) 、控制组(Control Group) 、联合文件系统 (Union File System) ,固然更少不了Docker。因为容器技术的复杂性,阻碍了其大规模发展,而Docker技术的出现,使容器使用变的简单,促使了容器的广泛应用。网络
Docker是一种运行于Linux和Windows上的容器平台,用于建立、管理和编排容器。Docker是在GitHub上开发的Moby开源项目的一部分。 Docker公司,位于旧金山,是整个Moby开源项目的维护者。Docker公司还提供包含支持服务的商业版本的Docker。架构
Kubernetes做为容器编排领域的老大,已经采用Docker做为其默认容器运行时 (container runtime),包括Kubernetes启动和中止容器,以及镜像的拉取等。app
1,部署简单易用,开发团队能够独立轻易的变动基础环境。
2,测试时的镜像环境就是最终产品运行的服务端环境,增长了测试可靠性。
3,一旦Docker镜像构建成功,咱们就会在交付的各个阶段都是用这个镜像,这就提升了交付的可靠性。框架
1,减小维护应用运行环境的工做量。环境是自动建立的,所以更少的人为操做是有必要的。
2,在多态服务器上手工搭建相同环境是很容易出错并且让人崩溃的。使用Docker的话就能够很轻松地建立一个环境的多个实例,由于咱们最终只须要在服务端运行这个实例镜像。这种方式也能够很轻松将将来的多个节点添加到集群中进行水平扩展。
3,轻松更新现有的应用和环境。运维
1,当咱们想要持续交付时,咱们须要为交付的各个阶段建立大量的环境实例(提交阶段,验收阶段,容量测试,预生产和生产环境),使用物理机器来达到这个目的时不划算的。
2,安装应用和必要的基础设施变得至关简单,由于咱们老是从一个空的image开始配置的,不容易出错。socket
1,启动一个Docker容器远比启动一个虚拟机快得多,由于不须要启动一个操做系统,较少了开销。
2,几个容器共享主机操做系统的内核,可是有本身的文件系统、用户、网络和进程。从主机操做系统角度来看,当咱们运行Docker容器时,咱们就是在运行另外一个进程。这显著加速了容器的启动,同时仍然为各个容器提供了良好的隔离。
3,跨平台移植性好
1,容器技术自己比较复杂,好比容器管理、编排、应用打包、容器间的网络、数据快照等技术原理是复杂的。
2,同一个主机上跑的全部容器因为共用一个操做系统,例如kernel出现bug,则影响全部容器。
3,管理大量的容器比较麻烦,咱们须要依赖kubernetes这种编排工具进行管理。
1,快速部署或者扩容
2,多租户管理
3,整合服务器资源,提升利用率
4,提供开发效率,开发测试部署环境彻底同样
5,简化了配置。同一个Docker的配置能够在不通环境中使用,下降了硬件和应用环境之间的耦合性
6,完美支持CI/CD
7,无缝支持微服务架构
内核命名空间属于容器技术中的核心,该技术可以将操做系统进行拆分,使一个操做系统看起来像多个互相独立的操做系统同样。好比能够实如今相同的操做系统上运行多个Web服务,同时还不存在端口冲突的问题。该技术还容许多个应用运行在相同操做系统上而且不存在竞争,同时还能共享配置文件以及类库。
Linux Docker如今利用了下列内核命名空间:
Docker使用PID命名空间为每一个容器提供互相独立的容器树。每一个容器都拥有本身的进程树,意味着每一个容器都有本身的PID为1的进程。PID命名空间也意味着容器不能看到其余容器的进程树,或者其所在主机的进程树。
Docker使用NET命名空间为每一个容器提供互相隔离的网络栈。网络栈中包括接口、IP地址、端口地址以及路由表。例如:每一个容器都有本身的eth0网络接口,而且有本身独立的IP和端口地址。
每一个容器都有互相隔离的根目录/。这意味着每一个容器都有本身的/etc 、/var 、/dev 等目录。容器内的进程不能访问Linux主机上的目录,或者其余容器的目录,只能访问本身 容器的独立挂载命名空间。
IPC全称 Inter-Process Communication,是Unix/Linux下进程间通讯的一种方式,IPC有共享内存、信号量、消息队列等方法。因此,为了隔离,咱们也须要把IPC给隔离开来,这样,只有在同一个Namespace下的进程才能相互通讯。Docker使用IPC命名空间在容器内提供共享内存,IPC 提供的共享内存在不一样容器间也是互相独立的。
Docker容许用户使用USER命名空间将容器内用户映射到Linux主机不一样的用户上。常见的例子就是将容器内的root用户映射到Linux主机的非root用户上。用户命名空间对于Docker来讲还属于新生事物且非必选项。该部份内容在将来可能出现改变。
UTS全称UNIX Time-sharing System,Docker使用UTS命名空间为每一个容器提供本身的主机名称。
CGroup用于限额。因为再Docker环境中,容器之间是互相隔离的,单却共享操做系统资源,能够经过CGroup限制单个容器的cpu,内存,存储io等资源的使用量。
Capability机制是在Linux内核2.2以后引入,它将root用户的权限细分为多个,能够分别启用或者禁用,例如:
CAP_CHOWN :容许用户修改文件全部权。 CAP_NET_BIND_SERVICE :容许用户将socket绑定到系统端口号。 CAP_SETUID :容许用户提高进程优先级。 CAP_SYS_BOOT :容许用户重启系统。
Docker采用Capability机制来实现用户在以root身份运行容器的同 时,还能移除非必须的root能力。
数据主要分为两类:持久化和非持久化数据。持久化数据是须要保 存的,而非持久化数据不须要。默认状况下,全部容器都有与自身声明周期相同的非持久化存储——本地存储,它很是适用于非持久化数据。 可是,若是容器须要建立长期保存的数据,最好将数据存储到Docker卷中。
非持久化存储就是容器的本地存储,每一个容器启动都会自动分配本地存储,默认状况这里存放了所有文件和文件系统。容器使用镜像来运行,镜像包含了要运行的服务和须要的基础组件,镜像中的东西也要运行在容器本地存储中,而Docker镜像由一些松耦合的只读镜像层组成,因此本地存储使用的存储引擎须要能管理使用这些镜像层。
Docker经过存储引擎(新版本采用快照机制)的方式来实现镜像层,并保证多镜像层对外展现为统一的文件系统。Linux上可用的存储引擎有AUFS 、Overlay2 、Device Mapper 、Btrfs以及ZFS。
持久化存储的方式通常使用存储卷,用户建立卷,而后建立容器,接着将卷挂载到容器上。卷会挂载到容器文件系统的某个目录之下,任何写到该目录下的内容都会写到卷中。即便容器被删除,卷与其上面的数据仍然存在。
目前,Docker支持几十种卷插件,涵盖了块存储,文件存储,对象存储等。
Docker网络架构源自一种叫做容器网络模型(CNM)的方案,该 方案是开源的而且支持插接式链接。Libnetwork是Docker对CNM的一种实现,提供了Docker核心网络架构的所有功能。不一样的驱动能够经过插拔的方式接入Libnetwork来提供定制化的网络拓扑。
为了实现开箱即用的效果,Docker封装了一系列本地驱动,覆盖了 大部分常见的网络需求。其中包括单机桥接网络(Single-Host Bridge Network)、多机覆盖网络(Multi-Host Overlay),而且支持接入现有VLAN。Docker生态系统中的合做伙伴经过提供驱动的方式,进一步拓展了Docker的网络功能。
Open Container initiative(开放容器倡议)是一个旨在对容器基础架构中的基础组件进行标准化的管理委员会。
这个标准是怎么来的呢?因为CoreOS的公司不喜欢Docker的某些行事方式。所以它就建立了一个新的开源标准,称做“appc”,该标准涉及诸如镜像格式和容器运行时等方面。此外它还开发了一个名为rkt的实现,这让容器生态处于分裂的危险中。故在相关方沟通下,共同成立了OCI——一个旨在管理容器标准的轻量级的、敏捷型的委员会。OCI已经发布了两份规范,而Docker的运行时组件runc就是OCI容器运行时标准的参考实现。标准以下:
1,镜像规范:定义镜像的组织结构
the Runtime Specification (runtime-spec)[http://www.github.com/opencontainers/runtime-spec]
2,运行时规范:定义容器能接收的命令和对应的行为,例如容器的create,start,stop,delete等命令规范。
the Image Specification (image-spec)[http://www.github.com/opencontainers/image-spec]
OCI在Linux基金会的支持下运做,对容器生态规范化产生了极大做用,Docker公司和CoreOS公司都是主要贡献者。
CoreOS的开源的容器运行平台,推出的目的主要是和Dockr作竞争,目前kubernetes内置了Docker和rtk两种容器运行时环境。Docker和Rocket目前都遵循OCI标准,Rocket在兼容性(例如rkt还支持AppC标准)和容器安全方面作的更好,其它安全使用便利行和社区活跃度方面Docker遥遥领先。
LXC (Linux Containters)是一种基于内核容器的用户空间接口,提供了一系列建立、配置、管理的接口,经过这些接口来简单管理容器。LXC出现远早于Docker,通常用于一些容器管理工具的底层实现,社区活跃度比较高。
Kubernetes是Google的一个开源项目,而且开源以后迅速成为容器编 排领域的领头羊,使用Docker做为默认容器运行时。Kubernetes运行在数据中心硬件基础设施之上,对外暴露的是一个资源池,它让咱们部署和运行组件应用的时候不用关注底层,实现了容器或者应用的自动调度,配置,管理和故障处理。
Mesos是一个遵循Apache协议的开源项目,是一个集群管理工具,能够将整个数据中心的资源(包括CPU、内存、存储、网络等)进行抽象和调度,使得多个应用同时运行在集群中分享资源,并没有需关心资源的物理分布状况。
Mesos是以与Linux内核一样的原则而建立的,不一样点仅仅是在于抽象的层面。Mesos内核运行在每个机器上,同时经过 API 为各类应用提供跨数据中心和云的资源管理调度能力。这些应用包括Hadoop、Spark、Kafka、Elastic Search,Cassandra等。还可配合框架Marathon来管理大规模的Docker等容器化应用。
主要有以下特性: