如下均翻译自Docker官方文档 ,转载请注明:Vikings翻译。web
Docker 是一个开源的平台,设计目标是能够方便开发,方便部署和方便执行应用。使用docker能够快速分发开发好的应用。借助于Docker,你能够将开发平台和应用分离开,而且像管理应用同样管理开发平台。Docker能够帮助你快速开发应用,快速测试应用,快速部署应用,而且缩短开发代码和执行代码之间的周期间隔。docker
Docker 是凭借一个轻量级容器的虚拟化平台工做流和相关工具来达到上述功能的,而且使用这个轻量化容器来帮助你管理和部署应用。apache
在Docker核心层,它提供了一种方式来让各类应用运行在各个隔离的容器中。这种方式容许docker同一时间在同一台主机上面运行若干个容器。这种轻量级的容器运行方式,几乎没有额外的运行开销。这意味着你能够充分使用主句的硬件能力。ubuntu
使用Docker提供的工具和虚拟化平台,你能够完成如下事情:bash
一、将你的应用或者组件部署到容器中。网络
二、将你的容器分发给你的团队进行下一步的开发或者测试app
三、将你开发的应用部署到发布环境中,不管这些环境是本地模式或者云模式。ide
一、快速分发应用工具
Docker能够帮助你把控开发各个周期。Docker容许你在本地的开发环境中进行代码开发,而后将开发好的应用整合到团队的开发流程中。测试
好比:你能够再本地编写代码,当编写完成后。你将代码开发堆栈信息共享给团队成员。当他们也编写完成后,一样共享开发堆栈信息。而后再测试环境中,使用团队共享的开发堆栈就能够进行所须要的测试了。当完成测试后,团队就能够将测试经过的docker镜像(images)发布到产品环境中。
二、方便部署和易于管理
Docker基于容器的机制能够很容易进行部署。Docker容器能够在本地主机上面执行,也能够在虚拟机中执行,不论这些虚拟机是在本地或者云中。
Docker快速部署和轻量级的特性也使得管理负载变得很容易。你能够快速启动或者销毁容器。这种时间几乎是实时的。
三、能够执行大量的工做负载
由于Docker具备便于部署和快速启停的方式,同时docker也提供了可行的,符合效益-成本的虚拟机管理机制。使得docker很适合负载要求高的环境。好比:将你的云平台做为PAAS用途时,或者你要求你的环境具备高资源使用率时。
Docker主要有两个组件:
Docker:开源的容器虚拟化平台
Docker Hub:一个Software-as-a-Service平台,用来共享和管理docker容器。
Docker采起的C-S结构。Docker client同Docker daemon通信,Docker daemon负责维护docker 容器的构建,运行和分发。
Client和Daemon能够再同一台主机上面执行,也能够分开执行。本地的client能够链接远程的daemon。Client能够经过socker或者REST API同daemon通信。
如上图所示,daemon在主机上面执行。用户只能经过client同daemon通信。
Docker client是用户与Docker之间的重要接口。它从用户那里接受命令,而且将daemon的返回数据展示出来。
为了深刻理解docker的内部机制,须要了解如下三个组件:
Docker image是一个只读类型的模板。好比一个镜像能够是一个包含apache和你的web应用的ubuntu操做系统。咱们常用镜像来建立容器。Docker提供了一种快捷的方式来构建新镜像或者更新镜像,同时你也能够下载其余人已经建立好的镜像。Docker image是Docker结构中的构建组件。
Docker registries用来保存镜像。它分为公开仓库和私有仓库,你能够从仓库中上传或者下载镜像。公开的Docker 仓库称之为"Docker Hub".它提供了你可使用的很是多的镜像。你能够自由的建立镜像或者使用这里面其余人已经建立好的镜像。Docker registries属于Docker中的分发组件。
Docker containers同目录有几分类似。Docker containers保存了执行应用所需的全部资源。每个Docker containers都是由image建立的。Docker containers能够run, started, stopped, moved, and deleted。须要注意的是,Docker containers之间是隔离的。Docker containers属于Docker中的执行组件。
目前为止,咱们已经能够完成如下几个工做:
一、建立一个包含你须要执行应用的镜像。
二、根据这个镜像,你能够建立一个容器。
三、你能够将这个容器上传到仓库中提供给其余人使用。
下面,咱们看一下如何执行Docker。
咱们知道Docker containers启动时因此来的Docker images实际上是一个只读性质的模板。每一个模板都包含若干层。Docker采起了union file systems 的机制将这些曾聚合为一个image。Union file systems 容许物理隔离的文件或者目录,相互重叠覆盖,造成线性的文件系统。
Docker也正是基于上述层的实现方式而作到了轻量级。当你修改一个image时,docker并无修改原有的image数据,而是新建了一个数据层。当你在docker中修改整个image或者重建实体时,原有数据都没有变化,只是若干层发生了变化。因此当image发生了变化时,不须要从新同步整个image,而只要将发生变化的层同步一次就能够。这样就使docker image作的快速而且简单。
每一个image都是从base image演变过来的。你能够建立你的base image。若是你有apache的image,就能够把这个镜像做为你应用程序的base image。
Note:Docker 通常都是从Dock Hub上面获取base images。
Docker经过一些很简单的步骤就能够依据base images建立新的image。每执行一个步骤,新的image就会建立一个新层(layer)。基本的步骤以下:
这些命令能够再Dockerfile中定义。当你须要新建一个image是,docker能够自动读取Dockerfile中的命令,而且执行这些命令。最终生成一个新的image。
Docker registry是用来保存images的。当你新建好image后,就能够将image上传到Dock Hub或者你私有的store中。
借助于Docker client,你能够在Dock Hub检索你所需的image,同时将这些image下载到本地。
同时Dock Hub也提供公开和私有两种模式,处于公开模式下的image,全部人均可如下载和使用这些image。而处于私有模式下的image,只有本人或者通过受权后的人才能下载而且使用这些image。
一个标准容器包括:操做系统,用户自定义的文件和原数据。正如咱们所知的那样,每一个容器都是由image所建立的。image告诉docker,这个容器运行时,应该有哪些进程和应该有哪些配置参数。由于image是只读的,因此容器在运行时会在image原有层的基础上面建立一些可读可写的新层。而你的应用运行所需的数据将会被记录到这些数据层中。
不管是使用docker程序或者API,docker client都会通知docker daemon如何操做容器。
当咱们执行以下命令时:
$ docker run -i -t ubuntu /bin/bash
docker client会启动,而后使用后面的run参数来通知docker daemon启动一个新容器。这个简短的命令将会通知docker daemon如下信息:
一、容器所需的image在哪里,这里image名称是ubuntu,是一个base image。
二、当容器启动时,你想让容器初始化的动做,这里咱们须要容器启动时自动切换到/bin/bash下面。
因此当咱们敲下回车后,docker将会如何处理呢?
ubuntu
image: Docker 检测image是否存在,若是本地不存在,则默认从Dock Hub下载。若是本地存在,则使用本地的image启动容器。以上是容器的执行过程,下面咱们将开始描述如何管理容器,包括:结束,中止和移除。
Docker 底层使用的是Linux内核中的虚拟化技术,来呈现咱们刚才所看到的一切功能。
Docker采用了称之为"Namespaces"的技术解决方案来隔离不一样的workspace(也就是上面所定义的容器)。当你执行一个容器时,docker会为这个容器建立一系列的namespace。
如下是docker所建立的namespace:
pid
namespace: 用来隔离进程。(PID就是process id)net
namespace: 用来管理网络接口ipc
namespace: 用来控制IPC资源的访问。mnt
namespace: 用来管理挂载点(mnt是 mount point)uts
namespace: 用来隔离内核和版本信息(UTS,分时复用系统 Unix Timesharing System)Docker同时也采用了一种称之为"cgroups"的技术来控制group。不一样应用之间隔离的关键在于,每一个应用只能访问属于本身的资源。这样才能确保主机上面同时存在多个用户。Cgroups能够确保docker将可用的硬件资源共享给全部容器,而且能够在必要时间,对容器限制硬件资源。例如能够限制每一个容器能够访问的内存容量。
Union file systems 或者称为"UnionFS"是docker在建立层时采用的文件系统。这种文件系统使docker变得很轻量级而且执行速度很快。Docker使用UnionFS为容器提供相对应的数据块(data blocks)。Docker可使用多种类型的UnionFS,好比:AUFS, btrfs, vfs, and DeviceMapper.
Docker将上面咱们所描述的各类组件封装成container数据类型(咱们就称其为容器)。默认的容器类型是libcontainer。Docker一样也支持传统Linux使用LXC实现的容器类型。再将来,Docker也将支持其余类型的容器,好比:BSD Jails 或者Solaris Zones 版本的容器类型。