共计 4039 个字符,预计需要花费 11 分钟才能阅读完成。
本文章转自:乐字节
文章次要解说: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 中有这样几个概念:
- dockerfile
- image
- 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 有所帮忙。
感激大家的认同与反对,小编会继续转发《乐字节》优质文章