1 概述
Docker镜像技术通过创新性的设计,彻底解决了应用交付领域的核心痛点,已经成为已成为云原生时代的事实标准。其核心价值在于通过标准化封装实现"一次构建,处处运行",从根本上改变了软件交付的生命周期。
2 解决的问题
2.1 打包问题
一个可执行程序包,可能是各种各样的语言编写出来的,对环境有不同的要求。比如Java语言的jar包,需要有JVM环境才能够执行;Python的代码包,需要安装Python和用pip安装一系列依赖包环境才能执行。
把这个可执行包部署到不同的操作系统时,根据不同的操作系统的要求,需要做一些不同的环境变量等配置。比如Java环境在Windows里配环境变量和在Linux环境配环境变量的方式不一样,在部署jar包的时候,在不同的环境上部署的脚本要写成不一样的。
在执行可执行程序包的时候,不同语言、不同操作系统,需要提供不同的启动脚本。
docker镜像则创造性地把可执行包所依赖的环境、配置、启动脚本全部打包成一个镜像包,里面的环境甚至还包含了一整套Linux的目录和文件,额外再根据需要加上相关的依赖包、配置,指定好启动脚本。这样的一个包,不管在windows、Linux、iMac,还是在物理机、虚拟机、各种云平台,都可以用一个简单的命令就可以运行。这代表着可以很轻松地在各个环境中迁移,真正做到打包一次,各个平台执行。
2.2 部署问题
要部署可执行包,除了准备好可执行包,还需要根据不同的操作系统,安装相关的依赖,进行相关的配置,准备相关的启动脚本等,然后再安装可执行包、执行可执行包,完成部署。
由于docker镜像把操作系统等环境、需要的依赖、配置、启动脚本等都打包到镜像包里了,原来需要根据不同语言、不同操作系统等进行的一系列准备工作全都消失了,只剩下拉取镜像包和执行镜像包两个动作,这样部署就非常简单。
2.3 资源利用问题
传统的部署,为了在一台物理机上部署多应用,一般采用虚拟机的方式。虚拟机由于虚拟化管理程序,在Linux上运行Virtual Machine Manager(VMM),在windows上运行Hypervisor,这些虚拟化管理程序需要占用10%~30%的CPU、内存等资源。而Docker是通过linux的Cgroups、Namespace的配置来进行隔离,属于内核级的虚拟化,占用的资源比虚拟机节省80%以上,整体性能可以提高1~2个数量级。
2.4 更新问题
在需求变动后,打包、部署等都需要更新。由于docker的镜像包是一层层叠加而成的,如果要修改的话,只需要修改某些层或者增减某些层,然后重新打包即可。这些内容一般通过dockerfile来进行维护,这些改动只需要在dockerfile上调整,然后重新打包即可,非常的方便。
镜像包更新后,docker上拉取包也比较高效,只需要拉取更新的层即可。docker的创建和删除容器的速度也很快,删除掉老的容器,再创建和启动新版本镜像的容器即可。当部署的服务器比较多,还可以用相关的调度工具,逐步把所有的应用都更新了。