本文章转自:乐字节

文章次要解说:Docker

获取更多Java相干常识能够关注公众号《乐字节》 发送:999

作为程序员咱们应怎么了解docker?

容器技术的起源

假如你们公司正在机密研发下一个“今日头条”APP,咱们权且称为明日头条,程序员本人从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中呈现问题程序员也不必放心,大能够一脸无辜的撒娇,“明明在人家的环境上能够运行的”。

测试同学测完后终于能够上线了,这时运维同学又要从新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,蹩脚,上线零碎就解体了,这时心理素质好的程序员又能够施展演技了,“明明在人家的环境上能够运行的”。

从整个过程能够看到,岂但咱们反复搭建了三套环境还要迫使程序员转行演员节约表演才华,典型的浪费时间和效率,聪慧的程序员是永远不会满足现状的,因而又到了程序员扭转世界的时候了,容器技术应运而生。

有的同学可能会说:“等等,先别扭转世界,咱们有虚拟机啊,VMware好用的飞起,先搭好一套虚拟机环境而后给测试和运维clone进去不就能够了吗?”

在没有容器技术之前,这的确是一个好方法,只不过这个方法还没有那么好。

先科普一下,当初云计算其底层的基石就是虚拟机技术,云计算厂商买回来一堆硬件搭建好数据中心后应用虚拟机技术就能够将硬件资源进行切分了,比方能够切分出100台虚拟机,这样就能够卖给很多用户了。

你可能会想这个方法为什么不好呢?

容器技术 vs 虚拟机

咱们晓得和一个单纯的应用程序相比,操作系统是一个很重而且很笨的程序,简称轻便,有多轻便呢?

咱们晓得操作系统运行起来是须要占用很多资源的,大家对此必定深有体会,刚装好的零碎还什么都没有部署,单纯的操作系统其磁盘占用至多几十G起步,内存要几个G起步。

假如我有一台机器,16G内存,须要部署三个利用,那么应用虚拟机技术能够这样划分:

在这台机器上开启三个虚拟机,每个虚拟机上部署一个利用,其中VM1占用2G内存,VM2占用1G内存,VM3占用了4G内存。

咱们能够看到虚构自身就占据了总共7G内存,因而咱们没有方法划分出更多虚拟机从而部署更多的应用程序,可是咱们部署的是应用程序,要用的也是应用程序而不是操作系统。

如果有一种技术能够让咱们防止把内存节约在“无用”的操作系统上岂不是太香?这是问题一,次要起因在于操作系统太重了。

还有另一个问题,那就是启动工夫问题,咱们晓得操作系统重启是十分慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程十分迟缓,动辄数分钟,因而操作系统还是太笨了。

那么有没有一种技术能够让咱们取得虚拟机的益处又能克服这些毛病从而一举实现鱼和熊掌的兼得呢?

答案是必定的,这就是容器技术。

什么是容器

容器一词的英文是container,其实container还有集装箱的意思,集装箱相对是商业史上了不起的一项创造,大大降低了陆地贸易运输成本。让咱们来看看集装箱的益处:

集装箱之间互相隔离

长期重复应用

疾速装载和卸载

规格规范,在港口和船上都能够摆放

回到软件中的容器,其实容器和集装箱在概念上是很类似的。

古代软件开发的一大目标就是隔离,应用程序在运行时互相独立互不烦扰,这种隔离实现起来是很不容易的,其中一种解决方案就是下面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。

然而虚拟机技术有上述提到的各种毛病,那么容器技术又怎么样呢?

与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间能够共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。

从图中咱们能够看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因而咱们能够在同样规格的硬件上大量部署容器,这是虚拟机所不能比较的,而且不同于操作系统数分钟的启动工夫容器简直刹时启动,容器技术为打包服务栈提供了一种更加高效的形式,So cool。

那么咱们该怎么应用容器呢?这就要讲到docker了。

留神,容器是一种通用技术,docker只是其中的一种实现。

什么是docker

docker是一个用Go语言实现的开源我的项目,能够让咱们不便的创立和应用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序能够在任何环境都会有统一的体现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的体现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。

因而咱们能够看到docker能够屏蔽环境差别,也就是说,只有你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是统一的,程序员再也无奈施展表演才华了,不会再有“在我的环境上能够运行”,真正实现“build once, run everywhere”。

此外docker的另一个益处就是疾速部署,这是以后互联网公司最常见的一个利用场景,一个起因在于容器启动速度十分快,另一个起因在于只有确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。

如何应用docker

docker中有这样几个概念:

  1. dockerfile
  2. image
  3. container

实际上你能够简略的把image了解为可执行程序,container就是运行起来的过程。

那么写程序须要源代码,那么“写”image就须要dockerfile,dockerfile就是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的工作流程:

1,docker build

当咱们写完dockerfile交给docker“编译”时应用这个命令,那么client在接管到申请后转发给docker daemon,接着docker daemon依据dockerfile创立出“可执行程序”image。

2,docker run

有了“可执行程序”image后就能够运行程序了,接下来应用命令docker run,docker daemon接管到该命令后找到具体的image,而后加载到内存开始执行,image执行起来就是所谓的container。

3,docker pull

其实docker build和docker run是两个最外围的命令,会用这两个命令基本上docker就能够用起来了,剩下的就是一些补充。

那么docker pull是什么意思呢?

咱们之前说过,docker中image的概念就相似于“可执行程序”,咱们能够从哪里下载到他人写好的应用程序呢?很简略,那就是APP Store,即利用商店。与之相似,既然image也是一种“可执行程序”,那么有没有"Docker Image Store"呢?答案是必定的,这就是Docker Hub,docker官网的“利用商店”,你能够在这里下载到他人编写好的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有所帮忙。

感激大家的认同与反对,小编会继续转发《乐字节》优质文章