企业网站模块建设流程,南通网站建设入门,查建筑公司网站,网络推广多少钱作者 | 码农的荒岛求生来源 | 程序员小灰#xff08;ID: chengxuyuanxiaohui#xff09;程序员#xff0c;应该怎样理解docker#xff1f;容器技术的起源假设你们公司正在秘密研发下一个“今日头条”APP#xff0c;我们姑且称为明日头条#xff0c;程序员自己从头到尾搭建… 作者 | 码农的荒岛求生来源 | 程序员小灰ID: chengxuyuanxiaohui程序员应该怎样理解docker容器技术的起源假设你们公司正在秘密研发下一个“今日头条”APP我们姑且称为明日头条程序员自己从头到尾搭建了一套环境开始写代码写完代码后程序员要把代码交给测试同学测试这时测试同学开始从头到尾搭建这套环境测试过程中出现问题程序员也不用担心大可以一脸无辜的撒娇“明明在人家的环境上可以运行的”。测试同学测完后终于可以上线了这时运维同学又要重新从头到尾搭建这套环境费了九牛二虎之力搭建好环境开始上线糟糕上线系统就崩溃了这时心理素质好的程序员又可以施展演技了“明明在人家的环境上可以运行的”。从整个过程可以看到不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华典型的浪费时间和效率聪明的程序员是永远不会满足现状的因此又到了程序员改变世界的时候了容器技术应运而生。有的同学可能会说“等等先别改变世界我们有虚拟机啊VMware好用的飞起先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗”在没有容器技术之前这确实是一个好办法只不过这个办法还没有那么好。先科普一下现在云计算其底层的基石就是虚拟机技术云计算厂商买回来一堆硬件搭建好数据中心后使用虚拟机技术就可以将硬件资源进行切分了比如可以切分出100台虚拟机这样就可以卖给很多用户了。你可能会想这个办法为什么不好呢容器技术 vs 虚拟机我们知道和一个单纯的应用程序相比操作系统是一个很重而且很笨的程序简称笨重有多笨重呢我们知道操作系统运行起来是需要占用很多资源的大家对此肯定深有体会刚装好的系统还什么都没有部署单纯的操作系统其磁盘占用至少几十G起步内存要几个G起步。假设我有一台机器16G内存需要部署三个应用那么使用虚拟机技术可以这样划分在这台机器上开启三个虚拟机每个虚拟机上部署一个应用其中VM1占用2G内存VM2占用1G内存VM3占用了4G内存。我们可以看到虚拟本身就占据了总共7G内存因此我们没有办法划分出更多虚拟机从而部署更多的应用程序可是我们部署的是应用程序要用的也是应用程序而不是操作系统。如果有一种技术可以让我们避免把内存浪费在“无用”的操作系统上岂不是太香这是问题一主要原因在于操作系统太重了。还有另一个问题那就是启动时间问题我们知道操作系统重启是非常慢的因为操作系统要从头到尾把该检测的都检测了该加载的都加载上这个过程非常缓慢动辄数分钟因此操作系统还是太笨了。那么有没有一种技术可以让我们获得虚拟机的好处又能克服这些缺点从而一举实现鱼和熊掌的兼得呢答案是肯定的这就是容器技术。什么是容器容器一词的英文是container其实container还有集装箱的意思集装箱绝对是商业史上了不起的一项发明大大降低了海洋贸易运输成本。让我们来看看集装箱的好处 集装箱之间相互隔离 长期反复使用 快速装载和卸载 规格标准在港口和船上都可以摆放回到软件中的容器其实容器和集装箱在概念上是很相似的。现代软件开发的一大目的就是隔离应用程序在运行时相互独立互不干扰这种隔离实现起来是很不容易的其中一种解决方案就是上面提到的虚拟机技术通过将应用程序部署在不同的虚拟机中从而实现隔离。但是虚拟机技术有上述提到的各种缺点那么容器技术又怎么样呢与虚拟机通过操作系统实现隔离不同容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统这里的运行时环境指的是程序运行依赖的各种库以及配置。从图中我们可以看到容器更加的轻量级且占用的资源更少与操作系统动辄几G的内存占用相比容器技术只需数M空间因此我们可以在同样规格的硬件上大量部署容器这是虚拟机所不能比拟的而且不同于操作系统数分钟的启动时间容器几乎瞬时启动容器技术为打包服务栈提供了一种更加高效的方式So cool。那么我们该怎么使用容器呢这就要讲到docker了。注意容器是一种通用技术docker只是其中的一种实现。什么是dockerdocker是一个用Go语言实现的开源项目可以让我们方便的创建和使用容器docker将程序以及程序所有的依赖都打包到docker container这样你的程序可以在任何环境都会有一致的表现这里程序运行的依赖也就是容器就好比集装箱容器所处的操作系统环境就好比货船或港口程序的表现只和集装箱有关系(容器)和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。因此我们可以看到docker可以屏蔽环境差异也就是说只要你的程序打包到了docker中那么无论运行在什么环境下程序的行为都是一致的程序员再也无法施展表演才华了不会再有“在我的环境上可以运行”真正实现“build once, run everywhere”。此外docker的另一个好处就是快速部署这是当前互联网公司最常见的一个应用场景一个原因在于容器启动速度非常快另一个原因在于只要确保一个容器中的程序正确运行那么你就能确信无论在生产环境部署多少都能正确运行。如何使用dockerdocker中有这样几个概念dockerfileimagecontainer实际上你可以简单的把image理解为可执行程序container就是运行起来的进程。那么写程序需要源代码那么“写”image就需要dockerfiledockerfile就是image的源代码docker就是编译器。因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置之后把dockerfile交给“编译器”docker进行“编译”也就是docker build命令生成的可执行程序就是image之后就可以运行这个image了这就是docker run命令image运行起来后就是docker container。具体的使用方法就不再这里赘述了大家可以参考docker的官方文档那里有详细的讲解。docker是如何工作的实际上docker使用了常见的CS架构也就是client-server模式docker client负责处理用户输入的各种命令比如docker build、docker run真正工作的其实是server也就是docker demon值得注意的是docker client和docker demon可以运行在同一台机器上。接下来我们用几个命令来讲解一下docker的工作流程1docker build当我们写完dockerfile交给docker“编译”时使用这个命令那么client在接收到请求后转发给docker daemon接着docker daemon根据dockerfile创建出“可执行程序”image。2docker run有了“可执行程序”image后就可以运行程序了接下来使用命令docker rundocker daemon接收到该命令后找到具体的image然后加载到内存开始执行image执行起来就是所谓的container。3docker pull其实docker build和docker run是两个最核心的命令会用这两个命令基本上docker就可以用起来了剩下的就是一些补充。那么docker pull是什么意思呢我们之前说过docker中image的概念就类似于“可执行程序”我们可以从哪里下载到别人写好的应用程序呢很简单那就是APP Store即应用商店。与之类似既然image也是一种“可执行程序”那么有没有Docker Image Store呢答案是肯定的这就是Docker Hubdocker官方的“应用商店”你可以在这里下载到别人编写好的image这样你就不用自己编写dockerfile了。docker registry 可以用来存放各种image公共的可以供任何人下载image的仓库就是docker Hub。那么该怎么从Docker Hub中下载image呢就是这里的docker pull命令了。因此这个命令的实现也很简单那就是用户通过docker client发送命令docker daemon接收到命令后向docker registry发送image下载请求下载后存放在本地这样我们就可以使用image了。最后让我们来看一下docker的底层实现。docker的底层实现docker基于Linux内核提供这样几项功能实现的NameSpace我们知道Linux中的PID、IPC、网络等资源是全局的而NameSpace机制是一种资源隔离方案在该机制下这些资源就不再是全局的了而是属于某个特定的NameSpace各个NameSpace下的资源互不干扰这就使得每个NameSpace看上去就像一个独立的操作系统一样但是只有NameSpace是不够。Control groups虽然有了NameSpace技术可以实现资源隔离但进程还是可以不受控的访问系统资源比如CPU、内存、磁盘、网络等为了控制容器中进程对资源的访问Docker采用control groups技术(也就是cgroup)有了cgroup就可以控制容器中进程对系统资源的消耗了比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。有了这两项技术容器看起来就真的像是独立的操作系统了。总结docker是目前非常流行的技术很多公司都在生产环境中使用但是docker依赖的底层技术实际上很早就已经出现了现在以docker的形式重新焕发活力并且能很好的解决面临的问题希望本文能对大家理解docker有所帮助。更多阅读推荐阿里工程师用 8 张图告诉你如何存储、管理泛内容数据2020 年最厉害的 10 门编程语言大咖说中台 | 建设数据中台系列五——中台架构详解下据说程序员已成为女生年度最喜欢男友职业Top3鸿蒙加海思麒麟加龙芯组合拳能否渡劫“生态”危机