Docker是什么
Docker是一个开源的应用容器引擎,基于GO语言开发的,并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似IPhone的app)更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
为什么要使用Docker?
1.合作开发的时候,在本机可以跑,别人的电脑跑不起来。
这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多环境,比如jdk、tomcat、spring等等。当该应用程序需要在别的电脑上运行,则该电脑要安装好所需的环境。当这些环境中某一项版本不一致的时候,可能就会导致应用跑不起来。而如果使用Docker则可以直接将应用程序和环境(所需的依赖)打包成镜像,这时哪台电脑需要跑该应用程序则直接从仓库中拉取镜像,直接运行在容器中即可。
2.服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了。
这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
3.公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器。
在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就跑多少容器,极大地提高了部署效率。
Docker与虚拟机的区别
关于Docker与虚拟机的区别,我在网上找到的一张图,非常直观形象地展示出来,话不多说,直接上图。
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
另外在调用宿主机的CPU、磁盘等等这些资源的时候,拿内存举例,虚拟机是利用Hypervisor(管理程序)去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine(引擎)去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。
Docker的优点
1.简化程序。
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。
2.避免选择恐惧症。
如果你有选择恐惧症,还是资深患者。那么你可以使用 Docker 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3.节省开支。
.一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
Docker的不足
- Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用(即使可以在其上安装,不过也是基于Linux虚拟机的)
- Docker实例(容器)是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。
- Docker用于应用程序时是最有用的,但并不包含数据。日志,跟踪和数据库等通常应放在Docker容器外。
- 容器随着用户进程的停止而销毁,容器中的log等用户数据不便收集。
- Docker对disk(磁盘)的管理比较有限。
- 网络管理相对简单,主要是基于namespace隔离。
- LXC是基于cgroup等linux kernel(核心)功能的,因此容器的guest系统只能是linux base的。
- 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container(容器)公用一部分的运行库.。
- cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)。