@网络老鼠技术小屋

网络老鼠技术小屋-涂飞平的博客空间

Docker菜鸟之路

3 年前 0

以下文章是我转载朋友 【西弗尔-Siffre】 的Docker学习笔记,这里仅仅摘录了前面部分,全文可以从文后提供的下载链接下载。
本文做了排版处理。 转载请保留作者 【西弗尔-Siffre】 信息以示对原作者的尊重,谢谢!

Docker学习笔记


西弗尔
—Siffre

title.png

整体介绍


在学习Docker基础之前,我们先来了解一下Docker的背景吧!
article.png

Docker是PasS提供商DoctCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github上,基于go语言并遵从Apache2.0协议开源。Docker近期非常火热,无论是从Github上的代码活跃度,还是Redhat在REHEL6.5中集成对Docker的支持,就连Google的Compute Engine也支持docker在意之上运行,百度、阿里、新浪、京东也开始使用Docker作为PaaS基础。

插句话:上次问用友云平台负责人,貌似用友不是太关心Docker,还是基于LXC在做工作!

某款开源软件能否在商业上成功,很大程度上依赖三件事-成功的User case,活跃的社区和一个好故事。DotCloud在自家的PaaS产品上建立在docker之上,长期维护且有大量用户,社区十分活跃,接下来我们看看docker 的故事。

  • 环境管理复杂--从各种OS到各种中间件到各种app,一款产品能够成功作为开发者需要关心的东西太多,且难于管理,这个问题几乎在所有现代IT相关行业都需要面对,对此Docker可以简化部署多种应用实例工作,比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个 Image部署。
  • 如图所示:
    pic3.jpg
  • 云计算时代的到来--AWS的成功,引导开发者将应用转移到cloud上,解决了硬件管理的问题,然而中间件相关的问题依然存在,Docker的出现正好能帮助软件开发者开阔思路,尝试新的软件管理方法来解决这个问题。
  • 虚拟化手段的变化--cloud时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需使用的需求以及保证可用性和隔离性,然而无论是kvm还是Xen在docker看来,都是在浪费资源,因为用户需要的是高效运行环境而非OS,GuestOS既浪费资源又难于管理,更加轻量级的LXC更加灵活和快速。
  • LXC的移植性--LXC在linux2.6的kernel里就已经存在了,但是其设计之初并非为云计算考虑的,缺少标准化的描述手段和容器的可迁移性,决定其构建出的环境难于迁移和标准化管理(相对于kvm之类的image和snapshot),Docker就在这个问题上作出实质性的革新。
  • pic2.png

    面对上面的问题,docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后标准化组件是用户的app),这也就是基于docker的PaaS产品的原型。

    docker官网上提到了docker的典型应用场景

    • Automating the packaging and deployment of applications
    • Creation of lightweight, private PAAS environments
    • Automated testing and continuous integration/deployment
    • Deploying and scaling web apps, databases and backend services

    由于docker基于LXC轻量级的虚拟化特点(0.9之后不是基于LXC,但还是支持的),docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离性的标准化的运行环境,轻量级的PaaS(如dokku),构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

    (1)构建标准化的运行环境,现有方案大多是在一个base OS上运行的一套puppet/chef,或者一个image文件,期缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write的文件格式在运行时rootfs是read only),并且后者文件体积大,环境管理和版本控制本身也是一个问题。

    (2)PaaS环境是不言而喻的,其设计之初和DotCloud的案例都是将其作为PaaS产品的环境基础。

    (3)因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来。

    (4)于LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样的资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源。

    下面来了解一下docker目前的核心文件系统,有对于我们后期的学习:
    AUFS

    Docker对容器的使用基本上是建立在LXC基础之上的,然而LXC存在的问题是难以移动--难以通过标准化的模板制作、重建、复制和移动container。在以VM为基础的虚拟化手段中,有image和snapshot可以用于VM的复制、重建以及移动的功能。想要通过container来实现快速的大规模部署和更新,这些功能不可或缺。Docker正是利用AUFS来实现对container的快速更新,在docker0.7中引入了storage driver,支持AUFS,VFS,device mapper,也为BTTRFS以及引入ZFS提供了可能,但是除了AUFS都未经过DotCloud的线上使用,因此还是从AUFS角度学习。

    AUFS(Another Union FS)是一种Union FS简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统,更进一步的,AUFS支持为每一个成员目录(AKA branch)设定‘readonly’,‘readwrite’和‘writeout-able’权限,同时AUFS里有一个类似分层的概念,对readonly权限的branch可以逻辑上进行修改(增量的,不影响readonly部分)。通长Union FS有两个用途:一方面可以实现不借助LVM,RAID将多个disk和挂到一个目录下,另一个更常用的是将一个readonly的branch和一个writeable的branch联合一起,live CD正是基于此可以允许在OS image不变的基础上允许用户上进行一些写操作。Docker在AUFS上构建的container image也正是如此,接下来我们从启动container中的linux为例介绍docker在AUFS特性的运用。

    典型的linux启动运行需要两个FS:bootfs+rootfs(从功能角度而非文件系统角度)

    pic3.png

    Bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载内核kernel,当boot成功后kernel被加载到内存中后bootfs就被umonut了。Rootfs(root file system)包含的就是典型linux系统中/dev,/proc,/bin,/etc等标准目录和文件。

    由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以用bootfs如下图:

    pic4.png
    容器一:
    [root@cxp ~]# docker exec -it 54db59815ec1 /bin/bash
    [root@54db59815ec1 /]# cat /etc/redhat-release
    CentOS release 6.6 (Final)
    [root@54db59815ec1 /]# uname -r
    3.10.79-1.el6.elrepo.x86_64
    容器二:

    root@4669ec2a5a1a:/# cat /etc/os-release
    NAME="Ubuntu"
    VERSION="14.04.2 LTS, Trusty Tahr"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 14.04.2 LTS"
    VERSION_ID="14.04"
    HOME_URL="http://www.ubuntu.com/"
    SUPPORT_URL="http://help.ubuntu.com/"
    BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
    root@4669ec2a5a1a:/# uname -r
    3.10.79-1.el6.elrepo.x86_64
    宿主机:
    [root@cxp ~]# cat /etc/redhat-release
    CentOS release 6.6 (Final)
    [root@cxp ~]# uname -r
    3.10.79-1.el6.elrepo.x86_64

    从上面的代码我们可以看出,它们是共享宿主机的内核,不同的发行版本共用bootfs,有各自的rootfs。

    典型的linux在启动后,首先将rootfs设置为readonly,进行一系列的检查,然后将其切换为“readwrite”供用户使用。在docker中,起初也是将rootfs以readonly方式加载并检查,然而接下来利用union mount的将一个readwrite文件系统挂载在readonly的rootfs之上,并且允许再次将下层的file system设定为readonly并且向上叠加,这样一组readonly和一个writeable的结构构成一个container的运行目录,每一个被称作一个layer。如下图:

    pic5.png

    得益于AUFS的特性,每一个对readonly层文件/目录的修改都只会存在于上层的writeable层中。这样由于不存在竞争,多个container可以共享readonly的layer,所以docker将readonly的层称作“image”对于container而言整个rootfs都是readwrite的,但事实上所有的修改都写入最上层的writeable层中,image不保存用户状态,可以用于模板、重建和复制。

    pic6.png
    pic7.png

    上层的image依赖下层的image,因此docker中把下层的image称作父image,没有image的image称作base image

    pic8.png

    因此,想要从一个image启动一个container,docker会先加载其父image直到base image,用户的进程运行在writeable的layer中,所有parent image中的数据信息以及ID、网络和LXC管理的资源限制等具体 container的配置,构成一个docker概念上的container。如图:

    pic9.png
    由此可见,采用AUFS作为container的文件系统,能够提供如下好处:
      1)节省存储空间--多个container可以共享base image存储
      2)快速部署--部署多个container,base image可避免多次拷贝
      3)内存更省--多个container共享base image,以及OS的disk缓存机制,多个container中的进程命中缓存内容的几率大大增加
      4)升级方便--相比于copy-on-write类型的FS,base-image也是可以挂为writeable的,可以通过更新base image而一次性更新其之上的container
      5)允许在不更改base-image的同时修改其目录中的文件--所有写操作都发生在最上层的writeable层中,这样可以大大增加base image能共享的文件内容

    以上的1-3条可以通过copy-on-write的FS实现,4可以利用其它的union mount方式实现,5只有AUFS实现的很好。这也是Docker开始就建立在AUFS之上的原因。

    由于AUFS并不会进入linux主干,同时对内核kernel要求比较高,因此在Radhat工程师的帮助下在docker0.7版本实现了driver机制,AUFS只是其中的一个driver,在RHEL中采用的则是Device Mapper的方式实现的container文件系统。

    一、基础知识部分


    1.Docker介绍


    1.1简介

    Docker是基于Go语言实现的云开源项目,是基于linux的多项开源技术提供了高效、敏捷的和轻量级的容器方案,并且支持在多种主流平台和本地系统上部署。
    Docker目标:“一次封装,到处运行”。

    1.2容器技术

    Docker引擎的基础是linux容器技术(Linux Containers,LXC),在LXC的基础上,Docker进一步优化了容器的使用体验。Docker提供了各种容器管理工具(如:分发、版本、移植等)让用户无需关注底层的操作,可以更简单的管理和使用容器。---后面涉及到LXC的具体知识。

    1.3 Docker在开发和运维过程中的优势:

      (1)更快速的交付和部署。
      (2)更高效的资源利用。
      (3)更轻松的迁移扩展。
      (4)更简单的更新管理。
    1.4 Docker与虚拟机比较

    特性容器虚拟机
    启动速度秒级分钟级
    硬盘使用一般为MB一般为GB
    性能接近原生弱于
    系统支持量单机支持上千容器一般几十个
    隔离性单安全隔离完全隔离
    1.5 虚拟化与Docker

    虚拟化:在计算机技术中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。(维基百科)

    简单分类:
      (1)完全虚拟化:虚拟机模拟完整的底层硬件环境和特权指令的执行过程,客户操作系统无须进行修改。例如:VMware Workstation、VirtualBox、QEMU等。
      (2)硬件辅助虚拟化:利用硬件(主要CPU)辅助支持处理敏感指令来实现完全虚拟化的功能,客户操作系统无需修改,例如:VMware Workstation、Xen、KVM等
      (3)部分虚拟化:只针对部分硬件资源进行虚拟化,客户操作系统需要进行修改。现在有些虚拟化技术的早期版本仅支持部分虚拟化。
      (4)超虚拟化:部分硬件接口以软件的形式提供给客户机操作系统,客户端操作系统需要进行修改,例如早期的Xen。
      操作系统级虚拟化:内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程。

    可见,Docker以及相关其他容器技术都属于操作系统的虚拟化范畴。
    区别如图:

    pic4.jpg

    2. Docker的核心概念及安装


    2.1镜像

    Docker镜像(Image)类似于虚拟机的镜像,可以理解为面向Docker的只读模板,包含了文件系统。

    举例:一个镜像可以只包含一个完整的Centos操作系统,可以称它为Centos镜像。镜像也可以安装了Nginx应用程序(或用户需要的其他软件),可以把它成为Nginx镜像。

    镜像是创建Docker的基础。通过版本控制和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户设置可以从网上下载一个已经做好的应用镜像,并通过简单命令就可以直接使用。

    2.2容器

    Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用实例,可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。

    镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。

    2.3仓库

    Docker仓库(Repository)类似于代码仓库,是Docker集中储存镜像文件的场所。

    注意:不要将Docker仓库和注册服务器(Registry)混为一谈!
    区别如图所示:

    pic5.jpg

    根据所存储的镜像公开与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内仓库包括Docker Pool等,可以提供稳定的国内访问。如果不想公开分享自己的镜像文件,Docker也支持用户本地网络内创建一个只能自己访问的仓库。
    提示:请参考并学习《git权威指南》,方便对后面内容的学习和理解。

    2.安装Docker


    环境:虚拟机
    [root@cxp ~]# cat /etc/redhat-release
    CentOS release 6.6 (Final)
    [root@cxp ~]# uname -r
    2.6.32-504.el6.x86_64

    用EPEL进行安装:
    1.安装EPEL
    yum install -y http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
    2.安装Docker
    yum install -y docker-io
    3.检查安装软件
    [root@cxp ~]# rpm -qa docker*
    docker-io-1.5.0-1.el6.x86_64
    [root@cxp ~]# rpm -qa epel*
    epel-release-6-8.noarch

    *******centos7安装:**********
    yum install docker –y

    提示:centos6和centos7的安装不同原因:
    1.Centos6中docker没有被官方收录
    2.参看文档https://docs.docker.com/installation/centos/
    3.同时需要了解LXC http://my.oschina.net/renguijiayi/blog/159558

    注意:在centos-6.5及以后的版本,内核版本必须是2.6.32-431或者更高的版本。

    3.镜像详解


    3.1获取镜像

    镜像是Docker运行容器的前提。
    命令格式:docker pull NAME[:TAG]
    注:对于Docker镜像来说,如果不显式的指定TAG,默认会选择latest标签,即下载最新版本镜像。

    附件:docker-西弗尔-Siffre-更新版v1.docx 点击下载

    编写评论