本文来自于个人 慕课网手记: 简单聊会 Docker,转载请保留连接 ;)
最近在工做中一直在忙基础设施构建,发如今选型的时候,你们内心基本上都有一个本身的成熟架构。而在服务部署这块发现公司的同事们都大多数考虑Docker,在业余闲聊了后,发现他们对Docker只是在停留在使用,对一些Docker的基本知识仍是不了解,并不清楚 Docker 究竟是什么,要解决什么问题,好处又在哪里?今天就来详细解释,帮助你们理解它,还带有简单易懂的实例,教你如何将它用于平常开发并用其部署微服务。nginx
Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司。Docker自开源后受到普遍的关注和讨论,目前已有多个相关项目,逐渐造成了围绕Docker的生态体系。dotCloud公司后来也更名为Docker Inc,专一于Docker相关技术和产品的开发。Docker 一直广受瞩目,被认为可能会改变软件行业。那么什么是Docker呢?我查阅了网上的一些相关资料,现用一段话总结了一下。
Docker是一个开源的容器引擎,它能够帮助咱们更快地交付应用。Docker可将应用程序和基础设施层隔离,而且能将基础设施看成程序同样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可减小从编写到部署运行代码的周期。
对一个事物有了必定了解后,咱们的继续学习Docker官方的给出文档和源码。(这个今天不在此文章扩展,否则聊不完。)git
TIPSgithub
(1) Docker官方网站:https://www.docker.com/docker
(2) Docker GitHub:https://github.com/docker/docker服务器
执行以下命令,便可启动一个Nginx容器
``
docker run -d -p 91:80 nginx
``网络
咱们来看一下来自Docker官方文档的架构图,如图所示。架构
咱们来说解上图中包含的组件。
(1) Docker daemon(Docker守护进程)微服务
Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。咱们可经过Docker客户端与之通讯。工具
(2) Client(Docker客户端)学习
Docker客户端是Docker的用户界面,它能够接受用户命令和配置标识,并与Docker daemon通讯。图中,docker build等都是Docker的相关命令。
(3) Images(Docker镜像)
Docker镜像是一个只读模板,它包含建立Docker容器的说明。它和系统安装光盘有点像——咱们使用系统安装光盘安装系统,同理,咱们使用Docker镜像运行Docker镜像中的程序。
(4) Container(容器)
容器是镜像的可运行实例。镜像和容器的关系有点相似于面向对象中,类和对象的关系。咱们可经过Docker API或者CLI命令来启停、移动、删除容器。
(5) Registry
Docker Registry是一个集中存储与分发镜像的服务。咱们构建完Docker镜像后,就可在当前宿主机上运行。但若是想要在其余机器上运行这个镜像,咱们就须要手动拷贝。此时,咱们可借助Docker Registry来避免镜像的手动拷贝。
一个Docker Registry可包含多个Docker仓库;每一个仓库可包含多个镜像标签;每一个标签对应一个Docker镜像。这跟Maven的仓库有点相似,若是把Docker Registry比做Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。
Docker Registry可分为公有Docker Registry和私有Docker Registry。最经常使用的Docker Registry莫过于官方的Docker Hub,这也是默认的Docker Registry。Docker Hub上存放着大量优秀的镜像,咱们可以使用Docker命令下载并使用。
经常使用的8个Docker的真实使用场景,分别是简化配置、代码流水线管理、提升开发效率、隔离应用、整合服务器、调试能力、多租户环境、快速部署。咱们一直在谈Docker,Docker怎么使用,在怎么样的场合下使用?
首先你在享有Docker带来的虚拟化能力的时候无需担忧它带来的额外开销。其次,相比于虚拟机,你能够在同一台机器上建立更多数量的容器。
Docker的另一个优势是容器的启动与中止都能在几秒中内完成。Docker公司的创始人 Solomon Hykes曾经介绍过Docker在单纯的LXC之上作了哪些事情,你能够去看看。
下面是我总结的一些Docker的使用场景,它为你展现了如何借助Docker的优点,在低开销的状况下,打造一个一致性的环境。
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各类配置不同的平台(软件、系统),Docker在下降额外开销的状况下提供了一样的功能。它能让你将运行环境和配置放在代码中而后部署,同一个Docker的配置能够在不一样的环境中使用,这样就下降了硬件要求和应用环境之间耦合度。
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,须要通过不少的中间环境。而每个中间环境都有本身微小的差异,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单很多。
这就带来了一些额外的好处:Docker能提高开发者的开发效率。若是你想看一个详细一点的例子,能够参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。
不一样的开发环境中,咱们都想把两件事作好。一是咱们想让开发环境尽可能贴近生产环境,二是咱们想快速搭建开发环境。
理想状态中,要达到第一个目标,咱们须要将每个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,咱们却不想每次都须要网络链接,每次从新编译的时候远程链接上去特别麻烦。这就是Docker作的特别好的地方,开发环境的机器一般内存比较小,以前使用虚拟的时候,咱们常常须要为开发环境的机器加内存,而如今Docker能够轻易的让几十个服务在Docker中跑起来。
有不少种缘由会让你选择在一个机器上运行不一样的应用,好比以前提到的提升开发效率的场景等。
咱们常常须要考虑两点,一是由于要下降成本而进行服务器整合,二是将一个总体式的应用拆分红松耦合的单个服务(译者注:微服务架构)。若是你想了解为何松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊作了比较。
正如经过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker能够整合多个服务器以下降成本。因为没有多个操做系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker能够比虚拟机提供更好的服务器整合解决方案。
Docker提供了不少的工具,这些工具不必定只是针对容器,可是却适用于容器。它们提供了不少的功能,包括能够为容器设置检查点、设置版本和查看两个容器之间的差异,这些特性能够帮助调试Bug。你能够在《Docker拯救世界》的文章中找到这一点的例证。
另一个Docker有意思的使用场景是在多租户的应用中,它能够避免关键应用的重写。咱们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码很是复杂,很难处理,从新规划这样一个应用不但消耗时间,也浪费金钱。
使用Docker,能够为每个租户的应用层的多个实例建立隔离的环境,这不只简单并且成本低廉,固然这一切得益于Docker环境的启动速度和其高效的diff命令。
你能够在这里了解关于此场景的更多信息。
在虚拟机以前,引入新的硬件资源须要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker经过为进程仅仅建立一个容器而无需启动一个操做系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。
你能够在数据中心建立销毁资源而无需担忧从新启动带来的开销。一般数据中心的资源利用率只有30%,经过使用Docker并进行有效的资源分配能够提升资源的利用率。