传说中IT界有一名叫做伍六七的『刀客』

Docker 是PaaS提供商 dotCloud 开源的一个基于LXC的高级容器引擎,源代码托管在GitHub 上, 基于Go语言并遵从Apache2.0协议开源。


Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的支持, 就连 Google 的 Compute Engine 也支持 docker 在其之上运行。


“Future proof your Windows apps and drive continuous innovation”(未来证明你的Windows应用程序和驱动不断创新)——官网

>>>> What is Docker?

Docker 是一个开源的平台,设计目标是可以方便开发,方便部署和方便执行应用。

Docker 是凭借一个轻量级容器的虚拟化平台工作流和相关工具来达到上述功能的,并且使用这个轻量化容器来帮助你管理和部署应用。

使用Docker提供的工具和虚拟化平台,你可以完成以下事情:

  1、将你的应用或者组件部署到容器中。

  2、将你的容器分发给你的团队进行下一步的开发或者测试

  3、将你开发的应用部署到发布环境中,无论这些环境是本地模式或者云模式。



>>>> What can I use Docker for?

  1、快速分发应用

  Docker可以帮助你把控开发各个周期。Docker允许你在本地的开发环境中进行代码开发,然后将开发好的应用整合到团队的开发流程中。

  2、方便部署和易于管理

  Docker基于容器的机制可以很容易进行部署。Docker容器可以在本地主机上面执行,也可以在虚拟机中执行,不论这些虚拟机是在本地或者云中。

  Docker快速部署和轻量级的特性也使得管理负载变得很容易。你可以快速启动或者销毁容器。这种时间几乎是实时的。

  3、可以执行大量的工作负载

  因为Docker具有便于部署和快速启停的方式,同时docker也提供了可行的,符合效益-成本的虚拟机管理机制。使得docker很适合负载要求高的环境。比如:将你的云平台作为PAAS用途时,或者你要求你的环境具有高资源使用率时。

Docker主要有两个组件:

Docker:开源的容器虚拟化平台

Docker Hub:一个Software-as-a-Service平台,用来共享和管理docker容器。

What is Docker's architecture?

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的返回数据展现出来。

Inside Docker

为了深入理解docker的内部机制,需要了解以下三个组件:

  • Docker images.(镜像)

  • Docker registries.(仓库)

  • Docker containers.(容器)

Docker images

Docker image是一个只读类型的模板。比如一个镜像可以是一个包含apache和你的web应用的ubuntu操作系统。我们经常使用镜像来创建容器。Docker提供了一种快捷的方式来构建新镜像或者更新镜像,同时你也可以下载其他人已经创建好的镜像。Docker image是Docker结构中的构建组件。

Docker Registries

Docker registries用来保存镜像。它分为公开仓库和私有仓库,你可以从仓库中上传或者下载镜像。公开的Docker 仓库称之为"Docker Hub".它提供了你可以使用的非常多的镜像。你可以自由的创建镜像或者使用这里面其他人已经创建好的镜像。Docker registries属于Docker中的分发组件。

Docker containers

Docker containers同目录有几分相似。Docker containers保存了执行应用所需的所有资源。每一个Docker containers都是由image创建的。Docker containers可以run, started, stopped, moved, and deleted。需要注意的是,Docker containers之间是隔离的。Docker containers属于Docker中的执行组件。

How dose Docker work?

1、创建一个包含你需要执行应用的镜像。

2、根据这个镜像,你可以创建一个容器。

3、你可以将这个容器上传到仓库中提供给其他人使用。

下面,我们看一下如何执行Docker。

我们知道Docker containers启动时所以来的Docker images其实是一个只读性质的模板。每个模板都包含若干层。Docker采取了union file s ystems的机制将这些曾聚合为一个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)。基本的步骤如下:

  • Run a command.

  • Add a file or directory.

  • Create an environment variable.

  • What process to run when launching a container from this image.

这些命令可以再Dockerfile中定义。当你需要新建一个image是,docker可以自动读取Dockerfile中的命令,并且执行这些命令。最终生成一个新的image。

How does a Docker registry work?

Docker registry是用来保存images的。当你新建好image后,就可以将image上传到Dock Hub或者你私有的store中。

借助于Docker client,你可以在Dock Hub检索你所需的image,同时将这些image下载到本地。

同时Dock Hub也提供公开和私有两种模式,处于公开模式下的image,所有人都可以下载和使用这些image。而处于私有模式下的image,只有本人或者经过授权后的人才能下载并且使用这些image。

How does a container work?

一个标准容器包括:操作系统,用户自定义的文件和原数据。正如我们所知的那样,每个容器都是由image所创建的。image告诉docker,这个容器运行时,应该有哪些进程和应该有哪些配置参数。因为image是只读的,所以容器在运行时会在image原有层的基础上面创建一些可读可写的新层。而你的应用运行所需的数据将会被记录到这些数据层中。

What happens when you run a contaniner?

不论是使用docker程序或者API,docker client都会通知docker daemon如何操作容器。

当我们执行如下命令时:

$ docker run -i -t ubuntu /bin/bash

docker client会启动,然后使用后面的run参数来通知docker daemon启动一个新容器。这个简短的命令将会通知docker daemon以下信息:

1、容器所需的image在哪里,这里image名称是ubuntu,是一个base image。

2、当容器启动时,你想让容器初始化的动作,这里我们需要容器启动时自动切换到/bin/bash下面。

所以当我们敲下回车后,docker将会如何处理呢?

  • Pulls the ubuntu image:Docker 检测image是否存在,如果本地不存在,则默认从Dock Hub下载。如果本地存在,则使用本地的image启动容器。

  • Creates a new container:Docker加载image,然后创建容器。

  • Allocates a filesystem and mounts a read-write layer:容器开始创建文件系统,并且在image上面添加可读可写的数据层。

  • Allocates a network / bridge interface:Docker开始创建网络接口,并且允许容器同主机进行关联。

  • Sets up an IP address:Docker从IP资源池中挑选一个分配给容器。

  • Executes a process that you specify:Docker开始执行指定的应用或者命令

  • Captures and provides application output:Docker将执行过程当中的输出或者错误信息返回给Client。让用户可以知道当前应用执行的情况。

  • 以上是容器的执行过程,下面我们将开始描述如何管理容器,包括:结束,停止和移除。

    The underlying technology

    Docker 底层使用的是Linux内核中的虚拟化技术,来呈现我们刚才所看到的一切功能。

    Namespaces

    Docker采用了称之为"Namespaces"的技术解决方案来隔离不同的workspace(也就是上面所定义的容器)。当你执行一个容器时,docker会为这个容器创建一系列的namespace。

    以下是docker所创建的namespace:

  • The pid namespace: 用来隔离进程。(PID就是process id)

  • The net namespace: 用来管理网络接口

  • The ipc namespace: 用来控制IPC资源的访问。

  • The mnt namespace: 用来管理挂载点(mnt是 mount point)

  • The uts namespace: 用来隔离内核和版本信息(UTS,分时复用系统 Unix Timesharing System)

  • Control groups

    Docker同时也采用了一种称之为"cgroups"的技术来控制group。不同应用之间隔离的关键在于,每个应用只能访问属于自己的资源。这样才能确保主机上面同时存在多个用户。Cgroups可以确保docker将可用的硬件资源共享给所有容器,并且可以在必要时间,对容器限制硬件资源。例如可以限制每个容器可以访问的内存容量。

    Union file systems

    Union file systems 或者称为"UnionFS"是docker在创建层时采用的文件系统。这种文件系统使docker变得很轻量级并且执行速度很快。Docker使用UnionFS为容器提供相对应的数据块(data blocks)。Docker可以使用多种类型的UnionFS,比如:AUFS, btrfs, vfs, and DeviceMapper.

    Container format

    Docker将上面我们所描述的各种组件封装成container数据类型(我们就称其为容器)。默认的容器类型是libcontainer。Docker同样也支持传统Linux使用LXC实现的容器类型。再未来,Docker也将支持其他类型的容器,比如:BSD Jails 或者Solaris Zones 版本的容器类型。



    本文参考资料:

    https://www.cnblogs.com/vikings-blog/p/3958091.html

    翻译自

    Docker官方文档

     Vikings翻译

    封面自百度

    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 159,015评论 4 362
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 67,262评论 1 292
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 108,727评论 0 243
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 43,986评论 0 205
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 52,363评论 3 287
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 40,610评论 1 219
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 31,871评论 2 312
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 30,582评论 0 198
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 34,297评论 1 242
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 30,551评论 2 246
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 32,053评论 1 260
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 28,385评论 2 253
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 33,035评论 3 236
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 26,079评论 0 8
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 26,841评论 0 195
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 35,648评论 2 274
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 35,550评论 2 270

    推荐阅读更多精彩内容

    • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
      R_X阅读 4,343评论 0 27
    • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
      ahohoho阅读 15,418评论 15 147
    • 一个老妇人,她得了急病,当然,即便她不得病,也并不是说一切都会美好起来。 只是这疾病更加深了她悲惨的痛苦,她的半个...
      沐阳燕阅读 351评论 1 3
    • 有时我们身处闹市中依然能够专心做自己想做的事,而且不会受影响,就好像自己是在只有自己在里面的空间里。有时明明...
      疯铃猫阅读 682评论 0 1
    • 当时碧水花红 柳绿何人已俱成往事...
      Dy_cace阅读 247评论 0 3