当前位置: 首页 > 科技观察

什么是码头工人?看完这篇干货就够了!

时间:2023-03-15 16:48:07 科技观察

容器技术的起源假设你的公司正在秘密开发下一个“今日头条”应用程序。把代码交给测试同学测试。这时候,测试同学开始从头到尾搭建这个环境。如果在测试过程中出现问题,程序员不必担心。”。测试同学测试完,终于可以上线了,这时候运维同学又得把这个环境从头到尾搭建一遍,费了好大劲才把环境搭建好,开始上线不幸的是,线上系统崩溃了,心理素质好的程序员又可以一展演技了,“明明可以在别人的环境下运行。”从整个过程可以看出,我们不仅反复搭建了三套环境,还逼着程序员转投演员浪费演技,这是典型的浪费时间和效率,聪明的程序员永远不会满足于现状,所以又到了程序员的时代了。容器技术应运而生,有的同学可能会说:“等等,先不要改变世界。我们有虚拟机。VMware非常易于使用。我们先搭建一个虚拟机环境,然后克隆出来进行测试和运维。?在没有容器技术之前,这确实是一个很好的做法,但是并没有那么好。先做个科普吧。现在云计算的底层基础是虚拟机技术。云计算厂商买一堆硬件,建一个数据中心,然后用虚拟机技术划分硬件资源。例如,可以划分100个单元。虚拟机,以便可以将它们出售给许多用户。你可能会想为什么这个方法不好?容器技术vs虚拟机我们知道,与一个简单的应用程序相比,操作系统是一个非常笨重的程序,简称笨拙,笨拙到什么程度呢?我们知道,运行系统的运行需要大量的资源。想必大家对此有着深刻的认识。新安装的系统还没有部署任何东西。纯操作系统至少需要几十G的磁盘空间和几G的内存。假设我有一台16G内存的机器,需要部署三个应用,那么使用虚拟机技术可以这样划分:在本机上开三个虚拟机,在每个虚拟机上部署一个应用,VM1占用2G内存,VM2占用1G内存,VM3占用4G内存。我们可以看到虚拟本身一共占用了7G内存,所以我们没有办法划分更多的虚拟机来部署更多的应用程序,但是我们部署应用程序,我们使用的是应用程序而不是操作系统。如果有一种技术可以让我们避免在“无用”的操作系统上浪费内存,那不是很好吗?这是第一个问题,主要是操作系统太重。还有一个问题,就是启动时间的问题。我们知道操作系统的重启是很慢的,因为操作系统要从头到尾检测并加载所有应该检测的东西。分钟,所以操作系统还是太笨了。那么有没有一种技术可以让我们既获得虚拟机的好处,又克服这些缺点,从而一举实现鱼与熊掌兼得呢?答案是肯定的,这就是容器技术。什么是容器?容器的英文单词是container。其实container也就是容器的意思。集装箱绝对是商业史上的伟大发明,大大降低了远洋贸易和运输的成本。再来看看容器的好处:容器长期相互隔离,反复使用快速装卸规范。可以放回软件中的容器可以放置在港口和船上。其实容器和容器在概念上是很相似的。现代软件开发的一个主要目的是隔离。应用程序彼此独立运行,互不干扰。这种隔离并不容易实现。解决方案之一就是上面提到的虚拟机技术。部署在不同的虚拟机中,实现隔离。但是虚拟机技术存在上述缺点,那么容器技术呢?与通过操作系统隔离的虚拟机不同,容器技术只是隔离了应用程序的运行环境,但容器之间可以共享相同的操作系统,这里的运行环境是指程序所依赖的各种库和配置。从图中我们可以看出容器更加轻量,占用的资源也更少。相对于操作系统动辄几G的内存占用,容器技术只需要几M的空间,我们可以在同规格的硬件上使用大量的资源。部署容器是虚拟机无法比拟的,不同于操作系统几分钟的启动时间,容器几乎是瞬时启动。容器技术为封装服务栈提供了一种更高效的方式,太酷了。那么我们如何使用容器呢?这是关于码头工人。请注意,容器是一种通用技术,而docker只是一种实现。什么是dockerDocker是一个用Go语言实现的开源项目,可以让我们轻松的创建和使用容器。Docker将程序和程序的所有依赖打包到docker容器中,让你的程序在任何环境下都能有一致的性能,这里运行的程序的依赖就是容器就像一个容器,和容器所在的操作系统环境就像一艘货船或一个港口。程序的性能只与集装箱(container)有关,与集装箱放在哪艘货船或港口(操作系统)无关。因此,我们可以看到docker是可以屏蔽环境差异的,也就是说只要你的程序被打包进docker,程序无论运行在什么环境下,其行为都是一致的,程序员无法再显示他们的才华。又会有“在我环境中运行”,真正实现“一次构建,到处运行”。此外,docker的另一个好处是快速部署,这是互联网公司最常见的应用场景。一个原因是容器启动非常快,另一个原因是只要一个容器里面的程序运行正常,就可以保证无论在生产环境部署多少,都能正常运行。如何使用dockerdocker中有几个概念:dockerfile镜像容器其实可以简单的把镜像理解为一个可执行程序,容器就是运行的进程。那么写程序就需要源码,那么“写”一个镜像就需要dockerfile,dockerfile就是镜像的源码,docker就是一个“编译器”。因此,我们只需要在dockerfile中指定需要哪些程序,依赖哪些配置,然后将dockerfile交给“编译器”docker进行“编译”,也就是dockerbuild命令。生成的可执行程序就是image,然后你就可以运行这个image了,这个就是dockerrun命令,image运行起来之后就变成了docker容器。具体使用方法这里不再赘述。可以参考docker的官方文档,里面有详细的解释。docker是如何工作的其实docker使用的是一种通用的CS架构,也就是client-server模型。docker客户端负责处理用户输入的各种命令,如dockerbuild、dockerrun等。真正干活的其实是server,也就是dockerdemon,值得注意的是dockerclient和dockerdemon可以运行在同一台机器上。接下来,我们用几个命令来解释docker的工作流程:1.dockerbuild当我们写完dockerfile交给docker“编译”的时候,我们使用这个命令,然后client将请求转发给dockerdaemon收到请求,然后dockerdaemon根据dockerfile创建一个“可执行程序”镜像。2、dockerrun有了“可执行程序”镜像后,就可以运行程序了。接下来,使用命令dockerrun。dockerdaemon收到命令后,找到具体的image,然后加载到内存中开始执行。镜像的执行就是所谓的容器。3.dockerpull其实dockerbuild和dockerrun是最核心的两个命令。会用这两个命令就基本能用docker了,剩下的就是一些补充。那么dockerpull是什么意思呢?前面我们说过,docker中镜像的概念类似于“可执行程序”。我们在哪里可以下载别人写的应用程序?很简单,就是APPStore,就是应用商店。同样,既然image也是“可执行程序”,那有没有“DockerImageStore”呢?答案是肯定的,这就是DockerHub,docker的官方“应用商店”,你可以在这里下载给别人写好的镜像,这样你就不用自己写dockerfile了。dockerregistry可以用来存放各种镜像,任何人都可以下载镜像的公共仓库就是dockerhub。那么如何从DockerHub下载镜像,就是这里的dockerpull命令。所以这个命令的实现也很简单,就是用户通过docker客户端发送命令,dockerdaemon收到命令后向dockerregistry发送镜像下载请求,下载完成后存储到本地,这样我们就可以使用图像了。最后,我们看一下docker的底层实现。docker的底层实现是基于Linux内核提供的如下功能:NameSpace我们知道Linux中的PID、IPC、网络等资源是全局的,NameSpace机制是一种资源隔离方案。在这种机制下,这些资源不再是全局的,而是属于一个特定的NameSpace。每个NameSpace下的资源互不干扰,这使得每个NameSpace看起来就像一个独立的操作系统,但只有NameSpace是不够的。虽然controlgroups有NameSpace技术实现了资源隔离,但是进程仍然可以不受控制地访问系统资源,比如CPU、内存、磁盘、网络等。为了控制进程对容器中资源的访问,Docker使用了controlgroups技术(即cgroup)。通过cgroup,可以控制容器中进程对系统资源的消耗。例如,你可以限制一个容器使用内存的上限,它可以运行在哪些CPU上等等。有了这两种技术,容器看起来真的很像独立的操作系统。综上所述,docker是目前非常流行的技术,很多公司都在生产环境中使用它,但是docker所依赖的底层技术其实早就出现了,现在以docker的形式重新焕发活力,并且可以解决面临的问题Question,希望这篇文章可以帮助你了解docker。