您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > Docker应用及核心技术
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.2Docker命令国内下载安装Docker,可参考启动dockerdaemon:docker-d-bipxx.xx.xx.xx/24&从共有仓库搜索镜像:dockersearchubuntudockersearch–s100ubuntu#查找星表个数大于100的镜像,一般认为是官方的镜像。获取镜像:dockerpullubuntu列出当前镜像列表:dockerimages列出镜像历史:dockerhistory删除镜像Dockerrmi1.2Docker命令运行容器:dockerrundockerrun–i-timageid命令行方式交互模式启动镜像。dockerrun–dimageiddaemon方式运行镜像dockerrun–itd–p80:8080imageid把宿主机的80端口映射到启动容器的8080端口。dockerrun–itd–Pimageid自动映射容器对外提供服务的全部端口。dockerrun-itd–name=dennis_machine–hmyhostimageid给启动的容易命名为dennis_machine,制定容器的hostname为myhostdockerrun–itd-v/mnt:/mntimageid把宿主机的/mnt目录mount到容器的/mnt目录dockerrun–itd–net=bridgeimageid启动容器使用虚拟网桥模式。Dockerrun–td–namenew_machine–linkdennis_machineimageid启动容期间联结,新容器new_machine能直接访问dennis_machine中的服务。1.2Docker命令dockerstart#运行一个或多个停止的容器dockerstop#停掉一个或多个运行的容器-t选项可指定超时时间dockerrestart#重启一个或多个运行的容器dockerpause#暂停一个容器dockerunpause#继续暂停的容器dockerrm#移除一个或多个容器dockercommit#提交指定容器为镜像dockerinspect#查看容器或者镜像的详细信息dockerexec#在一个容器上执行一个命令dockerlogin#docker用户注册或者登录dockerlogout#docker用户注销dockerpush#上传image到dockerregistry1.2Dockfile和dockerbuildDockerfile是一个包含创建镜像所有命令的文本文件,通过dockerbuild命令可以根据Dockerfile的内容构建镜像.Dockerfile指令选项:FROM指定构建镜像的基础源镜像,FROM必须是Dockerfile中非注释行的第一个指令MAINTAINER指定创建镜像的用户RUN在当前镜像基础上执行指定命令,并提交为新的镜像CMD语法和RUN类似,但在Dockerfile中只能使用一次,如果有多个,则只有最后一个会生效。CMD只在启动容器的时候执行,而RUN只在build的时候执行。EXPOSE告诉Docker服务端容器对外映射的本地端口ENV指定一个环节变量ADD复制本地主机文件、目录或者远程文件到容器指定路径COPY用法同ADD,唯一的不同是不能指定远程文件URLSENTRYPOINT配置容器启动后执行的命令,并且不可被Dockerrun提供的参数覆盖,而CMD是可以被覆盖的。VOLUME创建一个可以从本地主机的挂载点USER指定运行容器时的用户名或UIDWORKDIR为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。DockerFile示例#NginxFROMubuntuMAINTAINERDennisDengdennis_deng@docker.com#installsoftwaresRUNapt-getupdate&&apt-getinstall-yinotify-toolsnginxapache2openssh-server#expose80and443porttohostmachineEXPOSE80443#mounthostmachine‘sdirectoriesVOLUME[/var/]#theapacheafterthecontainerstartupsENTRYPOINT[/usr/sbin/apache2ctl,-D,FOREGROUND]1.3DockerVSVM1.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子系统子系统描述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.2LinuxNamespace个用户实例之间相互隔离,互不影响。一般的硬件虚拟化方法给出的方法是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),但加入了namespac
本文标题:Docker应用及核心技术
链接地址:https://www.777doc.com/doc-6270777 .html