Docker简介

1、什么是Docker?

Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并听从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行同样。有了Docker,就不用担忧环境问题。
整体来讲,Docker的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。

 

2、Docker的概念

Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。

集装箱化的优势:nginx

  • 灵活:即便是复杂的应用程序也可封装。
  • 轻量级:容器利用并共享主机内核。
  • 便携式:您能够在本地构建,部署到云上并在任何地方运行。
  • 可扩展性:您能够增长和自动分发容器副本。
  • 可堆叠:您能够垂直堆叠服务并及时并及时堆叠服务。

3、images和容器

经过运行images启动容器,一个images是一个可执行的包,其中包括运行应用程序所须要的全部内容-代码,运行时,库、环境变量和配置文件。
容器时images运行时示例-当被执行时(即,images状态,或者用户进程)在内存中,可使用命令查看正在运行容器的列表docker ps,就像在Linux中同样。

4、虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它能够在一种操做系统里面运行另外一种操做系统,好比在Windows系统里面运行Linux系统。应用程序对此毫无感知,由于虚拟机看上去跟真丝系统如出一辙,而对于底层系统来讲,虚拟机就是一个普通文件,不须要了就删掉,对其它部分毫无影响。

虚拟机的缺点:docker

  • 资源占用多:虚拟机会独占一部份内存和硬盘空间。它运行的时候,其余程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1M,虚拟机依然须要几百MB的内容才能运行。
  • 冗余步骤多:虚拟机是完整的操做系统,一些系统级别的操做步骤,每每没法跳过,好比用户登陆。
  • 启动慢:启动操做系统须要多久,启动虚拟机就须要多久。可能要等几分钟,应用陈故乡才能真正运行。

5、Linux容器

因为虚拟机存在这个缺点,Linux发展出了另外一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。
Linux容器不是模拟一个完整的操做系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来讲,它接触到的各类资源都是虚拟的,从而实现与底层系统的隔离。
因为容器是进程级别的,相比虚拟机又不少优点。
  • 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。因此,启动容器至关于启动本机的一个进程,而不是启动一个操做系统,速度就快不少。
  • 资源占用少:容器只占用须要的资源,不占用那些没有用到的资源;虚拟机因为是完整的操做系统,不可避免要占用因此资源。另外,多个容器能够共享资源,虚拟机都是独享资源。
  • 体积小:容器只要包含用到的组件便可,而虚拟机是整个操做系统的打包,因此容器文件比虚拟机文件要小不少。总之,容器有点像轻量级的虚拟机,可以提供虚拟化的环境,可是成本开销小得多。

6、容器和虚拟机

一个容器中运行原生Linux和共享主机与其它容器的内核,它运行一个独立的进程,不占用任何其它可执行文件的内存,使其轻量化。数据库

相比之下,虚拟机(VM)运行一个完整的“客户”操做系统,经过虚拟机管理程序虚拟访问主机资源。通常来讲,虚拟机提供的环境比大多数应用程序须要的资源多。ubuntu

7、Docker产生的目的就是解决如下问题

  • 环境管理复杂:从各类OS到各个中间件再到各类App,一款产品可以成功发布,做为开发者须要关心的东西太多,且难于管理,这个问题在软件兴业中广泛存在并须要直接面对。Docker能够简化部署多种应用实例工做,好比Web应用、后台应用、数据库应用、大数据应用好比Hadoop集群、消息队列等等均可以打包成一个image部署。
  • 云时代的到来:AWS的成功,引到开发者将应用转移到云上,解决来硬件管理的问题,然而软件配置和管理香瓜的问题依然存在。Docker的出现正好能帮助软件开发着开阔思路,尝试新的软件管理的方法解决这个问题。
  • 虚拟化手段的变化:云时代采用标配硬件来下降成本,采用虚拟化手段来知足用户按需分配的资源需求以及保证可用性和隔离性。然而不管是KVM仍是Xen,在Docker看来都是在浪费资源,又难于管理,更加轻量级大LXC更加灵活和快速:
  • LXC的便携性:LXC在Linux 2.6的Kernel里就已经存在了,可是其设计之初并不是为云计算考虑,缺乏标准化的描述手段和容器的可便携性,决定其构建出的环境难于分发和标准化管理(相对于KVM之类的image和sanpshot的概念)。Docker就在这个问题上做出了实质性的创新方法。

8、Docker的用途

Docker的主要用途,目前又三大类:安全

  • 提供了一次性的环境:好比,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
  • 提供弹性的云服务:由于Docker容器能够随开随关,很适合动态扩容和所容。
  • 组建微服务架构:经过多个容器,一台机器能够跑多个服务,所以在本机就能够模拟出微服务架构。

9、基本概念

Docker镜像

操做系统分为内核和用户空间,对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就至关因而一个root文件系统。
Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建以后也不会被改变。

分层存储

由于镜像包含系统完整的root文件系统,其体积每每是庞大的,所以在Docker设计时,就充分利用Union FS技术,将其设计为分层存储的架构。因此严格来讲,镜像并不是是像一个ISO那样的打包文件,镜像只是一个虚拟的概念,其实际体现并不是由一个文件组成,而是由一组文件系统组成,或者说,由多层系统联合组成。
镜像构建时会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在本身这一层,好比,删除前一层文件的操做,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,可是实际上该文件会一直跟随镜像。所以,在构建镜像的时候,须要额外当心,每一层尽可能只包含该层须要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至能够用以前构建好的镜像做为基础层,而后进一步添加新的层,以定制本身所须要的内容,构建新的镜像。

Docker容器

镜像(image)和容器(container)的关系,就像是面向对象程序设计中的类和实例同样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不一样,容器进程运行于属于本身的独立的命名空间。所以容器能够拥有本身的root文件系统、本身的网络配置、本身的进程空间,甚至本身的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立宿主的系统下操做同样。这种特性使容器封装的应用比直接在宿主运行更加安全。
前面讲过镜像使用的是分层储存,容器也是如此。每个容器运行时,是以镜像为基础层,在其上建立一个当前容器的存储层,能够称这个味容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器同样,容器消亡时,容器存储层也随之消亡。所以,任何保存于容器存储层的信息都会随容器删除而丢失。
按照Docker最佳实践的要求,容器不该该向其存储层写入任何数据,容器存储层要保持无状态化。全部的文件写入操做,都应该使用数据卷(volume)、或者绑定宿主目录,在这些位置的读写会跳过存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。所以,使用数据卷后,容器删除或者从新运行以后,数据却不会丢失。

仓库

Docker Registry

镜像构建完成后,能够很容易的在当前宿主机上运行,可是,若是须要在其它服务器上使用这个镜像,咱们就须要一个集中的存储、分发镜像的服务,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公开服务

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下载速度会提升不少。
相关文章
相关标签/搜索