Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并听从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样。有了Docker,就不用担忧环境问题。
整体来讲,Docker的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。
集装箱化的优势:nginx
经过运行images启动容器,一个images是一个可执行的包,其中包括运行应用程序所须要的全部内容-代码,运行时,库、环境变量和配置文件。
容器时images运行时示例-当被执行时(即,images状态,或者用户进程)在内存中,可使用命令查看正在运行容器的列表docker ps,就像在Linux中同样。
虚拟机(virtual machine)就是带环境安装的一种解决方案。它能够在一种操做系统里面运行另外一种操做系统,好比在Windows系统里面运行Linux系统。应用程序对此毫无感知,由于虚拟机看上去跟真丝系统如出一辙,而对于底层系统来讲,虚拟机就是一个普通文件,不须要了就删掉,对其它部分毫无影响。
虚拟机的缺点:docker
因为虚拟机存在这个缺点,Linux发展出了另外一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。
Linux容器不是模拟一个完整的操做系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的隔离。
因为容器是进程级别的,相比虚拟机又不少优点。
一个容器中运行原生Linux和共享主机与其它容器的内核,它运行一个独立的进程,不占用任何其它可执行文件的内存,使其轻量化。数据库
相比之下,虚拟机(VM)运行一个完整的“客户”操做系统,经过虚拟机管理程序虚拟访问主机资源。通常来讲,虚拟机提供的环境比大多数应用程序须要的资源多。ubuntu
Docker的主要用途,目前又三大类:安全
操做系统分为内核和用户空间,对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就至关因而一个root文件系统。
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建以后也不会被改变。
由于镜像包含系统完整的root文件系统,其体积每每是庞大的,所以在Docker设计时,就充分利用Union FS技术,将其设计为分层存储的架构。因此严格来讲,镜像并不是是像一个ISO那样的打包文件,镜像只是一个虚拟的概念,其实际体现并不是由一个文件组成,而是由一组文件系统组成,或者说,由多层系统联合组成。
镜像构建时会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在本身这一层,好比,删除前一层文件的操做,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,可是实际上该文件会一直跟随镜像。所以,在构建镜像的时候,须要额外当心,每一层尽可能只包含该层须要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至能够用以前构建好的镜像做为基础层,而后进一步添加新的层,以定制本身所须要的内容,构建新的镜像。
镜像(image)和容器(container)的关系,就像是面向对象程序设计中的类和实例同样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不一样,容器进程运行于属于本身的独立的命名空间。所以容器能够拥有本身的root文件系统、本身的网络配置、本身的进程空间,甚至本身的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立宿主的系统下操做同样。这种特性使容器封装的应用比直接在宿主运行更加安全。
前面讲过镜像使用的是分层储存,容器也是如此。每个容器运行时,是以镜像为基础层,在其上建立一个当前容器的存储层,能够称这个味容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器同样,容器消亡时,容器存储层也随之消亡。所以,任何保存于容器存储层的信息都会随容器删除而丢失。
按照Docker最佳实践的要求,容器不该该向其存储层写入任何数据,容器存储层要保持无状态化。全部的文件写入操做,都应该使用数据卷(volume)、或者绑定宿主目录,在这些位置的读写会跳过存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。所以,使用数据卷后,容器删除或者从新运行以后,数据却不会丢失。
镜像构建完成后,能够很容易的在当前宿主机上运行,可是,若是须要在其它服务器上使用这个镜像,咱们就须要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。 一个Docker Registry中能够包含多个仓库(Repository);每一个仓库能够包含多个标签(tag);每一个标签对应一个镜像。 一般,一个仓库会包含一个软件不一样版本的镜像,而标签就经常使用于对应该软件的各个版本。咱们能够经过<仓库名>:<标签>的格式来指定具体是这个软件那个版本的镜像。若是不给出标签,将以laest做为默认标签。 以ubuntu镜像为例,ubuntu是仓库的名字,其包含有不一样的版本标签,如,14.04,16.04。咱们能够经过ubuntu:14.04或者ubuntu:16.04来具体指定所须要哪一个版本的镜像。若是忽略了标签,好比ubuntu,那将视为ubuntu:latest。 仓库名常常以两段式路径形式出现,好比jwilder/nginx-proxy,前者意味着Docker Registry多用户环境下的用户名,后者则每每是对应的软件名。但这并不是绝对,取决于所使用的具体Docker Registry的软件或服务。
Docker Registry公开服务是开放给用户使用、容许用户管理镜像的Registry服务。通常这类公开服务容许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。除此之外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;Google的Google Container Registry,Kubernetes的镜像使用的就是这个服务。
在国内访问这些服务可能会比较慢,郭恩ID饿一些云服务商题提供了针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有阿里云加速器、DaoCloud加速器等。使用加速器会直接从国内的地址下载Docker Hub的镜像,比直接从Docker Hub下载速度会提升不少。