Docker的思想来自于集装箱
。
集装箱解决了什么问题?在一艘大船上,能够把货物规整的摆放起来。而且各类各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不须要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就能够用一艘大船把他们都运走。
但是这个箱子为何这么神奇呢?无非就是两个字:标准。git
是的!标准!标准!标准!web
按照这个思路,docker 其实跟集装箱同样,或者说它想跟集装箱同样,成为“标准化”。
这就是 docker 的实质:标准化。sql
Docker带来了哪些好处docker
粗略来讲,Docker好处有:数据库
1.保证了线上线下环境的一致性
。咱们在线下的开发环境使用Docker构建好weaapp的镜像后,能够直接在线上使用一个镜像,保证了线上线下环境的一致性,不再会有在线下开发环境中运行正常,而部署到线上各类错误了。编程
2.极大的简化了webapp的部署流程
。在不使用Docker时,咱们部署app时,要先搭建好app运行所需环境,这个过程作过的人都知道多么枯燥繁琐,一不当心还出错。而有了Docker,咱们只须要直接构建一个咱们webapp的镜像而后将其运行便可,不管在多少台服务器中部署,都是如此。再好比,使用Docker以前要搭建一个WordPress对于新手来讲是有些困难的,而有了Docker,只须要从DockerHub上pull一个WordPress镜像并启动就能够了,很是很是方便。ubuntu
3.实现了沙盒机制,提升了安全性
。因为webapp运行在容器中,与操做系统隔离开了,从而使操做系统基本不可能受到破坏,另外若是webapp由于攻击而瘫痪,并不须要重启服务器,直接重启容器或者再启动一个镜像就能够了。segmentfault
4.实现了模块化,提升了复用性
。在二中使用Docker的第二种方式就能够看出,咱们将数据库和Tomcat运行在不一样的容器中,从某种角度来讲,这也下降了模块之间的耦合性,便于拓展。好比咱们要把MySQL替换为oracle,只须要再构建一个oracle镜像并启动与Tomcat链接便可,很是方便。对于咱们构建的镜像,在其余app中直接拿来用就能够了,没必要重复劳动。api
设想一个以下场景:安全
咱们须要一个webapp,其功能是用户注册并将注册信息插入到数据库,环境为Ubuntu+Tomcat+Mysql,怎么作?不使用Docker的话,咱们一般会这样作,以Ubuntu为操做系统,而后安装Tomcat和MySQL,最后把app部署上就能够了。那么使用Docker会怎么作呢,在这个场景下,能够有两种方式:1.仍然以Ubuntu为操做系统,而后构建一个安装有MySQL和Tomcat的Docker镜像,并把app部署到其中,最后启动Docker镜像就能够了。看起来好像和不使用Docker基本相同,甚至还要麻烦一些,是这样吗?别着急,继续往下看。2.第二种方式则体现了Docker的"每一个容器只作一件事情"的思想,咱们构建两个镜像,一个仅安装Tomcat并部署咱们的app,另外一个仅安装MySQL,而后启动这两个镜像,获得两个容器,再利用Docker的容器互联技术将两者链接(Docker的容器是经过http链接的)。
5.实现了虚拟化,提升硬件利用率
。有了Docker,咱们能够在一台服务器上运行不少webapp,充分利用闲置资源。这时候,服务器的操做系统就相似于货轮,而一个个Docker容器就至关于货轮上的一个个集装箱。如今大热的云服务市场,很多就用了Docker。举个例子来讲,如今咱们有一台操做系统为Ubuntu14.04的服务器,咱们构建不一样版本的ubuntu镜像并启动,而且为不一样的用户分配不一样的容器。这样,用一台服务器能够虚拟出n个运行着不一样操做系统的虚拟服务器,而对于用户来讲,这些是透明的––用户则认为本身拥有一台完整的服务器。据我推测,阿里云的服务器就是这么干的。这充分利用了闲置的硬件资源。
总结:
Docker背后的想法是建立软件程序可移植的轻量级容器,让其能够在任何安装了Docker的机器上运行,并不用关心底层操做系统,就像野心勃勃的造船者们成功建立了集装箱而不须要考虑装在哪一种船舶上同样。
只有一个共同目标:简化部署流程,提升生产力!
Docker基于LXC(Linux容器),在LXC的基础上进一步封装,使得操做更简单,就像操做一个轻量级的虚拟机同样。
先上图,vm与docker框架,直观上来说vm多了一层guest OS,同时Hypervisor会对硬件资源进行虚拟化,docker直接使用硬件资源,因此资源利用率相对docker低也是比较容易理解的
一个IBM测试案例,关于计算能力的,对于kvm为何会有这么大的性能损失,一方面是由于虚拟机增长了一层虚拟硬件层,运行在虚拟机上的应用程序在进行数值计算时是运行在Hypervisor虚拟的CPU上的;另一方面是因为计算程序自己的特性致使的差别。虚拟机虚拟的cpu架构不一样于实际cpu架构,数值计算程序通常针对特定的cpu架构有必定的优化措施,虚拟化使这些措施做废,甚至起到反效果。
总结:
集装箱:程序部署,保证运行环境不会出错。
标准化:
(1)运输方式:QQ/邮件==>>从仓库(hub.docker.com)获取。
(2)存储方式:应用程序。
(3)API接口:REST api接口,统一控制全部应用。
隔离:Linux内核限制机制LXC。LXC是一种内核虚拟化技术,能够提供轻量级的虚拟化,以便隔离进程和资源。
Docker使用C/S
架构,经过docker客户端链接到Docker服务器上从而管理Docker服务器里面的镜像和容器,相似于git的架构。
三个Docker基本概念
Image(镜像):相似于模板,包含软件运行环境和代码。
例如包含完整的CentOS系统,并安装了JRE。镜像用于建立Docker容器,镜像自己是只读
的。
Container(容器):Docker利用容器来运行应用,容器是从镜像建立的运行实例。它能够被启动、中止、删除,每一个容器相互隔离。
Repository(仓库): 几种存放Docker镜像的场所。最大的仓库未Dockey Hub,国内网易蜂巢:https://c.163.com等。一个仓库包含多个镜像。仓库能够分为私有和共有。私有的仓库能够push和pull。仓库注册服务器(Registry)每每包含多个仓库。
Build-构建镜像 - 集装箱 - 镜像
Ship-运输镜像(从仓库和咱们的主机上运输)- 码头 - 仓库
Run- 运行镜像(运行的镜像就是一个容器,能够当成一个“虚拟机”
) - 运行程序的地方 - 容器
docker镜像文件都是只读的,只有最上层是能够写
容器的本质是一个进程。
Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着全部的容器。docker客户端则扮演着docker服务端的远程控制器,能够用来控制docker的服务端进程。大部分状况下,docker服务端和客户端运行在一台机器上。
检查docker的版本,这样能够用来确认docker服务在运行并可经过客户端连接。
$docker version
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 以后配置 国内镜像加速。
1.进入http://dev.aliyun.com
2.登陆阿里云进入后台
点击 Apply&Restart 后 Docker 就会重启并应用配置的镜像地址了
配置加速器以后,若是拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info
,若是从结果中看到了以下内容,说明配置成功。