[容器化技术之一] Docker简介

一、什么是Docker?

  提到容器化技术,就必须提到docker,下面从历史来源、功能作用、技术本质几方面谈谈什么是Docker。

1、历史来源

  Docker最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并r o K N n P于2013年E m !3月以Apache 2.0授权协议开源,后来加入Linux基金会,并推动c 2 4成立开放容器联盟(OCI)

2、功能s l D I作用

  Docker中文网是这样介绍Docker:W ] B“Docker是一个开源U = N w W C 5 e的引擎,可以轻松地为任何应用创建一个轻量级、可移植、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack集群和其他的基础应用平台。”

  Docker通常用于如下场景:

  • w~ D j 1 ! a 2eb应用的自动化打包和发布;
  • 自动化测试和持续集成、发布;
  • 在服务型环境中部署和调整数据库或其他的后台应用;
  • 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境

3、技术本质

  Docker的前身是LXC(Linux Container),使用Go语言开发实现,基于Linux内核的cgroup、namespace,以及AUFS累2 = = C V的Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于提供了轻量级的虚V ; ~ R Z拟化,隔离了进程和资源,而且不需要提供指令解释机制以及全虚拟化的T 7 * , 8 ] ) O其他复杂性,因此被称为容器。容器能有效地将由单P { p个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。

  Docker在容器的基础上,进行了进一步的封装,从文件系统、网p * z y N & ,络互联到进程隔离等等,极大简化了容器的创建和维护,使得Docker技术比传统的虚拟机技术更为轻便、快捷。

  Docker 的容器利用了 LXC,管理利用了 namespaces 来做权限的控制和隔离,cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率,而这些技术都不是 Docker 独创。

二、Docker和传统虚拟机的对比

  容器与虚拟机有着类似8 , ; | H l r 1的资源隔离和分配的优点,但不同的架构方法使容器能够更加便v U F # ` q , a携,高效; v l + ^ 8 b Q /等。

1、传统虚拟机架构

  使用虚拟机运行多个互相隔离的应用时,如下图:

[容器化技术之一] Docker简介

  从下到上理解上图
基础设施(Infrastructure):它可以是你得个人电脑、数据中心的服务器,或者是云主机。
主操作系统(Host Operating System):你的个人电脑智商,运行的可能是Linux、Windows、MacOS。
虚拟机管理系统(Hype- ~ ( ~ -rvisor):利] s b用Hypervisor,可以在主操作系统智商运行多个不同的从操作系统,实现硬件资源虚拟化,常用的软件有Virtual Box、VMware Workstation等。
从操作系统(Guest Operating Ss r + s Nystem):假u } J M ! { -如需要运行3个互相隔离的应用,则需要使用Hypervis$ S n u y ` hor启动3个从操作系统,也就是3个虚拟机。通常虚拟机都非常大,小的有几百M,大的有几个G,同时运行多个虚拟机,可能会将你的主机的CPU和内存资源全部耗尽。
各种依赖:每一个从操作系统都需要安装许多依赖。如果你的应用W 7 { 0 G 8 5 j需要连接PostgreSQL的haunt,则需要安装libpq-dev;如果使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
应用:安装依赖之后,就可以在各个从操作系统分别运行应G 8 T A j d ~ X用了,这样各个应用就是互相隔离的。

  每个虚拟机都包括应用H + J d ) c 8 c程序、必要的二进制文件和库以及一个完整的客户操作系统(Guest OS),尽管它们被分离,Q S e R它们共享并利用Y h Y | $ #主机的硬件资源,将近需要十几个 GB 的大小。

2、Docker架T x e X h i _ %

  使用Docker容器运行多个互相隔离的应用时,如下图:

[容器化技术之一] Docker简介

主操作系统(Host Operating System):所有主流的Linux发行版都可以运行Dg V Locker。对于MacO$ j [ a t q j 0 2S和Windows,也有一些办法"运行"Docker。
Docker守护进程(Docker D! T * ^ D @aemon):Docker守护进程取代了Hypervisor,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内y c Z o y存利用率上docker将会在效率上有明显优势。它是运行在操作系统之上的后台进程,负责管理Docker容器。
各种依赖:对于Docker,应用的所有依赖都打包在Docker镜像中,~ d ; B p 1Docker容器@ g . : 6 n #是基于Docker镜像创建的。
应用:应用的源代码与它的依赖都打包在Docker镜5 N c H像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

docker比虚拟机快的原因:

  docker利用的是宿主机的内核,而不需要Gg W J 6 % nuest OS。因此,单新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻c q $ i、加载操作系统内核,这是个比较费时费资源的过程, A $ 1,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的。而docker由于直接利用宿主机+ , A的操作系统,则忽略了这个过程,因此新建一个docker7 ] q X v容器只需要几秒钟。

3、对比

  Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节B * 4省大量的磁盘空间以及其他系统资源。

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般MB 一般GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

  但是技术没有好坏,只有使用的场景合不合适,虚拟机更擅长与彻底隔离整个运行环境。例如:云服务商通常采用虚拟机技术隔离不同的用户;Docker通常用于隔离不同的应用,例如前端、后端以及数据库。

[容器化技术之一] Docker简介

三、docker的优势

  • 更高效地利用系统资源
    不需要运行完整操作系统,按需使用,最大程度节省资源。

  • 更快速的启动时间
    传统的虚拟机技术启动应用服务往往需要数y b ~ L分钟,而 Docker 容器应用,由于直接运行于宿主内核,无Z q X ( X 1 r需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

  • 一致的运行环境
    开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用2 d Q ] Q运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

  • 持续交付和部署
    对开发和运维(DevOps)人员来说,最希望的就是一次创) { : % c H建或配置,可以在任h P 0 K 2 X f } 2意地方正常运} E v T { [ C C行。

 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过DockerfileP H u F P ) S s 来进行镜像构建,并t H L g X结合 持续集成(Continuous IntegZ 3 * = * yrat~ j i ! Tion) 系4 O Q % ) f统进行集成测试,而运维人员则可以A - ( x C @直接在生产环境中快速部署该( . Y M D X镜像,甚至结合 持续部署(ContinuousDelivery/De9 W Xployment) 系统进行自动. # M B P部署。

 而且使用 Dockerfis C q v y } . u Hle 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

  • 更轻松的转移
    由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多W 7 3 6 平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到* P ! b = [另一个平o e ; ? x台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  • 更轻松的维护和扩展
    Docker 使用的分层存m # f : 6 {储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批q b e高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

四、举个栗子

  服务器好比运输码头:拥有场地和各种设备(服务器硬件资源)

  服务器虚拟化好比作= s E T码头上的 v j @ * V仓库:拥有独立的空间堆放各种6 h H a Q B ( Y v货物或集装箱(仓库之间完全独立,独立S o * ^ = 5 7的应用系统和操作系统)

  Docker比作集装箱:X / }各种货物的打包(将各种应用程序和他们所依赖的运行环境打包成标准的容器,K K o容器之间隔离)

  Docker有着小巧、迁移部署快速、运行高效等特点,但隔离性比服务器虚A B ~ 6 B拟化差:不同的集装箱属于不同的运单(Docker上运行不同的应用实例),相互独立(隔离)。但由同一个库管人员管理(B n e V / n主机操作系统内核),因此通过库管人员可以看到所有集装箱的相关信息(因为共享操作系统内核,因此相关信息会共享)。

  服务器虚拟化就好比在码头上(物理主机及虚拟化层),建立了多个独立的“小码头”—仓库5 ) o(虚拟机)。其拥有完全独立(隔离)的空间,属于不同的客b F + d户(& b i L ; M g x ^虚拟机所有者)。2 6 1每个仓库有各自的库管人员(当前虚拟机的操R & ) r作系统内核),无法管理其它仓库。{ @ i R b ,不存在信息共享的情况

  因此,我们需要根据不同的应用场景和a 0 A F n需求采用不同的方式使用Docker技术或使用服务器虚拟化技术。例如一个典型的Docker应用场景是当主机上的Docker实例属于单一用户的情况下,在保证安全的同时可以充分发挥Docker的技术优势。对于隔离要求较高的环境如混合用户环境,就可以X / c ( .使用服务器虚拟化技术。

五、Docker` m i $ ) ) Z基本概念

1、镜像(image)

  操作系统分为内核和用户空间X K 4。对于Linux而言,内O b #核启动后,会挂载root文件系统为其提供用户空间支持,而Docker镜像(image),就相当于是一个rootd C L d件系统。( V k 0 ] J v &

  Docker镜像是一个特殊的文件系统,除了提供容器运行= D w l q时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配f / A # F . w !置参数(如匿名卷、环境变量、用户等),镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像分层存储

  因为镜像包含操作系统完整的root文件系统,其体积往往是庞大的,因此在Docker设计时将其设计为分层存储的架构。镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

  镜像构建时,会一层层构建,前一层是后一层的基础。每一层构2 J -建完后就不会再发生改变l G 4,后一层上的任何改变只发生在自己这一层。在构建镜像的时候,需要格外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

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

2、容器(container)

  镜像(Imac ) l q $ge)和容器(Container)的关系,就像Java中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  前面讲过镜像使用的是分层存储,容器也是如此。每一个容器6 ? # O _ % 9 p .运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,N T A F )我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

  容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

  按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有文件写入操作,都应该使用Volume数据卷、N p 3 P q { N R E或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存g i N储)发生读写,其性能和稳定性更高。

  数据卷的生存周期独立于容器,容器消亡J H R =,数据卷不会消亡。因此^ $ ; m C,使用数据卷后,容器删除或者重新运行之后,数据不会丢失。

3、仓库(repof ) rsitory)

  镜像构建完成后,可以很容易地在当前宿主机上运行,但是,如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,DockerW Q ` / 8 0 0 Registry就是这样的服务。

  一个Docker Registry中可以包含多个仓库(Repository),每个仓库可以包括多个标签(Tag),每个标签对应一个镜像。

  通常,一个仓库会包含同一个h 0 A % 1 J 6 # 6软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作[ h U W为默认标签。

  以centos镜像为例,S K Icentos是仓库的名字,其内包含有不同的版本标签,如:6.9、7.5。G ] / P 3 O H我们可以通过centos:6.9,或者centos:7.5来具体指定所需哪个版本的镜像。如果忽略了标签,比如centos,那将视( o h X }为centos:latest。

  . ; Y } [ X E仓库名经常以两段式路径形式出现,比如study/nginx,前; ) P 5 u e `者往往意味着DockeW o L O d 7 a $ sr Registry多用户环境下的用户名,后者往往是对应的软件名。但这并非绝对,取决于所使用的具体Docker Registry的软甲和服务。

  • 公有Docker Registry

  常用的Registb 4 $ p P Cry是官方的Docker Hub,这也是默认的Registry。初次之外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;Google的Googl, B t o Y De Container Registry,Kubernetes的镜像使用的就是这个服务。

  国内的一些云服务商提供了针对DockeV n a J u 4r Hub的镜像服务,这些镜像服务被成为加速器。常见的有阿里云加速器、DaoCloud加速器等。使用加速器会直接从国内的地址下载Dockeru W o @ X f M Hub的镜像,比直接从Docker Hub下载速度会提高很多。

  国内也有一些云服务商提供类似于Docker Hub的公开服务。比如网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等。

  • A v k a K 有Docker Registry
      除了使用公开服务外,用户还可以在本地搭建私有Docker Reistry。Docker官方提供了Docker Registry镜像,可{ W 7 & H以直接使用作为私有Registry服务。

  开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持docker命令I A x 3 A Y,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本Docker Trusted Registry中,提供了这些高级功能。

  除了官方的Docker Registry外,还有第三方软件实现了Docker Registry API,甚至提供了用户界面以及一些高级功能。L s K h比如,VMWare Harbor和Sonatype Nexus。