【docker系列】之概念篇

docker是什么

​ 网上有一个段子,说测试测出来bug后反馈给开发,然后开发不假思索的说:“不可能!在我这里好好的,肯定是你的环境有问题!”虽然段子是有调侃的意味,但是也确实会存在这种开发环境和测试环境不一致导致有些不必要的bug出现的情况。那么docker其中的一个用处就是解决环境配置差异的问题。

​ 现在微服务大肆流行,甚至刚刚毕业的学生都要求能了解甚至掌握微服务,那么服务越多,是不是对于运维来说压力也就越大?那么多的服务如果要重启一下,想想都头大,没关系,docker来帮你管理。

​ 现在的环境,基本上都是集群,一台机器部署一次,累到吐,明明很有技术含量的职业,整的像是搬砖一样的体力活,能不能轻松点?放心,有docker。
【docker系列】之概念篇

​ 说了那么多,docker到底是个啥?(浓浓的广告感)首先,我们看下他的图标,一条鲸鱼上有很多小方块,其实那是集装箱,而那条鲸鱼更像是一条船,每每看到这个图标,我就老实想起来CF的运输船地图。其实那条鲸鱼就可以理解为docker,上边驼的一个个集装箱就是容器,每一个容器就运行着一个服务,比如redis服务,tomcat服务,mysql服务等等,而且每个箱子就是一个独立的个体,互不干扰,比如一台服务器上运行了两个tomcat,但是肯定不能都是80端口,但是有了docker就不一样了,大路朝天,各走一边,你用80我也用80,都在各自的箱子里(容器里)运行,等到开发完了,我把这条鱼整个的打包给你(运维),你打开包袱直接用,省不省力?开不开心?还有没有推脱bug的借口了?

​ docker能形成上述功能靠的是什么呢?就是容器技术。容器技术其实也是虚拟化技术的一种,虚拟化技术最常见的就是虚拟机了,比如在一台windows系统上使用vm虚拟一个Linux系统,但是docker要比虚拟机要轻巧的多。一个虚拟机要几个G,启动一次要好几分钟,但是一个docker镜像是M级别的甚至是KB级别的,启动的话也是秒启,简直不要太快!

docker和虚拟机的比较

  • 虚拟机的启动,要虚拟出从底层的硬件,到系统内核,到整套的操作系统,相当于一套电脑了,是比较笨重的。
  • Docker的容器技术,使得容器内的应用依托于宿主机的硬件和内核,直接运行在宿主机上,不需要虚拟自己的了,轻量了很多,这也是为什么容器启动要比虚拟机启动要快很多的原因。

【docker系列】之概念篇

docker的三大组件

镜像(image)

​ 镜像对比java的概念,就像是一个类,应用到生活中呢,也比较像是印钞机中的印钞钢板,用这一个钢板刷刷刷的印出来很多纸币(容器),就像是一个类可以new出来多个对象(容器)一样。

​ 那到底什么是镜像呢,镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含一些为运行时准备的配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建后也不会改变。

分层存储(类似于洋葱结构)

​ 因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

​ 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

​ 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像

容器(container)

​ 服务实际运行的地方,比如一个tomcat服务在一个tomcat容器内运行,而一个容器是通过一个镜像来创建的,一个镜像可以创建多个容器。

​ 容器可以被创建、启动、停止、删除、暂停等。

​ 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。所以就像鲸鱼上的箱子一样。

仓库(repository)

存放镜像的地方,有点类似于git的仓库,所需要的镜像可以从仓库上拉取下来。同样的,仓库也分公有仓库和私有仓库。默认的仓库就是docker hub。

一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。