http://segmentfault.com/a/1190000002609286python
Docker 是一个用于开发、交付和执行应用的开放平台,Docker 设计用来更快的交付你的应用程序。Docker 可以将你的应用程序和基础设施层隔离。并且还可以将你的基础设施看成程序同样进行管理。Docker 可以帮助你更块地打包你代码、測试以及部署,并且也可以下降从编写代码到部署执行代码的周期。linux
Docker 将一个轻量级的容器虚拟化平台和一组标准工做流程、工具进行集成,来帮助你方便地管理和部署应用。nginx
核心是,Docker 提供了一种在安全隔离的容器中执行近乎所有应用的方式,这样的隔离性和安全性赞成你在同一主机上同一时候执行多个容器,而容器的这样的轻量级特性,意味着你可以节省不少其它的硬件资源,因为你没必要消耗执行 hypervisor 所需要的额外负载。docker
基于容器虚拟化的工具或者平台可以为你提供例如如下帮助:ubuntu
Docker是开发过程当中较为理想的助手。它赞成你在包括了你的应用和服务的本地容器中进行开发。而后帮你完毕集成和部署。segmentfault
好比,你的开发者可以在本地编写代码而后经过Docker与其它同事共享,当他们完毕了各自的开发任务后,可以将他们的代码推送到一个測试的环境中进行測试,完毕測试后便可以将对应的Docker镜像部署到生产环境中。安全
Docker这样的基于容器的平台具备高度的便携性,它可以无缝地执行于开发人员的本地主机、数据中心其余的物理机或虚拟机、或者云端。bash
Docker的便携性和其自然的轻量特性易于实现动态地负载管理,你可以利用Docker高速地增减应用和服务的部署规模,Docker的速度保证了这样的规模的调整近乎实时。网络
由于Docker轻量并且高速,所以相对于基于Hypervisor的虚拟机的部署方式。Docker提供了一种更可行和划算的替代方案,这对于高密度部署环境尤事实上用,好比在构建私有云或PaaS。固然,当你想在有限的资源里部署不少其它的应用时,Docker对于中小型的部署也很实用。架构
Docker主要包含两个组件:
注:Docker在Apache 2.0开源协议下进行受权。
Docker是Client/Server的架构,Dockerclient与Docker daemon进行交互,daemon负责构建、执行和公布Docker容器。client可以和服务端执行在同一个系统中。也可以链接远程的daemon。Docker的client的daemon经过RESTful API进行socket通讯。
[
就像上图所看到的,Docker守护进程(daemon)在主机上执行,用户不能直接和守护进程打交道,但是可以经过Dockerclient与其进行交互。
Dockerclient——docker
二进制文件的功能之中的一个——是Docker的初始用户界面,它接收用户的命令并反馈,并且与Docker的守护进行交互。
理解Docker的内部机制。你需要明确例如如下三个组件:
Docker镜像是一个仅仅读的模板。好比,一个镜像可以包括安装了Apache Web服务应用的Ubuntu操做系统。镜像可以用来建立Docker容器。
Docker提供了构建新镜像或升级原有镜像的较为便利的方式,或者你也可以下载别人已经建立好的镜像。Docker镜像是Docker的构建组件。
Docker注冊中心用于上传和下载镜像,分为公共注冊中心和私有注冊中心两种。公共注冊中心为Docker Hub,它提供了大量的现成镜像,你可以构建本身的镜像并上传到上面,也可以在上面下载别人构建的镜像。Docker注冊中心是Docker的公布组件。
Docker容器就像是一个目录。它包括了一个应用程序执行所需要的所有内容。
每个容器都是基于Docker镜像构建。
咱们可以执行、開始、中止、迁移或者是删除Docker容器。
每个容器均是一个隔离的、安全的应用平台。Docker容器是Docker的执行组件。
至此,咱们已经知道了:
那咱们看看 Docker 是怎么将这些元素组合在一块儿工做的。
咱们已经知道Docker镜像实质上是一些用于载入Docker容器的仅仅读模板,每个镜像包含很是多层。
Docker利用union file systems将这些层组合为一个镜像。Union file systems赞成相互隔离的文件或文件夹透明的叠加在一块儿。而呈现为一个统一的文件系统。
Docker如此轻量化的缘由也是由于这些层的存在。当你对一个Docker镜像进行改动时——好比将一个应用升级为一个新的版本号——会构建一个新的层。所以,与虚拟机的替换整个镜像或全然构建的方式不一样。Docker仅对相关的层进行加入或升级。因此你仅需要公布镜像的更新部分而没必要公布整个镜像,这样的方式使得镜像的公布更加高速和简单。
每个镜像始于一个基础镜像,好比:ubuntu
即是一个基础的Ubuntu镜像,fedora
是一个基础的Fedora镜像。
你也可以将你本身制做的镜像做为基础镜像,好比你可以将一个Apache镜像做为一个Web应用的基础镜像。
注意:Docker通常从Docker Hub上获取基础镜像。Docker镜像从这些基础镜像中依照一系列的步骤进行制做。咱们称这些步骤为指令,每个指令在你的镜像中建立一个新的层。指令包含下面行为:
这些指令存储在Dockerfile
中。Docker在构建镜像过程当中读取这个Dockerfile
,执行里面的指令并返回终于的镜像。
Docker注冊中心是Docker镜像的存储中心,当你构建完一个镜像后便可以将其推送到Docker Hub或你本身的注冊中心。
利用Dockerclient,你可以搜索已经公布的镜像,而后将其拉取到你的Docker主机上,以便于基于这些镜像构建容器。
Docker Hub为镜像提供了公共的和私有的存储空间。
公共的存储空间不论什么人均可以在上面搜索和下载,私有存储空间仅对你本人或你的团队开放搜索以及拉取下载。你可以经过这里注冊一个私有的存储空间。
一个容器包含操做系统、用户加入的文件以及相关的元数据。咱们知道,每个容器都是从镜像中构建出来的,这个镜像告诉Docker容器用到什么资源、当容器载入时启动哪一个进程以及容器启动时的其余配置。Docker镜像是仅仅读的。当Docker从一个镜像执行一个容器时。它会在镜像的上层加入一个用于执行应用的可读写的层(利用的就是上文提到的union file system)。
不管是经过Docker命令仍是API调用的方式。Dockerclient都会通知Docker的守护进程执行一个容器。
sudo docker run -i -t ubuntu /bin/bash
咱们来看一下这个命令,Dockerclient利用docker
命令并结合run
选项来启动一个容器,一个最小配置的Dockerclient执行一个容器需要告诉Docker守护进程下面事项:
ubuntu
——一个基础的Ubuntu镜像;/bin/bash
——在容器中启动一个Bash Shell。那么咱们看看执行上述命令时究竟发生了什么?
依照顺序,Docker依次干了例如如下事情:
ubuntu
镜像 : Docker首先检查一下ubuntu
镜像在本地server上存不存在。假设不存在。则本身主动从Docker Hub中下载。假设已经存在则直接利用这个镜像来启动一个新的容器。现在你已经执行了一个容器,这样你便可以管理你的容器、与应用程序进行交互。当执行结束是中止或者删除你的容器。
Docker是用Go语言实现的。用到了一些Linux内核的特性实现上述功能。
Docker在为容器提供一个隔离的工做空间时。用到了命名空间
的技术,当你执行一个容器时,Docker会为此容器建立一组命名空间。
这样便可以提供一个隔离的层:每个容器执行在本身的命名空间中,而外部不能訪问这个层。
Docker用到的一些命名空间有:
pid
命名空间: 用于隔离进程(PID:Process ID)。net
命名空间: 用于管理网络;ipc
命名空间: 用于訪问IPC资源(IPC:InterProcess Communication);mnt
命名空间: 用于管理挂载点(MNT:Mount);uts
命名空间: 用于隔离内核和版本号标识(UTS:Unix Timesharing System)。 Docker还用到了另一项技术叫cgroups
或者叫控制组(control groups)。实现程序执行环境的隔离的关键在于使这些程序仅仅用到它们需要的资源,这就行保证这些容器是主机服务环境小社会中的好市民。控制组赞成Docker在不一样的容器之间共享硬件资源,需要时加入一些限制和约束,好比限制一个容器最大訪问内存量。
统一文件系统或者说是UnionFS,是建立层的时候用到的文件系统,使文件系统很轻量和高速。Docker使用统一文件系统为容器构建blocks,Docker可以使用几种不一样的文件系统:AUFS、btrfs、vfs以及DeviceMapper。
Docker容器将这些组件合并在一块儿,咱们称之为容器格式,容器的缺省格式称为libcontainer
。Docker还支持利用LXC技术的传统Linux容器格式,将来还将会支持其余的容器格式。好比:与BSD Jails或者Solaris Zones实现整合。
原文连接:Understanding Docker(翻译:deerlux 校对:李颖杰)
译者介绍:deerlux@163.com,现就任于一家军工科研机构,深度的技术控、Linux控、python控。