Docker概述:什么Docker如此特别,它是如何构建的

   <p>【编者的话】在上一系列介绍中,我们大体地介绍了<a href="/misc/goto?guid=4959665281444030239">CoreOS</a>。在这个系列中我想介绍一下Docker。本文我们看一下为什么Docker如此特别,它是如何构建的。我们会从基本开始介绍,所以读者不必担心自己是刚接触Docker的。<br> <br> <strong><em><a href="/misc/goto?guid=4958971144570564318">@Container容器技术大会将于6月4日在上海光大会展中心国际大酒店举办,来自Rancher、携程、PPTV、蚂蚁金服、京东、浙江移动、海尔电器、唯品会、eBay、道富银行、麻袋理财、土豆网、阿里百川、腾讯游戏、点融网等公司的技术负责人将带来实践经验分享,5月7日之前购票只需438元,欢迎感兴趣的同学抢购。</a></em></strong><br> <br> Docker是一个开源项目,它以基于Linux操作系统级镜像来提供一个抽象的、自动分发的虚拟化附加层,通过该层使得在容器中更加容易打包应用。<br> <br> 容器本身仅是基于Linux的cgroups的一个抽象实现,cgroups是用于监控和限制进程及其子进程占用资源的底层内核结构。Dokcer一开始是采用<a href="/misc/goto?guid=4958826102369325734">LinuX Contrainers</a>(LXC)的,但是后来切换到runC,前者(LXC)以libcontainer被熟知。runC则是跑在跟宿主相同的操作系统,这使得它可以共享很多宿主的操作系统资源,如RAM、CPU、网络等。</p>    <h2>为何Docker如此特别?</h2>    <p>Docker在虚拟的容器环境之上增加一个应用部署引擎。它是一个轻量级但十分强大的关于虚拟化技术的开源容器,在容器中还整合了构建并容器化应用的工作流程。<br> <br> 好处:</p>    <ul>     <li>Docker可以使你迅速地根据组件组合出应用,并消除代码分发过程中遇到的障碍。例如你可以在同一个主机上运行两个应用相同但版本不同的Docker容器。</li>     <li>Docker使你的代码尽可能快的通过测试并部署到生成环境。</li>     <li>Docker难以置信的简单易用。无论是在简易版Linux、OSX,还是Windows主机上都可以开始学习Docker。(Windows需要直接运行兼容Linux内核或者运行Docker镜像的虚拟机),</li>     <li>你可以在几分钟之内容器化你的应用。大多数Docker容器在一秒内即可启动。</li>     <li>Docker容器几乎可以在任何地方运行。你可以在台式机、物理服务器、虚拟机上部署容器到数据中心,上传到公有云和私有云均可。这样,你就可以在任何地方运行完全一样的容器。</li>    </ul>    <p><br> 在我们继续讨论Docker惊艳的容器化特征之前,我们先看一下虚拟机和容器的区别。</p>    <h2>虚拟机和容器的区别</h2>    <p>容器与虚拟机享有相似的资源隔离和分配,但是容器有一套不同的架构方式使得它本身更加便携和高效。我们看下面两个演示二者差别的两个表。</p>    <h3>虚拟机</h3>    <p>每一个虚拟机包括应用、必要的二进制文件和库、完整的客户操作系统,大小总计数十GB。</p>    <p><a href="https://simg.open-open.com/show/4037f791e6b16e9616e74a61ff5eeb57.png" rel="lightbox"><img alt="Docker概述:什么Docker如此特别,它是如何构建的" src="https://simg.open-open.com/show/4037f791e6b16e9616e74a61ff5eeb57.png"></a></p>    <p> </p>    <h3>容器</h3>    <p>容器包括应用和应用的所有依赖,每个容器都使用容器自身选择的发行版本,但是与其他容器共享宿主操作系统的内核。<br> <br> 在宿主操作系统的用户空间内,他们以隔离的进程方式运行。另外,他们并不像客户操作系统正常运行那样运行所有的进程。而且容器也不绑定任何特别的硬件基础设施!Docker容器在任何计算机任何硬件基础设施任何云都可以运行。</p>    <p><a href="https://simg.open-open.com/show/7a8a6d9b79e128a7cdd5a54ccccedf41.png" rel="lightbox"><img alt="Docker概述:什么Docker如此特别,它是如何构建的" src="https://simg.open-open.com/show/7a8a6d9b79e128a7cdd5a54ccccedf41.png"></a></p>    <p><br> 重要的是,虚拟机需要耗时几分钟来启动,而且对资源敏感,然后容器只需要几秒甚至更少时间启动,在资源较少负载过大时也能应付的了。所以,你可以在本地计算机运行很少的几个虚拟机用于开发目的,但是你可以运行很多很多的容器。这可以使你在开发环境中高效的运行应用环境的完整备份。而且,在生成环境中,这些资源节约很容易转化为成本节约。</p>    <h2>容器组件</h2>    <p>Docker容器有一些顶层的组件需要我们先要了解,让我们看一下。</p>    <h3>Docker客户端和服务端</h3>    <p>Docker是C/S应用。</p>    <p><a href="https://simg.open-open.com/show/e18c366fe2486ea3b694f145649452ab.png" rel="lightbox"><img alt="Docker概述:什么Docker如此特别,它是如何构建的" src="https://simg.open-open.com/show/e18c366fe2486ea3b694f145649452ab.png"></a></p>    <p><br> Docker客户端跟服务器(守护程序)通信,服务器来做所有的工作。Docker通过包含命令行客户端(供Linux、OS X和Windows使用)和完整RESTful接口的二进制文件来分发。你可以在一台Linux主机上运行Docker守护进程和客户端,或者将你的本地Docker客户端连接到另一台Linux主机的远程Docker守护进程。</p>    <h3>Docker镜像</h3>    <p>Docker镜像是Docker的构建基石。这些镜像是Docer生命周期中的构建部分。他们是一种分层的形式,根据一系列说明一步一步构建产生的统一文件系统。Dockefile是一个文本文档,它包含用户可以在命令行调用的所有命令从而组成一个镜像。使用一个基本的Docker镜像,可以添加、拷贝文件、执行命令、开放端口。<br> <br> 你可以认为Docker文件是一种源码,而镜像是为产生容器而被编译的代码,而容器则是运行时代码。Docker文件具有高度的便携性,可以随时共享、存储和更新。</p>    <h3>注册服务</h3>    <p>一旦你构建出一个镜像,你就可以在注册服务中存储它。注册服务有:公共的和私有的。像Docker Hub、Quay.io、Container Registery by Google Cloud的注册服务都有公共和私有的选项。你当然也可以在自己机器上运行一个自己的私有注册服务。</p>    <h3>容器</h3>    <p>容器是镜像的一个运行版本。<br> <br> 你可以认为镜像是Docker的构建或者编译的一面,而容器是Docker的运行或者执行的一面。<br> <br> 容器的生命周期跟你在容器里执行的命令的生命周期是一致的。一个容器可以只执行一个单个命令后立刻结束,或者可以让容器跟随耗时的命令一直运行。</p>    <h2>总结</h2>    <p>在本文我们讲述了:</p>    <ul>     <li>什么使得Docker如此特别</li>     <li>虚拟机和容器的主要区别</li>     <li>组成Docker的主要组件</li>    </ul>    <p><br> 在我的下一篇博文中,我们将介绍启动容器、构建镜像,并在数据分区中工作的内容<br> <br> <strong>原文链接:<a href="/misc/goto?guid=4959670229635759545">Docker Overview, Part One</a>(翻译:姜俊厚)</strong></p>    <p><strong>来源:</strong><strong>http://dockone.io/article/1160</strong></p>