最近在工作中使用到了Docker,尽管几年前就已经对这个名字并不陌生,但却一直没有花时间来理解它。
本文试图带着以下几个问题来认识一下Docker:Docker是怎么样出现的?Docker是什么?Docker有什么优点?
Docker为何出现
在实际的开发工作中,大家可能经历过这样的场景:测试人员提交了某个缺陷,当你试图去重现的时候,却发现在你的开发环境中并不存在这个问题;于是你跟测试人员讲没有问题,测试人员却坚称有问题;最后你花了不小的力气才发现,是开发环境和测试环境的某个软件包版本不同导致的差异。
环境配置一直是软件开发中的一大麻烦事。比如运行Java开发的应用,每换一台服务器都得下载安装JDK,配置环境变量JAVA_HOME,才能让java程序能够运行。但这并不能保证你编写的java代码一定就能够运行,因为有可能你开发时使用的JDK版本高于服务器安装的JDK版本。
环境配置如此麻烦,每换一次系统就得重新配置一次,那有的人就想到,能不能将这些系统环境和配置统统打包到一个软件里面,每次换系统只需要安装这个软件,就能完整还原出一套与之一样的系统环境出来?
很多人有使用过VMware,这个虚拟机软件可以在一台电脑上同时运行更多的Microsoft Windows、Linux、Mac OS X、DOS系统。虚拟机(virtual machine)就是带系统环境安装的一种解决方案。虚拟机看上去跟真实系统一样,对于底层来讲,虚拟机就是一个普通文件,不需要了就删掉。
虽然虚拟机可以还原出一套原始的系统环境,但使用过VMware的可能也会感受它比较明显的几个缺点:
- 硬盘使用多,一般虚拟系统文件仍然需要使用上GB的硬盘存储空间;
- 内存虚耗,及时只使用虚拟机中的一个应用,也需要足够多的内存才能使虚拟机运行起来;
- 启动慢,由于内存分配原因,虚拟机启动速度甚至可能不如原生系统,并且像用户登录这样的步骤在启动时无法跳过,一般需要等待一两分钟,浪费时间;
Docker是什么
由于虚拟机存在包括上述的这些缺点,Linux 发展出了另一种虚拟化技术:容器。
容器技术本质上讲是将程序隔离,打包的技术。容器不是模拟一个完整的操作系统,而是对进程进行隔离。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
Docker是容器的一种封装,是一个开源的应用容器引擎,可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中。
正如Docker的LOGO图标所示,Docker就像一个集装箱运送平台,每台计算机就像一个港口,各式各样的软件比作一个个集装箱,集装箱以及各个集装箱之间的关系被一起打包到运送平台里,这个平台也就是容器。有了这个容器,我们就能方便地把一批集装箱运送到其他港口,并且方便进行装载,复制和移除。
Docker有什么优点
Docker脱胎于容器。容器由于是进程级别的,相对于虚拟机而言有一些明显的优点:
- 体积更小,像alpine镜像只有几MB,就能模拟出Linux环境,这是虚拟机文件所无法达到的;
- 启动更快,容器内只有特定的应用程序,而虚拟机是整个操作系统,容器的启动几乎是秒启,完胜虚拟机;
- 性能更强,容器之间可以共享资源,并且容器只占用需要的资源,所以每台计算机可以支持上千个容器运行;
对Docker本身而言,方便快捷的软件可移植性应该是它最大的优点。当要使系统环境在不同的部署环境(比如本地,生产,测试)保持一致时,首先想到的是使用Docker,Docker可以借助镜像打包方式,将应用及依赖项打包后在其他环境批量部署。
另外,由于容器使用的资源要少得多,这就是说,在相同的硬件上如果使用Docker,可以运行更多的虚拟化服务,将为软件开发节约不少硬件成本。同时,Docker批量可重复部署的特点也会减少开发和运维的工作量,节约人工成本。
参考资料:
https://www.cnblogs.com/codelove/p/10030439.html
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html