本文来自技术分享
1、Docker介绍
一、什么是Docker
Docker是世界领先的软件容器化平台。
Docker公司开发,开源,托管在github
跨平台,支持Windows、MacOS、Linux
Docker 使用 Google 公司推出的Go语言进行开发实现,基于 Linux 内核的cgroup,namespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操做系统层面的虚拟化技术。
因为隔离的进程独立于宿主和其它的隔离的进程,所以也称其为容器。linux
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的建立和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。nginx
下面的图片比较了 Docker 和传统虚拟化方式的不一样之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操做系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有本身的内核,并且也没有进行硬件虚拟。所以容器要比传统虚拟机更为轻便。git
通俗理解:github
Docker是容器技术的表明,容器技术从本质上讲是将程序隔离、打包的技术。Docker解决了软件包装的问题,理顺了开发和运维的环境的差别,使得开发和运维能用同种语言来沟通。docker
什么是Docker?官方的解释:Docker是一个开源的项目,能够用来将任何应用以轻量级容器的形式来打包、发布和运行。ubuntu
类比:能够粗糙地理解为轻量级的虚拟机。它和虚拟机某种程度上完成一样的任务:就是把一个应用程序放在一个独立的环境里来运行。安全
Docker不是虚拟机!服务器
Host_OS:宿主机网络
Hypervisor:虚拟层,虚拟出硬件运维
VM在虚拟层上安装彻底独立的Guest OS,在里面运行各类个样的程序。每一个虚拟化应用程序不只包括应用程序(可能只有10 MB)、必要的二进制文件和库,还包括整个客户操做系统(可能有10 GB)。
Docker在Docker Engine层上面运行各类程序,利用了Host OS里的NameSpace,ControlGroup等来作到将应用程序分离。Docker Engine容器仅包含应用程序及其依赖项。它在主机操做系统的用户空间中做为独立进程运行,与其余容器共享内核。所以,它享受了VM的资源隔离和分配好处,可是更加便携和高效。
二、为何要用Docker
更高效的利用系统资源
因为容器不须要进行硬件虚拟以及运行完整操做系统等额外开销,Docker对系统资源的利用率更高,不管是应用执行速度,内存消耗以及文件存储速度,都要比传统虚拟机技术更高效。所以,相比虚拟机技术,一个相同配置的主机,每每能够运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务每每须要数分钟,而Docker容器应用,因为直接运行与宿主内核,无序启动完整的操做系统,所以能够作到妙级,甚至毫秒级的启动时间,大大的节约了开发,测试,部署的时间。
一致的运行环境
开发过程当中一个常见的问题是环境一致性问题,因为开发环境,测试环境,生产环境不一致,致使有些bug并未在开发过程当中被发现,而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。从而不会再出现(这段代码在我机器上运行没问题啊)zz这类问题。
持续交付和部署
对于开发和运维人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行。
使用Docker能够经过定制应用镜像来实现持续集成,持续交付,部署。开发人员能够经过Dockerfile来进行镜像构建,并结合持续集成系统进行集成测试,而运维人员则能够在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署
更轻松的迁移
因为Docker确保了执行环境的一致性,使得应用的迁移更加容易,Docker能够在不少平台上运行,不管是物理机,虚拟机,公有云,私有云,甚至是比较本,其运行结果是一致的,所以用户能够很轻易的将在一个平台上运行的应用,迁移到另外一个平台上,而不用担忧运行环境的变化致使应用没法正常运行的状况。
更轻松的维护和扩展
Docker使用的分层存数以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得很是简单,此外,Docker团队同各个开源项目团队一块儿维护了一大批高质量的官方镜像,既能够直接在生产环境使用,又能够做为基础进一步定制,大大的下降了应用服务的镜像制做成本。
三、基本概念
镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。
3.1 镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建以后也不会被改变。
分层存储
镜像只是一个虚拟的概念,其实际体现并不是由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
Union FS
联合文件系统是(Union FS)是linux的存储技术,也是Docker镜像的存储方式。 它是分层的文件系统,将不一样目录拉到同一个虚拟目录下。下图展现了Docker用Union FS 搭建的分层镜像:(好比最下层是操做系统的引导,上一层是Linux操做系统,再上一层是Tomcat,jdk,再上一层是应用代码)
这些层是只读的,加载完后这些文件会被当作是同一个目录,至关于只有一个文件系统。
咱们能够经过docker info查看镜像的一些信息,能够看到存储驱动用的并非Union FS 而是overlay2,overlay也是一个联合文件系统,因此上述主要介绍联合文件系统的概念,至于这些存储驱动的演变过程和优缺点,能够阅读http://dockone.io/article/1765。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在本身这一层。(好比,删除前一层文件的操做,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,可是实际上该文件会一直跟随镜像。所以,在构建镜像的时候,须要额外当心,每一层尽可能只包含该层须要添加的东西,任何额外的东西应该在该层构建结束前清理掉。)
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至能够用以前构建好的镜像做为基础层,而后进一步添加新的层,以定制本身所需的内容,构建新的镜像。
3.2 容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 同样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不一样,容器进程运行于属于本身的独立的命名空间。所以容器能够拥有本身的 root 文件系统、本身的网络配置、本身的进程空间,甚至本身的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操做同样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也由于这种隔离的特性,不少人初学 Docker 时经常会混淆容器和虚拟机。
前面讲过镜像使用的是分层存储,容器也是如此。每个容器运行时,是以镜像为基础层,在其上建立一个当前容器的存储层,咱们能够称这个为容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器同样,容器消亡时,容器存储层也随之消亡。所以,任何保存于容器存储层的信息都会随容器删除而丢失。
3.3 仓库
镜像构建完成后,能够很容易的在当前宿主机上运行,可是,若是须要在其它服务器上使用这个镜像,咱们就须要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中能够包含多个仓库(Repository);每一个仓库能够包含多个标签(Tag);每一个标签对应一个镜像。
一般,一个仓库会包含同一个软件不一样版本的镜像,而标签就经常使用于对应该软件的各个版本。咱们能够经过 <仓库名> : <标签> 的格式来指定具体是这个软件哪一个版本的镜像。若是不给出标签,将以 latest 做为默认标签。(以 Ubuntu 镜像为例,ubuntu 是仓库的名字,其内包含有不一样的版本标签,如,14.04, 16.04。咱们能够经过 ubuntu:14.04,或者 ubuntu:16.04 来具体指定所需哪一个版本的镜像。若是忽略了标签,好比 ubuntu,那将视为 ubuntu:latest。)
仓库名常常以两段式路径形式出现,好比 huangbaoling/nginx-proxy,前者每每意味着 Docker Registry 多用户环境下的用户名,后者则每每是对应的软件名。但这并不是绝对,取决于所使用的具体 Docker Registry 的软件或服务。