Docker应用及核心技术_第1页
Docker应用及核心技术_第2页
Docker应用及核心技术_第3页
Docker应用及核心技术_第4页
Docker应用及核心技术_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Docker应用及核心技术,邓云鹏营销研发部2016年08月,目录,Docker应用简介Docker简介Docker应用Docker使用场景Docker核心技术CgroupLinuxNamespace文件系统Aufs和DeviceMapper其他关键技术Docker生态圈现状及发展,1.1、Docker简介,Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源协议。,1.1Docker运行结构,Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。C/S架构Dockerdaemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTfulAPI来进行通信。Dockerdaemon一般在宿主主机后台运行,等待接收来自客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Dockerdaemon交互。,1.1Docker基本元素,1.2Docker命令,国内下载安装Docker,可参考http:/get.daocloud.io启动dockerdaemon:docker-d-bipxx.xx.xx.xx/24&从共有仓库搜索镜像:dockersearchubuntudockersearchs100ubuntu#查找星表个数大于100的镜像,一般认为是官方的镜像。获取镜像:dockerpullubuntu列出当前镜像列表:dockerimages列出镜像历史:dockerhistory删除镜像Dockerrmi,1.2Docker命令,运行容器:dockerrundockerruni-t命令行方式交互模式启动镜像。dockerrunddaemon方式运行镜像dockerrunitdp80:8080把宿主机的80端口映射到启动容器的8080端口。dockerrunitdP自动映射容器对外提供服务的全部端口。dockerrun-itdname=dennis_machinehmyhost给启动的容易命名为dennis_machine,制定容器的hostname为myhostdockerrunitd-v/mnt:/mnt把宿主机的/mnt目录mount到容器的/mnt目录dockerrunitdnet=bridge启动容器使用虚拟网桥模式。Dockerruntdnamenew_machinelinkdennis_machine启动容期间联结,新容器new_machine能直接访问dennis_machine中的服务。,1.2Docker命令,dockerstart#运行一个或多个停止的容器dockerstop#停掉一个或多个运行的容器-t选项可指定超时时间dockerrestart#重启一个或多个运行的容器dockerpause#暂停一个容器dockerunpause#继续暂停的容器dockerrm#移除一个或多个容器dockercommit#提交指定容器为镜像dockerinspect#查看容器或者镜像的详细信息dockerexec#在一个容器上执行一个命令dockerlogin#docker用户注册或者登录dockerlogout#docker用户注销dockerpush#上传image到dockerregistry,1.2Dockfile和dockerbuild,Dockerfile是一个包含创建镜像所有命令的文本文件,通过dockerbuild命令可以根据Dockerfile的内容构建镜像.Dockerfile指令选项:,DockerFile示例,#NginxFROMubuntuMAINTAINERDennisDengdennis_deng#installsoftwaresRUNapt-getupdate&apt-getinstall-yinotify-toolsnginxapache2openssh-serverexpose80and443porttohostmachineEXPOSE80443#mounthostmachinesdirectoriesVOLUME/var/www,/var/log/apache2,/etc/apache2#theapacheafterthecontainerstartupsENTRYPOINT/usr/sbin/apache2ctl,-D,FOREGROUND,1.3DockerVSVM,1.3Docker应用场景,以下是Docker官方给出的应用场景AutomatingthepackaginganddeploymentofapplicationsCreationoflightweight,privatePAASenvironmentsAutomatedtestingandcontinuousintegration/deploymentDeployingandscalingwebapps,databasesandbackendservices,二、Docker核心技术,Docker从0.9版本开始使用libcontainer替代了lxc,libcontainer几乎囊括了docker的全部核心技术。,2.1Cgroup简介,Cgroups是controlgroups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组(processgroups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。1.限制进程组可以使用的资源数量(Resourcelimiting)。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM。2.进程组的优先级控制(Prioritization)。比如:可以使用cpu子系统为某个进程组分配特定cpushare。3.记录进程组使用的资源数量(Accounting)。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间4.进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。5.进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。Cgroups的使用简单,提供类似文件的接口,在/cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。,2.1Cgroup子系统,2.1DockerCgroup示例,dockerrun-tidcpu-shares100ubuntu:指定容器进程对CPU使用的权制(相对数值).dockerrun-tidcpu-period100000cpu-quota200000ubuntu:指定该容器在1秒的时间间隔内,最多使用0.2秒的cpu.(period和quota都是微秒单位,绝对值)。dockerrun-tidnamecpu1cpuset-cpus0-2ubuntu表示创建的容器只能用0、1、2这三个内核。dockerrun-tidnamemem1memory128mubuntu限制容器最多使用128M的内存。dockerrun-tidnamedisk1device-write-bps/dev/sda:1mbubuntu限制容器的指定磁盘的写入速度不超过1Mbytes/秒,2.2LinuxNamespace,个用户实例之间相互隔离,互不影响。一般的硬件虚拟化方法给出的方法是VM,而LXC给出的方法是container,更细一点讲就是kernelnamespace。其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS(“UNIXTime-sharingSystem”)和用户空间隔离开。,2.3Aufs,AUFS(AnotherUnionFileSystem)简单说就是一个文件系统,可以把不同的目录联合在一起。这种文件系统不用格式化,直接挂载即可。支持将不同目录挂载到同一个虚拟文件系统下的文件系统AUFS支持为每一个成员目录设定readonly、readwrite和whiteout-able权限.AUFS里有一个类似分层的概念,对readonly权限的branch可以逻辑上进行修改,通常是把一个readonly的分支和一个writable的分支mount到一起,对writable分支实现copy-on-write的策略。,2.3BootinginNormalLinux,典型的启动Linux运行需要两个FS:bootfs+rootfs.bootfs(bootfilesystem)主要包含bootloader和kernel,bootloader主要是引导加载kernel,当boot成功后kernel被加载到内存中后bootfs就被umount了.rootfs(rootfilesystem)包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。Linux在启动后,首先将rootfs设置为readonly,进行一系列检查,然后将其切换为readwrite供用户使用。,2.3AufsinDocker(1),在Docker中,初始化时也是将rootfs以readonly方式加载并检查,然而接下来利用unionmount的方式将一个readwrite文件系统挂载在readonly的rootfs之上,并且允许再次将下层的FS(filesystem)设定为readonly并且向上叠加,这样一组readonly和一个writeable的结构构成一个container的运行时态,每一个FS被称作一个FS层。,2.3AufsinDocker(2),得益于AUFS的特性,每一个对readonly层文件/目录的修改都只会存在于上层的writeable层中。这样由于不存在竞争,多个container可以共享readonly的FS层。所以Docker将readonly的FS层称作image-对于container而言整个rootfs都是read-write的,但事实上所有的修改都写入最上层的writeable层中,image不保存用户状态,只用于模板、新建和复制使用。,2.3AufsinDocker(3),上层的image依赖下层的image,因此Docker中把下层的image称作父image,没有父image的image称作baseimage。因此想要从一个image启动一个container,Docker会先加载这个image和依赖的父images以及baseimage,用户的进程运行在writeable的layer中。所有parentimage中的数据信息以及ID、网络和lxc管理的资源限制等具体container的配置,构成一个Docker概念上的container。,2.4Devicemapper,Aufs是Docker最初采用的文件系统,由于Aufs未能加入到大多Linux的内核,考虑到兼容性问题,加入了Devicemapper的支持。目前,除少数版本如Ubuntu,Docker基本运行在Devicemapper基础上。Devicemapper是Linux2.6内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的Linux下的逻辑卷管理器如LVM2(LinuxVolumeManager2version)、EVMS(EnterpriseVolumeManagementSystem)、dmraid(DeviceMapperRaidTool)等都是基于该机制实现的。,2.4Devicemapper基本概念,Devicemapper在内核中作为一个块设备驱动被注册的,它包含三个重要的对象概念:(1)mappeddevice:是一个逻辑抽象,可以理解成为内核向外提供的逻辑设备,它通过映射表描述的映射关系和targetdevice建立映射。(2)映射表:从Mappeddevice到一个targetdevice的映射表由一个多元组表示,该多元组由表示mappeddevice逻辑的起始地址、范围、和表示在targetdevice所在物理设备的地址偏移量以及target类型等变量组成。(3)targetdevice:是mappeddevice所映射的物理空间段。Devicemapper中这三个对象和targetdriver插件一起构成了一个可迭代的设备树。在该树型结构中的顶层根节点是最终作为逻辑设备向外提供的mappeddevice,叶子节点是targetdevice所表示的底层物理设备。最小的设备树由单个mappeddevice和targetdevice组成。每个targetdevice都是被mappeddevice独占的,只能被一个mappeddevice使用。一个mappeddevice可以映射到一个或者多个targetdevice上,而一个mappeddevice又可以作为它上层mappeddevice的targetdevice被使用,该层次在理论上可以在devicemapper架构下无限迭代下去。,2.4Thinly-ProvisionedSnapshot,Thinly-ProvisionedSnapshotSnapshot技术+Thin-ProvisionedSnapshot.Snapshot技术:可以在不中断服务运行的情况下为逻辑数据源创建一个虚拟快照(Snapshot),snapshot只对源数据变化的部分做拷备。而对数据源进行写入操作的时候,丢弃原始数据源。有些Linux内核支持把写入后的数据merge到源数据。Thin-ProvisionedSnapshot技术:是一项利用虚拟化方法减少物理存储部署的技术,可最大限度提升存储空间利用率。Thin-provisioningSnapshot结合Thin-Provisioning和Snapshot两种技术,允许多个虚拟设备同时挂载到一个数据卷以达到数据共享的目的。,2.4DeviceMapperInDocker,在不支持AUFS的Linux上,Docker使用DeviceMapper技术实现和Aufs一样的功能。在Docker中:一个Thinly-ProvisionedSnapshot相当于DeviceMapper结构中的一个Target-device.Snapshot天生的Copy-on-write特性,snapshot相当于AUFS的image分层关系。AUFS是文件级别存储,而Devicemapper是数据块级存储。,2.4Docker其他存储驱动,除了AUFS和DeviceMapper,Docker还支持以下三种存储驱动:overlay:Linux内核3.18后支持的,也是一种UnionFS,和AUFS的多层不同的是overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。Btrfs:被称为下一代写时复制文件系统,并入Linux内核,也是文件级级存储,但可以像Devicemapper一直接操作底层设备。Btrfs把文件系统的一部分配置为一个完整的子文件系统,称之为subvolume。ZFS:文件系统是一个革命性的全新的文件系统,它从根本上改变了文件系统的管理方式,ZFS完全抛弃了“卷管理”,不再创建虚拟的卷,而是把所有设备集中到一个存储池中来进行管理,用“存储池”的概念来管理物理存储空间。,2.5Networking,Dokcer通过使用Linux桥接提供容器之间的通信,docker0桥接接口的目的就是方便Docker管理:,2.5Networking,dockerrun创建Docker容器时,可以用-net选项指定容器的网络模式,Docker有以下4种网络模式:Host模式(-net=host):容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。container模式(-net=container:NAMEorID):这个模式指定新创建的容器和已经存在的一个容器共享一个NetworkNamespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。none模式(-net=none):Docker容器拥有自己的NetworkNamespace,但是,并不为Docker容器进行任何网络配置。bridge模式(-net=bridge):Docker默认的网络设置,此模式会为每一个容器分配NetworkNamespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。当Dockerserver启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。,2.6selinux和AppArmor,Selinux:是一个标签系统,进程有标签,每个文件、目录、系统对象都有标签。SELinux通过撰写标签进程和标签对象之间访问规则来进行安全保护。它实现的是一种叫做MAC(MandatoryAccessControl)的系统,即对象的所有者不能控制别人访问对象.Docker示例:dockerrun-d-security-opttype:docker_apache_thttpdAppArmor是一个高效和易于使用的Linux系统安全

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论