在传统的软件部署方式中,程序员需要把要发布的应用程序打成包发给运维人员,然后由运维人员在生产环境进行部署。当随着应用的版本迭代越来越多,应用的依赖库版本错综复杂,往往会出现开发环境和生产环境不一致的情况发生,而且由于多数情况下采用微服务的架构,每个团队都有可能使用不同版本的依赖库,并有可能在升级的时候替换掉他们,因而同一个应用程序采用相同版本的依赖库是多么的重要。
当应用程序比较少或者都是一些单体应用的时候,可以利用虚拟机来隔离每个服务,通过虚拟机的虚拟化技术来为每个应用程序提供不同的运行环境。但是当拆分为微服务之后,每个服务会变的小而多,这个时候如果为每个应用程序分配一个虚拟机,资源耗费是相当多的,但是每个虚拟机上运行多个微服务又会发生依赖库版本的问题,如果有一种起到类似虚拟机隔离作用,但是成本比虚拟机低很多的技术该有多好?
容器技术
得益于linux的容器技术,现代开发者已经由传统的虚拟机方式转向linux容器技术。容器类似虚拟机,但比虚拟机开销要小的多,并且同样把每个应用都隔离开来。容器技术允许你在同一台服务器上运行多个服务,而且还可以根据每个服务提供不同的运行环境。
虚拟机中的进程运行在虚拟机的操作系统中,而运行在容器中的进程实际是运行在宿主机的操作系统中,只是表面看来好像运行在容器的沙盒一样,但实际上确实是和其他进程相互隔离的。
linux之所以能实现容器这种功能,得益于它的命名空间和控制组。linux命名空间时每个进程相互隔离,只能看到它自己的系统资源,例如:文件,进程,网络等,而linux的控制组技术能够限制每个进程可以使用的资源的最大量。一个技术进行隔离,一个技术进行限制,这就导致了容器技术要比虚拟机要灵活的多。
虚拟机和容器
一个虚拟机的正常运行,需要运行自己的一系列系统进程,只是这些系统进程就耗费了大量资源。容器和虚拟机相比较就显得轻量的多,它允许在相同配置的硬件基础上运行更多数量的应用。虽然容器本身也有消耗,但是和虚拟机系统的消耗比起来要小的多。
虚拟机是利用软件技术将物理硬件虚拟化为多个虚拟硬件资源,从而被每个虚拟机的操作系统使用。虚拟机里的进程会进行虚拟机的系统调用,虚拟机的指令会通过软件技术变为宿主机上真正的cpu指令,而容器中的进程执行的指令不需要任何的虚拟化过程,直接会被cpu执行,所以单纯在执行指令的过程中,虚拟机要比容器的执行过程要长,资源耗费要多。
Docker介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
Docker容器平台的出现把linxu容器化技术推向了一个高潮,它不仅简化了程序部署的方式,更简化了打包应用和依赖,使容器真正做到了在不同的操作系统之间移植,甚至一个完整的操作系统也可以被打包成一个可移植的镜像。
运行docker包的前提是,目标机器一定要运行docker。
当你的应用被打包成docker镜像之后,无论在什么操作系统中运行,它都能看见相同的文件,相同的依赖库,因为这些依赖库已经被一起打包到了docker镜像中,即使目标机器上安装了正确的版本的依赖库,它也会只用镜像中的依赖库,这就是程序员期盼的无论何时何地的环境一致性呀