Docker的原理和基本概念

最近项目部署服务器的时候,都切换到了docker部署,本人还是习惯于之前的tomcat/端口号/webapps路径下放war包的方式,自动解压更新覆盖,只需要在tomcat/bin目录下重启tomcat就可以了。用习惯了,确实觉得顺手,也不太想去接受docker部署这种方式,感觉很麻烦,一堆新的概念,什么映射、镜像、宿主机等等,这可能就是惰性吧,抗拒一些新生的事务,只想依赖旧习惯,这样是无法进步的,特别是软件行业。

其实直接在tomcat下部署是有缺点的,先不说跟docker部署比起来的优缺点,只说老方法本身,第一是占用空间大,第二是重启不方便,只能以tomcat为单位重启,第二级是端口,第三级是应用。也就是说,其实你只想更新一个应用而已,但是你却要重启整个tomcat目录下所有的端口号中的所有应用,重新加载的东西会非常多,包括每一个应用的每一个接口,一个部署多个应用的tomcat重启时间往往高至分钟级,非常耗资源。第三是切换目录,要在webapps(应用)、logs(日志)、bin(指令)这三个目录中经常切换,也算个不大不小的不方便吧。

出于以上考虑,还是决定好好了解一下docker,毕竟据我所知,上述很多问题,使用docker都可以解决。

一.docker是什么?

翻译一下,docker直译过来是码头工人/码头装卸工。

docker是一个开源的容器引擎,开发者将应用包和依赖包打包到一个轻量级、可移植的镜像中,然后发布到Linux上,windows好像目前还有些不确定性。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。

这里有一个概念,沙箱模式。以java来说,沙箱模式就是JVM,你的java代码不可能无限地获取你整个计算机的所有资源,沙箱模式将java能调动的资源限定在了jvm(虚拟机)范围内,严格了限制了对于本地系统的资源访问,包括CPU\内存\文件系统\网络资源等,JVM资源提前分配,就那么大,你翻天也翻出不来。这种模式就是为了限定资源。

Docker包括三个基本概念:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

镜像

镜像是一堆只读层的集合,但是对外是一个统一的特殊文件系统。容器依赖于镜像来创建,容器就是镜像的实体表现,结构上与镜像一样,最上层多了一个可读写层。镜像按照我个人的理解,就是一个模板。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。Dcokerfile就是用来构建镜像的配置文件。

你的镜像是什么样子,创建出来的容器就是什么样子,基础镜像要尽可能的小。

再多添一句,镜像是静态的,一旦镜像动态了,那就是容器。容器=运行起来的镜像。

容器与虚拟机

还有个概念,容器。容器通俗来讲,就是个放东西的地方,是对应用程序及其依赖关系的封装。最大的优点是①可移植性②轻量级③与主机OS共享资源,效率高,损耗低。

其实可以个人感觉可以把容器看成一个轻量化的虚拟机,不太一样,虚拟机模拟了硬件,模拟了cpu、硬盘等等,通过一系列硬件,自己复刻了一整套的OS,完全独立与隔离。容器并没有模拟硬件,虚拟化的是OS,所以容器是共享那套OS的资源的,从这个角度看,容器的隔离级别其实没有虚拟机高。

有个tips讲一下,后面应用的时候,用到了。我们知道其实容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

上面这一段话,意味着什么看出来了吗,没错,是日志。一个容器你可以摧毁,但是如果你没有绑定宿主目录,而是把日志写在了容器本身,那么将容器的生命周期结束时,一切都会被摧毁,日志也不复存在,所以日志要绑定宿主目录,这一点在实际使用中,是十分必要的。从访问的角度,也是写在宿主机方便些。

仓库

仓库是一个集中存放镜像文件的地方。仓库分为两种,私人和公共的,有点类似于java的依赖包,你可以自己写,也可以从官方标准公开库里找寻你需要的,把它下载下来使用。官方的公开服务仓库是Docker Hub,也是默认的仓库,拥有大量高质量的官方镜像可供使用。

 

了解完一些名词概念之后,我列几个docker的特点:

①通过以上三个概念:仓库、镜像和容器各自的概念和关系之后,我们对于docker其实有了大概的了解。docker是怎么运作的呢,首先,到仓库把想要的镜像拿到,然后匀一条命令把镜像运行起来,这时候就形成了容器。

①docker基于linux内核kernel,对进程进行封装隔离,属于OS层面的虚拟化技术。隔离的进程独立与宿主和其他隔离的进程,因此也称之为容器。容器就是一个一个在巨轮上的集装箱,封闭式,谁也不影响谁。

②docker是一个软件容器平台,一切都为了容器服务,包括image等。容器创建简单、方便、易操作。

docker的优势点:

  • Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
  • 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
  • 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
  • 善于处理集中爆发的服务器使用压力。——弹性伸缩,快速扩展
  • 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
  • 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

以上的启动时间、隔离性正是相比于传统tomcat部署方式完美弥补的点。

你可能感兴趣的:(服务端,docker,linux)