网站开发是否用html5,动态域名免费申请,广东做网站公司有哪些,长沙网站开发长沙网站建设大家好#xff0c;这里是七七#xff0c;今天起开起我们的Docker技术篇#xff0c;本文是介绍Docker的#xff0c;不介绍如何使用和安装Docker#xff0c;只是单纯的介绍Docker。
目录
一、历史
二、Docker究竟是什么
三、Docker的结构与特性
1、Docker仓库
2、Dock…大家好这里是七七今天起开起我们的Docker技术篇本文是介绍Docker的不介绍如何使用和安装Docker只是单纯的介绍Docker。
目录
一、历史
二、Docker究竟是什么
三、Docker的结构与特性
1、Docker仓库
2、Docker自身程序
3、工作流程
4、Docker化应用的存在形式
5、Docker对变更的管理
四、为什么使用Docker
1、从代码管理说起
2、当前的优化策略
3、Github版的应用部署解决方案
4、Docker应用场景
场景一
场景二
5、Docker可以解决哪些痛点
1、开发人员
2、测试人员
3、运维人员
6、Docker的学习成本 一、历史
关于Docker的历史这里我们简要介绍它是dotCloud公司内部使用的Container容器技术拿出来开源后广受好评。其老板随着Docker的知名度越来越高直接将公司名字改为Docker股份有限公司重心转向Docker。
之后Docker发布了V1.0版许多大公司均表示加入Docker阵营。在那之后Docker又完成了几轮融资。如今在业界影响力很大。
二、Docker究竟是什么 按照官方的说法Docker是一个开源的应用容器引擎。但这个说法太抽象不容易理解。
那就从最熟悉的事物说起但凡从事过计算机相关行业的人对Java、Android和Github都很熟悉
先说Java在Java之前的编程语言像C/C是严重依赖平台的在不同平台下需要重新编译才能运行。Java的一个非常重要的特性就是与平台无关性而使用Java虚拟机是实现这一特性的关键。Java虚拟机屏蔽了与具体平台相关的信息使得Java编译程序只需生成可以在Java虚拟机上运行的目标代码字节码就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时把字节码解释成具体平台上的机器指令执行。
软件部署也依赖平台Ubuntu的软件包在Centos下可能就运行不起来。和Java虚拟机类似Docker使用容器引擎解决平台依赖问题它在每台宿主机上都启动一个Docker的守护进程守护进程屏蔽了与具体平台相关的信息对上层应用提供统一的借口。这样Docker化的应用就可以在多个平台下运行Docker会针对不同的平台解析给不同平台下的执行驱动、存储驱动和网络驱动去执行。
Java曾提出写一次在哪儿都运行的口号而Docker则提出了搭建、设置一次在哪儿都能运行。虽然Java和Docker是为了解决不同领域的问题但在平台移植方面却面临相同的问题使用的解决方式也相似。
提起Android我们会想到它是一个开源的手机操作系统也是一个生态圈其App以apk形式打包、发布可以运行在任何厂商的Android手机上。它还有一个官方的安卓市场提供各种各样的App我们需要某个App时就从安卓市场上搜索下载手机开发者也可以编写一些App发布到安卓市场给别人使用Android也允许在第三方的安卓市场上下载或上传应用。
如果把软件部署的应用看作Android的AppDocker简直和Android一模一样。Docker是一个开源的容器引擎也有自己的生态圈它的应用以镜像image的形式发布可以运行在任何装有Docker引擎的操作系统上。它有一个官方的镜像仓库提供各种各样的应用当需要某个应用时就从官方的仓库搜索并下载个人开发者也可以提交镜像到官方仓库分享给别人使用。Docker也允许使用第三方的镜像仓库。
最后再谈Github。它主要用来做版本控制不仅可以比较两个版本的差异还可以基于某些历史版本创建新的分支。
使用Docker后软件部署的应用也可以具备类似Github的版本控制功能对应用做一些修改提交新版本运行环境可以在多个版本间快速切换自由选择使用哪个版本对外提供服务。
通过和Java、Android、Github的对比大家对Docker应该有了比较直观的认识Docker用来管理软件部署的应用Docker把应用打包成一个镜像镜像带有版本控制功能应用的每次修改迭代就对应镜像的一个版本制作好的镜像可以发布到镜像仓库也可以直接从镜像仓库下载别人制作好的应用不做任何修改即可运行起来。
三、Docker的结构与特性
了解完Docker我们再来看看它的结构。
如果把Docker当做一个独立的软件来看它就是用Golang写的开源程序采用C/S架构包含Docker Sever和Docker Client源代码在Github上。
如果把Docker看做一个生态的话它主要由两部分组成Docker仓库和Docker自身程序。拿iPhone做类比的话Docker仓库相当于AppstoreDocker相当于iOS手机操作系统。
1、Docker仓库
Docker仓库snag有非常多的应用既有各大公司打包的应用也有大量个人开发者提供的应用。如redisubuntumysql等等。
2、Docker自身程序
Docker本身是一个单机版的程序运行在Linux上属于用户态程序通过一些接口和内核交互。
由于Docker需要用到Linux的cgroups、namespace等特性所以目前只能运行在Linux下。
Docker是一个C/S架构它的Docker Daemon作为Server端在宿主机上以后台守护进程的形式运行。Docker Client使用比较灵活、既可以在本机上以bin命令的形式如Docker info、Docker start发送指令也可以在远端通过RESTful API的形式发送指令Docker的Server端接受指令并把指令分解为一系列任务去执行。
3、工作流程
在了解了Docker的构成后再来看看如何使用Docker。
首先在Linux上安装Docker软件包并启动Docker Daemon守护进程。然后就可以通过Docker Client端发送各种指令Docker Daemon守护进程执行完命令向Client端返回结果。
假如要启动一个新的Docker应用app1其工作流程大致如下 DockerClient向Daemon发送启动app1指令因为我们的Linux只装有Docker软件包没有app1相关软件或服务Docker Daemon就发请求给Docker的官方仓库在仓库中搜索app1如果找到app1就把它下载到我们的服务器上Docker Daemon启动app1把启动app1应用是否成功的结果返回给Docker Client Docker的其他操作比如停止或删除Docker应用和启动的流程差不多这里就不一一介绍了。
4、Docker化应用的存在形式
我们知道经过这么多年Linux下的软件不计其数安装方式也千奇百怪。有些依赖特定操作系统有些依赖特定内核版本有些依赖一些第三方软件和共享库等。
既然软件安装部署方式没有一个统一的标准那么Docker的官方仓库该如何做呢总不能一个软件写一个安装说明书吧。
换个角度想一下用户的需求只是把软件运行起来至于怎么安装软件、软件运行在什么操作系统下用户不提关心。那么就把软件和它依赖的环境包括操作系统和共享库等、依赖的配置文件打包在一起以虚拟机的形式放到官方仓库供大家使用。只要有虚拟机的运行环境就可以不做任何修改把软件运行起来。只要有一个人把软件安装和配置好交到官方仓库其他人直接下载就可以用。以这种方式解决了软件安装部署方式没有一个统一标准的问题。
但这种软件部署方式却存在很多问题一般一个软件包大小也就几兆到几十兆不等但一个操作系统却有好几个G。如果每个软件都带上它依赖的操作系统那么每个软件都有好几个G很难受。
Docker为了解决这个问题引入了分层的概念。把一个应用分为任意多个层比如操作系统是第一层依赖的库和第三方软件是第二层应用的软件包和配置文件是第三层。如果这两个应用有相同的层就可以共享这些层。
例如A应用和B应用的操作系统是一样的它们就可以共享这一层安装应用A时需要下载操作系统层anzhuangyingyB就不用下载操作系统层只需要下载它的依赖包和自身的软件包。因为主流的操作系统也就那么几个最差情况下也就把常用的操作系统都安装一遍然后包含操作系统的软件包就和传统的软件包一样大小了。
但这种共享层存在冲突问题比如应用A需要修改操作系统的某个配置应用B不需要修改。如何解决这个冲突我们规定层次是有优先级的上层和下层有相同的文件和配置时上层覆盖下层数据以上层的数据为准。我们给每个应用一个优先级最高的空白层如果需要修改下层的文件就把这个文件拷贝到这个优先级最高的空白层进行修改保证下层的文件不做任何改变。这样从应用A的角度来看文件已经修改成功了而从应用B的角度来看文件没有发生任何改变。
Docker的分层和写时拷贝策略解决了包含操作系统的应用程序比较大的问题。但我们只大主流的虚拟机KVM、Xen、VMWare等一般比较笨重除了虚拟机本身运行要消耗大量的系统资源外启动一个虚拟机也要花费数分钟如何把虚拟机做到轻量化呢
以OpenVZ、VSever、LXC为代表的容器类虚拟机是一种内核虚拟化技术与宿主机运行在相同的Linux内核不需要指令级模拟性能消耗非常小是非常轻量级的虚拟化容器虚拟容器的系统资源消耗和一个普通的进程差不多。Docker就是使用LXC后来又推出libcontainer让虚拟机变得轻量化。
在Docker的官方仓库里只需要它有完整的文件系统和程序包没有动态生成新文件的需求当把它下载到宿主机上运行对外提供服务时有可能修改文件比如输出新日志到日志文件中需要有空白层用于写时拷贝。Docker把这两种不同状态做了区分分别叫做镜像image和容器container
在仓库中的应用都是以镜像的形式存在的把镜像从Docker仓库中下拉到本机以这个镜像为模版启动应用就叫容器。
在Docker的世界里镜像和容器是其两大核心概念几乎所有的指令和文档都是围绕这两个概念展开的。
5、Docker对变更的管理
对于软件开发来说版本迭代、版本回退是常态Docker对变更管理又有什么特别之处呢
假若有一个应用的Docker镜像它的V1.0版本有3层每层大小如图所示 接下来我们要对它进行如下修改 修改位于第一层的文件A删除位于第二层的文件B添加一个新文件C Docker会新增一个第四层针对上面的需求处理方式如下 把第一层的文件A拷贝到第四层修改文件A的内容在第四层把名称为B的文件设置为不存在在第四层创建一个新文件C 通过增加一个第四层我们的版本变为1.1如图 我们想把应用的V1.1版本发布到Docker仓库。Docker仓库已经存在这个应用镜像的V1.0版本我们上传时只需要把第四层只有3M上传到Docker仓库即可。
假设有一台远程服务器正在运行这个应用的V1.0版只需要从Docker仓库把第四层下载下来就可以运行V1.1版了。
综上Docker不仅有版本控制功能还能利用分层特性做到增量更新。
四、为什么使用Docker
你可能会说因为别人用了所以我也用。噢如果那样的话可就太糟糕了☹️。
当深入了解Docker后你想在部门推广Docker就需要给大家讲明白为什么使用Docker。
当讲Docker是什么时受众是一批Docker爱好者Docker的原理和细节讲得越深入越具体就越受欢迎
当讲为什么要使用Docker时受众可能从来没听说过Docker他们更关注Docker能带来什么引入Docker需要对现有的系统或程序做多大改造Docker是不是足够的稳定学习和使用Docker的成本有多高等问题。
1、从代码管理说起
现在的软件项目失败的原因主要是设计结构不合理、编程人员水平不高、代码bug太多等因素。不管项目有多大参与的人员有多么多代码修改多么频繁很少是由管理上混乱导致项目失败的。究其原因主要是我们有非常优秀的代码管理工具——Git和SVN。它们有版本控制和中心仓库这两大核心功能能保证大家不用担心下列问题 快速把代码分享给别人多人同时修改一个文件导致代码不一致分不清每个人在什么时间提交过什么代码代码被误删误改不知道哪些文件被删被改也恢复不到以前的状态变更和新分支太多混乱到无法维护的地步 版本控制功能不仅能清晰记录每个开发者在什么时间交过什么代码还能让大家在各个版本间自动地切换、融合。大家如果要对齐开发环境不需要注意列出文件的名字、文件的内容只需要简单地说下版号就能保证大家的文件完全一致。
中心仓库可以保证多人协作有一个统一的平台既可以与别人分享代码和开发进度也可以对每个人的代码做异机备份防止因为机器故障而导致数据丢失。
软件部署和代码部署面临很多相似的问题 如何快速把一台机器的应用环境分享给其他机器使用用于扩容和故障时服务转移同一个功能模块的多台机器软件版本和配置文件镜像出现不一致很难被发现多人维护一套系统很难清晰地记录下每个人都做过什么操作、每次变更都有哪些内容以便在故障时快速回退有些配置文件或数据被误删了恢复不回来甚至很长一段时间都察觉不到随着操作系统版本、软件、硬件的更新迭代系统维护的复杂度直线上升混乱不堪 既然代码管理做的这么好那软件部署为什么不借鉴代码管理的方法呢 噢 是因为大小
代码管理的对象是纯文件代码提亮小有统一规范的文件编码方式对平台无依赖。而软件部署管理的对象是一个环境除了文件还有二进制的软件和它依赖的运行环境包括操作系统和依赖库。由于操作系统和依赖库的体量很大难以完全照搬代码管理的方式用版本控制和中心仓库来解决软件部署的问题。
2、当前的优化策略
下面来看看对于软件部署目前主流的解决方案是什么样子
把环境分为两个部分基础环境和应用环境。 基础环境包含机器硬件、操作系统、提供基础服务的应用如ssh、syslog等应用环境包含应用需要的各种软件包和配置文件虽然软件包中也可以包含配置文件但对于一些变更频繁和需要个性化配置的文件最好还是独立出来。基础环境统一化尽量保持完全一致。比如使用相同的硬件服务器运行相同版本的操作系统和基础软件。应用环境分解出一个个独立服务每个服务再分解为包和配置文件使用版本控制和中心仓库来对包与配置进行管理 整体方案如图所示 在这个解决方案中我们把软件包和配置都版本化每次变更都提交一个版本到中心仓库然后再下发到各台机器上。由于每台机器的基础环境都保持一致所以软件部署时可以不关注底层适配问题在一台机器打包编译的应用可以快速迁移到其他机器。
这个解决方案在基础环境一致的前提下实现了分解版的版本控制和中心仓库针对分解出来的软件安装包和配置文件可以通过版本来管理并且可以把包和配置提交到中心仓库让所有其他机器分享。
这个方案存在以下两个问题 基础环境难以改动因为上层应用环境的软件和配置文件都是基于基础环境编译与配置的一旦基础环境发生改变可能导致上层的软件包和配置不能正常工作。应用环境的维护成本取决于包和配置的数量由于应用环境不是一个统一整体而是分解出一个个包和配置随着包和配置的增多维护的复杂性也随之增加。 3、Github版的应用部署解决方案
Github是最流行、最优秀的代码管理平台Docker借鉴了Github的管理思路打造了一个Github版的应用部署的管理方案。
如果使用Docker来管理部署应用解决方案如图所示 和上面的方案做下对比 基础环境灵活对硬件和操作系统都没有限制只需要在每台计算机上安装Docker Engine用于运行Docker应用。应用环境也不再分解为一个个包和配置文件而是作为一个有机的整体这个有机整体包含应用需要的所有软件包、配置文件和依赖的运行环境操作系统和依赖库带有版本控制功能也可以提交到中心仓库供大家共享。由于Docker镜像中包含应用运行所需要的所有包、配置和系统环境下发镜像后不需要做任何安装配置应用就可以直接执行不会随着应用中包和配置数量的增加导致安装部署变得复杂 Docker方案完美地把代码管理中的版本控制和中心仓库概念移植到应用部署领域让大家顿时从应用部署烦琐、重复的工作中解脱出来可以像使用Github管理代码那样优雅地管理应用的部署工作。
Docker这个方案能够顺利实施一个关键点是通过分层共享和增量变更技术把应用的运行环境包括操作系统在内这么一个庞大的体量顺利瘦身让应用运行环境的安装和修改在大多数情况下与只装软件包一样轻量、方便。
4、Docker应用场景
下面描述两个典型的Docker应用场景
在这两个应用场景中有开发、测试QA和运维人员分别维护开发、测试和生产环境的服务他们有一个私有的Docker仓库存储着各种各样的Docker化的应用镜像。
场景一
现在有一个需求需要对应用App1做修改、测试和发布新变更到生产环境步骤如下 开发者先从私有仓库找到App1则个应用最新稳定版本假设为V1.0版把这个Appv1.0下载到开发机修改并提交到私有仓库并告诉测试人员测试。测试人员下载开发者刚提交的新版本App1:v1.1测试并把测试结果反馈给开发者如果测试失败开发者继续修改提交新版本给测试人员做新一轮的测试如果测试成功开发把要发布的应用的名称和版本号提供给运维同事。运维人员根据开发提供的应用名和版本号把相关镜像从私有仓库下拉到各个生产环境的机器上停掉就版本的Docker容器启动新版本的Docker容器完成发布。生产环境的机器上可以同时缓存应用的多个版本镜像如果新发布的版本有问题可以快速切换回原来的版本。 因为Docker的应用镜像包含应用运行需要的所有软件包、配置和操作系统所以开发者打包好DockerDocker镜像测试和运维获取不需要任何修改就可以运行。
场景二
有一个应用App2目前在生产环境正常运行但由于系统比较老、缺乏维护、开发和运维经历过更替且交接文档不全现在谁都不知道该如何部署App2这个应用到新服务器上。
如果App2是Docker化的应用它可以直接把运行的环境转换为一个带版号的Docker镜像如App2:v1.0提交到私有仓库供开发者修改或运维人员发布新机器
5、Docker可以解决哪些痛点
1、开发人员
不管是在大公司还是小公司开发人员经常被如下问题困扰 为了节约成本一台开发机多人使用管理混乱相互干扰一个开发往往只用一套开发环境同时有多个开发任务时不得不反复修改开发环境以适应不同的开发任务多个开发人员希望保持相同的开发环境开发同一个项目但开发环境难以复刻即便大家起初的开发环境一样随着项目的滚动、开发环境的不停更新很难保证每个人的开发环境都同步更新开发机硬件故障需要更换新机器重新搭建开发环境是件头疼的事。如果硬件故障重要数据没备份那就更让人崩溃打算调研下新软件安装配置文档复杂仅仅把软件安装、运行起来就要花费大半天时间 上面问题带来的工作量不能体现开发人员的核心价值但是是不得不面对的。
如果使用Docker可以轻松解决上述问题 Docker化的应用使用容器虚拟化技术每个应用都运行在独立的虚拟化环境中天然具有隔离行不用担心一机多用造成的管理混乱。开发人员在多任务开发时可以并行启动这些应用的Do可容器每一个Docker应用有一个独立的运行环境互不干扰。开发机硬件故障在新开发机上重新从Docker仓库下拉开发环境的镜像一两分钟内就可以重新搭建一套开发环境并且及时新旧开发机的硬件和操作系统不一致重新搭建的开发环境仍能保持和原来的环境一摸一样。另外还可以通过Docker仓库把重要变更及时备份到远端。Docker的每个复杂软件都可以制作成Docker镜像分享给大家使用。随着Docker的流行几乎所有的主流的软件都提供Docker化的部署方式。软件部署将成为再简单不过的事情。 2、测试人员
测试人员经常费了九牛二虎之力测出一些bug和开发逐一核对发现大多数bug都是开发和测试环境不一致造成的。
测试人员经常为配置不同的测试环境浪费大量时间还是不能保证和开发环境完全包次一致开发人员虽然很认真负责地告诉测试人员如何配置测试环境但还是经常性地遗漏一些配置。
使用Docker不需要做任何配置就能保证开发和测试环境完全一致测试人员只需要关注测试本身就可以了。
3、运维人员
运维人员大部分时间都浪费在装软件、修改配置上重复单调经常半夜还要起来做紧急扩容、故障机服务迁移。如果使用了Docker好处显而易见 服务具备快速部署能力扩缩容、版本回退在几秒内就可以完成。基于同一个Docker镜像部署服务可以保证每台机器应用完全一致。由于Docker化的应用是虚拟化多个应用可以混合部署在一台机器上互不干扰可以提高机器使用率。Docker化的应用可以运行在不同的硬件和操作系统平台下在不同的环境自由迁移。通过Dockerfiel管理Docker镜像即使系统多次易手、交接文档不全运维人员也可以快速了解系统是如何搭建的。Docker倡导Build once, Run anywhere再烦琐的活儿只需要做一次制作成Docker镜像在任何环境下都可以运行还可以基于这个Docker镜像做修改制作新的镜像。 上面只罗列几条好处运维在使用Docker的过程中还会发现很多意想不到的好处。一句话Docker可以让运维工作变得简单和易于维护。
6、Docker的学习成本
坦白说Docker是有学习和使用成本的。
Docker虽然已经做的足够简单易用但由于其定位是虚拟化容器是一个单机版的应用如果要给予Docker构建集群u或PaaS管理系统如Web管理界面、任务调度策略、监控报警等则还需要自己开发或从开发社区寻求帮助。
另外传统的运维是以机器为中心而Docker是以应用为中心它会颠覆我们一些固有的运维习惯和运维方式。