1、什么是容器docker
一、容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序能够在几乎任何地方以相同的方式运行。开发人员在本身的笔记本上建立并测试好的容器,无需任何修改就可以在生产系统的虚拟机、或物理服务器、或公有云主机上运行。数据库
二、容器与虚拟机的异同:ubuntu
容器与虚拟机都是为应用提供封装和隔离。缓存
容器由两部分组成:安全
1)应用程序自己;服务器
2)依赖部分,如应用程序须要的组件库或其余软件;网络
容器在宿主操做系统的用户空间中运行,与操做系统的其余进程隔离,这一点显著区别于虚拟机。架构
传统的虚拟化技术,好比VMWare、KVM,目标均是建立完整的虚拟机。为了运行应用程序,除了部署应用自身及其依赖,还须要安装整个操做系统。运维
二者区别以下图所示:分布式
由图中对比可知,因为全部的容器共享一个宿主操做系统,这使得容器在体积上要比虚拟机小不少。另外,启动容器不须要启动整个操做系统,因此容器部署和启动速度更快,开销也更小,也更容易迁移。
2、为何使用容器
在谈论为何使用容器以前,先看一下以前为何用不着容器。以前的系统,几乎全部的系统均采用三层架构就能够很好的解决使用需求。而当今的系统,须要使用更多的服务,好比MQ、缓存、数据库来构建和组装应用。并且应用程序极可能被部署到不一样的环境,好比虚拟服务器、私有云、公有云上。
因此,对于当今系统一方面应用中包含了多种服务,这些服务有本身所依赖的组件库或软件包;另外一方面存在多种部署环境,应用在运行时可能须要动态迁移到不一样的环境中,如何保证各个服务可以在各类环境中正常运行就是一个很难解决的问题。
借助于运输行业集装箱的启发,Docker将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker能够将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器,容器能够运行在任何操做系统上。
由此可知,使用容器的缘由就是:容器使软件具有了超强的可移植能力。从Docker的标志性图片中,也很形象的表达Docker的思想,像集装箱同样能够方便的运送货物。
3、容器的特性
对于开发人员而言,容器意味着环境隔离和可重复性,开发人员只需为应用建立一次运行环境,而后打包成容器即可以在其余机器上运行。另外,容器环境与所在的宿主系统环境是隔离的,就像虚拟机同样,可是比虚拟机更快更简单。真正实现了Build Once,Run Anywhere(一次运行,处处运行)
对于运维人员而言,只须要配置好标准的运行环境,服务器就能够运行任何容器。这使得运维人员的工做效率更高,同时也使工做也变得一致和可重复。因而可知,容器消除了开发、测试、生产环境的不一致性。
4、容器生态系统
一谈到容器,你们都会想到Docker,Docker几乎是容器的代名词。确实,是Docker将容器技术发扬光大,同时围绕Docker还有一个生态系统。
容器生态系统包括以下几部分:
一、容器核心技术,就是可以让Container(容器)在宿主系统上运行起来的技术,包括:
1)容器规范
除了Docker以外,还有其余容器,如HeroKu、NodeJitsu。为了保障容器之间能够兼容,Docker、CoreOS、Google等公司成立了OCI组织(Open Container Initiative),制定开放的容器规范。
目前有两种规范:a)Runtime Spec(运行时规范);b)Image Format Spec(镜像规范);这两种规范让不一样组织和厂商开发的容器可以在不一样的容器Runtime上运行,保证了容器的可移植性和互操做性。
2)容器Runtime
容器Runtime是容器真正能够运行的地方,Runtime须要和操做系统kernel紧密协做,为容器提供运行环境。
目前主流的容器Runtime有:
a)lxc:运行于Linux上的容器Runtime,能够运行Docker;
b)runc:是Docker开发的容器Runtime,是如今Docker默认的Runtime;
c)rkt:是CoreOS开发的容器Runtime,能够运行Docker;
3)容器管理工具
容器管理工具对内与Runtime交互,对外为用户提供Interface,好比CLI,可使用户有工具来管理容器,相关工具备:
a)lxd是lxc对应的管理工具;
b)docker engine是对runc的管理工具,该工具包括Deamon和Cli两个部分。对于一般说的Docker,通常指docker engine。
c)rkt cli是rkt的管理工具;
4)容器定义工具
容器定义工具的做用是容许用户定义容器的内容和属性,这样容器就可以被保存,共享和重建。相关工具备:
a)docker image是docker容器的模板,容器runtime依据docker image建立容器;
b)docker file是包含若干命令的文本文件,用于建立出docker image;
c)ACI(App Container Image)与docker image相似,它是由CoreOS开发的rkt容器的image格式;
5)Registry
容器是经过image(镜像)建立的,须要有一个仓库来统一存放image,这些仓库就是Registry。
a)Docker Registry,能够利用Docker Registry构建私有的Registry;
b)Docker Hub:https://hub.docker.com/ 是Docker为公众提供的托管Registry,上面有许多现成的Image;
c)Quay.io:https://quay.io 提供与Docker Hub相似的服务;
6)容器OS
容器OS是专门运行容器的操做系统,与常规OS相比,容器OS一般体积更小,启动更快。由于是为容器定制的OS,一般它们运行容器的效率会更高。
a)CoreOS;
b)atomic;
c)ubuntu core;
二、容器平台技术,可以让容器做为集群在分布式环境中运行。
1)容器编排引擎,基于容器的应用通常会采用微服务架构,在这种架构下,不一样应用被划分红不一样的服务容器集群,集群中的容器会根据业务须要被动态的建立、迁移和销毁。
所谓容器编排,一般包括容器管理、高度、集群定义和服务发现等。经过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。编排引擎分为:
a)swarm:是Docker开发的容器编排引擎;
b)k8s:google开发的开源容器编排引擎,支持Docker和CoreOS;
c)mesos+marathon:mesos是一个通用的集群资源调度平台;二者一块儿提供容器编排引擎功能;
2)容器管理平台,是在容器编排引擎之上的一个更为通用的平台,一般容器管理平台支持多种编排引擎,抽象了编排引擎的底层实现细节,为用户提供更方便的功能。
a)Rancher
b)ContainerShip;
3)基于容器的Paas,它为微服务应用开发人员提供了开发、部署和管理应用的平台,用户没必要关心底层基础设施而专一于应用的开发。
a)Deis;
b)Flynn;
c)Dokku;
三、容器支持技术
1)容器网络
容器的出现使网络拓扑变得更加动态和复杂,用户须要专门的解决方案来管理容器与容器、容器与其余实体之间的连通性和隔离性。
a)Docker Network;
b)Flannel;
c)Weave;
d)Calico;
2)服务发现
在微服务应用中,集群会根据负载的强弱对容器进行动态增减,或者根据宿主资源的不一样进行动态迁移,容器的IP和端口也会发生变化。服务发现就是提供一种让客户端可以知道如何访问容器提供的服务的机制。服务发现会保存容器集群中全部微服务最新的信息,如IP和端口,以向外提供API。
a)etcd;
b)consul;
c)zookeeper;
3)监控
a)docker ps/top/stats;
b)docker stats API;
c)sysdig;
d)cAdvisor/Heapster;
e)Weave Scope;
4)数据管理
容器常常在不一样的宿主之间迁移,须要保证持久化数据也可以动态迁移。
a)Flocker;
5)日志管理
日志为问题排查和事件管理提供了重要依据。
a)docker logs:Docker原生的日志工具;
b)logspout:对日志提供了路由功能,它能够收集不一样容器的日志并转发给其余工具后进行处理;
6)安全性
a)OpenSCAP:它可以对容器镜像进行扫描,发现潜在的漏洞;
你们可关注个人公众号
知识学习来源:CloudMan:《天天5分钟玩转Docker容器技术》