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根本元素Docker镜像Docker镜像是Docker容器运行时的只读模板,每一个镜像由一系列的层(layers)组成。Docker使用UnionFS来将这些层联合到单独的镜像中。Docker仓库Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker仓库也有公有和私有的概念,公有的Docker仓库是DockerHub。Docker容器一个Docker容器包含了所有的某个应用运行所需要的环境。每一个Docker容器都是从Docker镜像创建的。每一个Docker容器都是独立和安全的应用平台,Docker容器是Docker的运行部分。1.2

Docker命令国内下载安装Docker,可参考://启动dockerdaemon:docker-d-bip/24&从共有仓库搜索镜像:docker

search

ubuntu

dockersearch–s100ubuntu#查找星表个数大于100的镜像,一般认为是官方的镜像。获取镜像:docker

pull

ubuntu列出当前镜像列表:dockerimages列出镜像历史: dockerhistory删除镜像Dockerrmi1.2

Docker命令运行容器:dockerrundockerrun–i-t<imageid>命令行方式交互模式启动镜像。dockerrun–d<imageid>daemon方式运行镜像dockerrun–itd–p80:8080<imageid>把宿主机的80端口映射到启动容器的8080端口。dockerrun–itd–P<imageid>自动映射容器对外提供效劳的全部端口。dockerrun-itd–name=dennis_machine–hmyhost<imageid>给启动的容易命名为dennis_machine,制定容器的hostname为myhostdockerrun–itd-v/mnt:/mnt<imageid>把宿主机的/mnt目录mount到容器的/mnt目录dockerrun–itd–net=bridge<imageid>启动容器使用虚拟网桥模式。Dockerrun–td–namenew_machine–linkdennis_machine<imageid>启动容期间联结,新容器new_machine能直接访问dennis_machine中的效劳。1.2Docker

命令dockerstart#运行一个或多个停止的容器dockerstop#停掉一个或多个运行的容器-t选项可指定超时时间dockerrestart#重启一个或多个运行的容器dockerpause#暂停一个容器dockerunpause#继续暂停的容器dockerrm#移除一个或多个容器dockercommit#提交指定容器为镜像dockerinspect#查看容器或者镜像的详细信息dockerexec#在一个容器上执行一个命令dockerlogin#docker用户注册或者登录dockerlogout#docker用户注销dockerpush#上传image到dockerregistry

1.2

Dockfile和docker

build Dockerfile是一个包含创立镜像所有命令的文本文件,通过dockerbuild命令可以根据Dockerfile的内容构建镜像.Dockerfile指令选项:FROM指定构建镜像的基础源镜像,FROM必须是Dockerfile

中非注释行的第一个指令MAINTAINER指定创建镜像的用户RUN在当前镜像基础上执行指定命令,并提交为新的镜像CMD语法和RUN类似,但在Dockerfile

中只能使用一次,如果有多个,则只有最后一个会生效。CMD只在启动容器的时候执行,而RUN只在build的时候执行。EXPOSE告诉Docker

服务端容器对外映射的本地端口ENV指定一个环节变量ADD复制本地主机文件、目录或者远程文件到容器指定路径COPY用法同ADD,唯一的不同是不能指定远程文件URLSENTRYPOINT配置容器启动后执行的命令,并且不可被Docker

run

提供的参数覆盖,而CMD是可以被覆盖的。VOLUME创建一个可以从本地主机的挂载点USER指定运行容器时的用户名或UIDWORKDIR为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。DockerFile例如#NginxFROMubuntuMAINTAINERDennisDengdennis_deng@docker#installsoftwaresRUNapt-getupdate&&apt-getinstall-yinotify-toolsnginxapache2openssh-server#expose80and443porttohostmachineEXPOSE80443#mounthostmachine‘sdirectoriesVOLUME["/var/www","/var/log/apache2","/etc/apache2"]#theapacheafterthecontainerstartupsENTRYPOINT["/usr/sbin/apache2ctl","-D","FOREGROUND"]1.3DockerVSVM

1.3Docker应用场景以下是Docker官方给出的应用场景 Automatingthepackaginganddeploymentofapplications Creationoflightweight,privatePAASenvironments Automatedtestingandcontinuousintegration/deployment

Deployingandscalingwebapps,databasesandbackendservices

二、Docker核心技术 Docker

0.9

版本开始使用

libcontainer

替代了lxc,libcontainer几乎囊括了docker的全部核心技术。

2.1

Cgroup简介 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子系统子系统描述blkio为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB等等)cpu调度程序提供对CPU的cgroup任务访问。cpuacct自动生成cgroup中任务所使用的CPU报告cpuset为cgroup中的任务分配独立CPU(在多核系统)和内存节点。devices允许或者拒绝cgroup中的任务访问设备freezer挂起或者恢复cgroup中的任务。memory设定cgroup中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。net_cls使用等级识别符(classid)标记网络数据包,可允许Linux流量控制程序(tc)识别从具体cgroup中生成的数据包。ns名称空间子系统2.1DockerCgroup例如dockerrun-tid–cpu-shares100ubuntu:指定容器进程对CPU使用的权制(相对数值).dockerrun-tid–cpu-period100000–cpu-quota200000ubuntu:指定该容器在1秒的时间间隔内,最多使用0.2秒的cpu.〔period和quota都是微秒单位,绝对值〕。dockerrun-tid–namecpu1–cpuset-cpus0-2ubuntu表示创立的容器只能用0、1、2这三个内核。dockerrun-tid—namemem1—memory128mubuntu限制容器最多使用128M的内存。dockerrun-tid–namedisk1–device-write-bps/dev/sda:1mbubuntu限制容器的指定磁盘的写入速度不超过1Mbytes/秒2.2

LinuxNamespace

个用户实例之间相互隔离,互不影响。一般的硬件虚拟化方法给出的方法是VM,而LXC给出的方法是container,更细一点讲就是kernelnamespace。其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS(“UNIXTime-sharingSystem”)和用户空间隔离开。pidnamespace不同用户的进程就是通过pidnamespace隔离开的,且不同namespace中可以有相同pid。所有的Container进程在docker中的父进程为docker进程,每个container进程具有不同的namespace。允许嵌套,可以实现DockerinDocker。netnamespace网络隔离是通过netnamespace实现的,每个netnamespace有独立的networkdevices,IPaddresses,IProutingtables,/proc/net目录。docker默认采用veth的方式将container中的虚拟网卡同host上的一个dockerbridge:docker0连接在一起。ipcnamespacecontainer中进程交互还是采用linux常见的进程间交互方法(iIPC),但加入了namespace信息,每个IPC资源具备独立的32位IDmntnamespace类似chroot,将一个进程放到一个特定的目录执行。mntnamespace允许不同namespace的进程看到的文件结构不同,这样每个namespace中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mountpoint。utsnamespaceUTS("UNIXTime-sharingSystem")namespace允许每个container拥有独立的hostname和domainname,使其在网络上可以被视作一个独立的节点而非Host上的一个进程。usernamespace每个container可以有不同的user和groupid,也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。2.3

Aufs

AUFS(Another

Union

File

System)

简单说就是一个文件系统,可以把不同的目录联合在一起。这种文件系统不用格式化,直接挂载即可。支持将不同目录挂载到同一个虚拟文件系统下的文件系统AUFS支持为每一个成员目录设定readonly、readwrite和whiteout-able权限.

AUFS里有一个类似分层的概念,对readonly权限的branch可以逻辑上进行修改,通常是把一个readonly的分支和一个writable的分支mount到一起,对writable分支实现copy-on-write的策略。2.3

Booting

in

Normal

Linux

典型的启动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.3

Aufs

in

Docker

(1)

在Docker中,初始化时也是将rootfs以readonly方式加载并检查,然而接下来利用unionmount的方式将一个readwrite文件系统挂载在readonly的rootfs之上,并且允许再次将下层的FS(filesystem)设定为readonly并且向上叠加,这样一组readonly和一个writeable的结构构成一个container的运行时态,每一个FS被称作一个FS层。2.3

Aufs

in

Docker

(2)得益于AUFS的特性,每一个对readonly层文件/目录的修改都只会存在于上层的writeable层中。这样由于不存在竞争,多个container可以共享readonly的FS层。所以Docker将readonly的FS层称作"image"-对于container而言整个rootfs都是read-write的,但事实上所有的修改都写入最上层的writeable层中,image不保存用户状态,只用于模板、新建和复制使用。2.3

Aufs

in

Docker

(3)上层的image依赖下层的image,因此Docker中把下层的image称作父image,没有父image的image称作baseimage。因此想要从一个image启动一个container,Docker会先加载这个image和依赖的父images以及baseimage,用户的进程运行在writeable的layer中。所有parentimage中的数据信息以及ID、网络和lxc管理的资源限制等具体container的配置,构成一个Docker概念上的container。2.4

Device

mapperAufs是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-ProvisionedSnapshotThinly-ProvisionedSnapshot=Snapshot技术+Thin-ProvisionedSnapshot.Snapshot技术:可以在不中断效劳运行的情况下为逻辑数据源创立一个虚拟快照(Snapshot),snapshot只对源数据变化的局部做拷备。而对数据源进行写入操作的时候,丢弃原始数据源。有些Linux内核支持把写入后的数据merge到源数据。Thin-ProvisionedSnapshot技术:是一项利用虚拟化方法减少物理存储部署的技术,可最大限度提升存储空间利用率。

Thin-provisioningSnapshot结合Thin-Provisioning和Snapshot两种技术,允许多个虚拟设备同时挂载到一个数据卷以到达数据共享的目的。2.4Device

Mapper

In

Docker

在不支持AUFS的Linux上,Docker使用Device

Mapper技术实现和Aufs一样的功能。在Docker中:

一个Thinly-ProvisionedSnapshot

相当于Device

Mapper结构中的一个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.5

NetworkingDokcer

通过使用Linux

桥接提供容器之间的通信,docker0

桥接接口的目的就是方便Docker

管理:

2.5

Networkingdocker

run

创立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.6

selinux和AppArmorSeli

温馨提示

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

评论

0/150

提交评论