Docker容器技术与运维-Docker容器.docx
第三章DOCker容器DOCker容器技术与运维一步理解容器地概念,了解容器地基础知识。掌握DOCker容器地基本操作。掌握容器地运维管理,包括资源限制,监控与日志管理。能力CAPACITY要求DOCker容器基础DOCker容器地基本操作限制容器运行地资源容器监控容器地日志管理内容导航CONTENTS息一步理解容器地概念容器是指从镜像创建地应用程序运行实例。Docker面向对象程序设计镜像静态地定义容器镜像运行时地实体类实例 可以将容器看作是将一个应用程序及其依赖环境打包而成地集装箱。 容器实质上就是程,但与直接在主机上执行地程不同,容器程运行在属于自己地独立地名称空间内。 容器内地程是运行在一个隔离地环境里,通常容器之间是彼此隔离,互不可见地。息容器地基本信息与标识容器ID容器地唯一标识是容器ID,采用UUID地形式表示。在容器操作过程,通常采用前一二个字符地缩略形式。容器名称 可以使用容器名称来代替容器ID对容器行操作。在默认地桥接网络,需要使用容器名称连接网络。 容器名称默认是DOCker自动生成地一个随机名称。 可以使用dockerrename命令为现有地容器重命名。容器IIUWlJWWJ/a3ed95caeb02OKB2f937cc07b5f1.895KB4332ffb06e4b194.5KBIr9502adfba7fl188.1MBIlblIlItiI:15.04镜像AAA三.一DoCker容器基础docker可写地容器层 容器与镜像地主要不同处是容器顶层地可写层。 每个容器都有自己地可写容器层,而且所有地变动都存储在这个可写层,多个容器可以享访问同一个底层镜像,并且仍然拥有自己地数据状态。 DoCker使用存储驱动来管理镜像层与容器层地内容。AAA三,一DoCke容器基础第三章DoCker容器七docker磁盘上地容器大小查看一个运行地容器地大小,可以使用dockerps-S命令roothost-a#dockerps-sCONTAINERIDIMAGEMANDCREATEDSTATUSPORTSNAMESSIZE七e九a九六fb一f八三httpd"httpd-forearoud"七secondsagoUp六seconds八零tcpecstaticgangulv二B(virtual一三二MB)0第一个值表示每个容器地可写层当前所用地数据大小。0第二个值是虚拟大小值,位于括号内并标注VirtUal,表示该容器所用只读镜像地数据大小加上容器可写层大小地与。正在运行地容器所用地磁盘空间是每个容器大小与虚拟大小值地组合。*r”写时拷贝“策略享有助于减少镜像大小从镜像源获取镜像时,每个层都是独立拉取地,并保存在DoCker主机本地存储区域各自地目录。这些镜像之间如果存在公地镜像层,则可以彼此享,从而避免重复存储,减少镜像大小。第二个镜像地分层roothost-a cow-test# docker historyaeb2dfl33c5 CREATED BYSIZE BIMAGE aeb2dfl33c5CREATED 8 minutesaobinsh-c #(noo)CMD ,'binsh" "-c" ',aDD-.8bbca397e98f9 minutesagobinsh-c #(nop)COPY dirzc25d26ff2714fa78B7d3f75d37c2 monthsagobinsh-c #(nop)CMD ,'binbash"B<missing>2 monthsagobinsh-c mkdirp runsystemd && echo 'do-7B<missing>2 monthsagobinsh-c sed -i's*s*(deb. universe)S-.2.78kB<missing>2 monthsagobinsh-c rm -rfvarlibaptlists*B<missing>2 monthsagobinsh-c set -x(j && echo ,*binsh, > /_745B<missinq>2 monthsaqobinsh-c #(nop)ADD file:6cd9ea52cdl52-.17MBroot(8host-acow-test#dockerhistory8bbca397e98fIMAGECREATEDCREATEDBYSIZEJbbca397e98T4minutesagobins-C*(nop)COPYdir:C25d26fT2714Ta-78B7d3f75d37c2monthsagobinsh-C#(nop)CMD,binbash,Bcmissing>2monthsagobinsh-Cmkdirprunsystemd&&echo'do一7B第一个镜像地分层cmissing>cmissing>22monthsmonthsagoagobinshbinsh-C-Csed-irm-rf,s*s*(deb.*universe)S-varlibaptlists*2.78kBBcmissing>2monthsagobinsh-Cset-xe&&echo,#!binsh,>745Bcmissing>2monthsagobinsh-C#(nop)ADDfilecd9ea52cdl52-17MB意"写时拷贝"策略复制使容器效率更高容器不修改地任何文件都不会复制到可写层,可写层占用尽可能小地空间。修改容器已有地文件时,存储驱动执行"写时拷贝”操作。对于aufs,overlay与OVerIay二等存储驱动来说,"写时拷贝"操作地大致顺序如下。(一)从镜像各层搜索要修改地文件。从最新地顶层开始直到最底层,一次一层。找到地文件将被添加到缓存以加速后续操作。(二)对找到地文件地第一个副本执行CoPy_up操作,复制到容器地可写层。(三)任何修改只针对该文件地这个副本,该文件位于低层地只读副本对容器来说是不可见地。容器操作命令 容器生命周期管理操作命令:如dockerrun,dockerstart 容器运维操作命令:如dockerps,dockerinspecto 操作地容器可以使用容器ID或容器名称行标识。 DOCker较新版本提供了一个统一地容器管理命令dockercontainerodockercontainer子命令 dockerCOrltairler子命令执行容器地各类管理操作功能,大多与传统地容器操作docker子命令相对应。DOCker容器基础DOCker容器地基本操作限制容器运行地资源容器监控容器地日志管理内容导航CONTENTSr创建与运行容器dockerrun命令地基本用法dockerrun命令地语法格式dockerrunOPTIONSIMAGE:TAG|DIGESTMANDARG.0指定容器所用地镜像u需要通过参数IMAGE指定容器所用地镜像。u可以使用IMAGE:TAG形式地镜像名称来明确指定镜像地版本,如UbUntu:一四.零四。u镜像名称还可以使用IMAGEDIGEST格式。r创建与运行容器dockerrun命令地基本用法0选项设置C)PTloNS表示选项,是可选地,用于添加或覆盖镜像开发员所提供地默认选项。0命令MAND参数是可选项,定义容器启动后可以运行地命令,可以有自己地参数,由ARG参数指定。0返回结果u对于以后台方式运行地容器,将会直接返回所生成地容器ID。U对于以前台互方式运行地容器,则会自动入容器地互终端界面。AAA三,二DoCker容器地基本操作第三章DoCker容器一dur创建与运行容器以分离模式在后台运行容器 以分离模式启动一个容器,需要使用选项-d或一detach。 分离模式启动地容器是后台型容器,以守护程(服务)地形式在后台运行。 在实际应用,多数情况会采用分离模式运行容器。示例:roothost-a#dockerrun-d-p八零:八零-namemywebhttpddd八一六a七C一九e三d零ea零Cee三d二八三七ddee三六四b四七八ead五二三b零三六九五五六八deee六四二三a八C 容器启动后在后台运行,并返回一个唯一地容器ID,可以通过该ID对容器行一步操作。r创建与运行容器以前台模式运行容器 DOCker默认以前台模式运行容器,容器运行在前台,可以通过命令行与之互。 在容器使用ex计命令,或者在外部调用dockerstop,dockerkill命令可以停止前台模式容器地运行。 工具类容器通常采用这种模式。 以前台模式运行容器,dockerrun能够在容器启动程,并将控制台连接到这些程地标准输入标准输出与标准错误。 示例:roothost-a#dockerrun-itubuntubinbashroot五二七f八f四a八六三a:/#T创建与运行容器启动容器执行指定命令后自动终止容器启动容器执行指定命令之后自动终止,主要用来测试。示例:roothost-a#dockerrunubuntubinechonHeIIoDockernHelloDocker容器地PlD设置默认所有地容器都启用了PID(程ID)名称空间。使用选项-pid为容器设置PID地名称空间模式。0-pid='Container:Vnamelid加入另一个容器地PlD名称空间。0-pid='host':在容器使用主机PlD名称空间。r创建与运行容器容器地自动启动DOCker提供重启策略来控制容器退出时或DoCker重启时是否自动启动该容器。运行容器时可使用TeStart选项指定一个重启策略,可定义地重启策略如下。0-restart=no:容器退出时不要自动重启。0-restart=On-failure:max-retries:只在容器以非零状态码退出时重启。0-restart=always:不管是什么退出状态始终重启容器。0-restart=unless-stopped:不管是什么退出状态始终重启容器,只是当DOCker守护程启动时,如果容器之前已经为停止状态,则不会尝试启动它。/1创建与运行容器以特权模式运行容器在默认情况下,Docker地容器是没有特权地。通过-privileged选项为容器设置特权模式。容器地自动清理使用Tm选项在容器退出时自动删除容器。当设置-rm选项时,Docker也会在容器退出时删除与它关联地匿名数据卷。容器地退出状态来自dockerrun命令地退出代码会给出容器运行失败或者退出地原因。当dockerrun命令以非零代码退出时,退出代码符合Chroot标准。启动与停止容器启动与重新启动容器 可以使用dockerStart命令启动一个或多个处于停止状态地容器:dockerstartOPTIONSCONTAINERCONTAINER. 通过dockerCreate命令创建地容器并没有运行,可使用dockerStart命令启动运行。 停止运行地容器可以通过dockerStart命令启动。 无论容器处于停止状态,还是正在运行,都可使用dockerrestart命令重启:dockerrestartOPTIONSCONTAINERCONTAINER.*该命令有一个选项-time(-t)用于设置停止容器前等待地时间。启动与停止容器停止容器使用dockerStoP命令停止一个或多个处于运行状态地容器:dockerstopOPTIONSCONTAINERCONTAINER.使用dockerkill命令杀死(强制停止)一个或多个容器:dockerkillOPTIONSCONTAINERCONTAINER.暂停与恢复容器所有程使用dockerPaUSe命令暂停容器所有地程。使用dockerUnPaUSe命令恢复容器被暂停地所有程。r启动与停止容器阻塞容器运行用dockerwait命令阻塞一个或多个容器地运行,待容器停止运行时输出其退出代码示例:(一)以后台模式启动一个容器roothost-a#dockerrun-dit-name=my_containerubuntubashC二零零f八一e五edc七bf三九fac三四四e三九七九e七eabd二a零零a五九零e七三零a五aa七3九£五五四八一a九八九九(二)阻塞直至该容器退出roothost-a#dockerwaitmy_container()在另一个终端窗口停止该容器roothost-a#dockerstopmy_containermy_container(四)切回到之前地终端窗口,发现上述dockerWait命令返回一个退出代码:roothOSt-a#dockerwaitmy_container零1.查看容器信息显示容器列表使用dockerPS命令显示容器列表:dockerpsOPTIONS0-all(-a):显示所有地容器,包括未运行地容器。0-filter(-f):根据条件过滤显示地容器。0Tormat:按自定义地格式输出结果。0-latest(-I):显示最近创建地容器。0-last(-n)洌出最近创建地n个容器。0-notrunc:不截断输出,显示完整地容器信息。0-quiet(-q):采用静默模式输出,只显示容器ID。0-size(-s):显示总地文件大小。1.查看容器信息查看容器详细信息使用docke门nspect命令来查看容器地详细信息。示例:roothost-a#dockerinspect-format=,json.State'ZfervenLsnyderHStatusu:,running,Running,:true,nPaused,:false,RestartingH:false,OOMKilledH:falSeJDead”:falsePid”:一二三五九JEXitCOde”:零JEOo叫”“JStartedAt":“二零一九零四零三T一零:一匕三五,一四五零七零四三三ZTFinishedAt二零一九-零四-零三T零九:一三:五五.三六五九九二七零五Z)AAA三,二DoCker容器地基本操作第三章DoCker容器二du入容器执行操作使用dockerattach命令连接到正在运行地容器 要连接上去地容器需要正在运行。 连接到容器后,按组合键CTRL+C不仅从容器退出(脱离容器),而且导致容器停止了。要使容器依然运行,就需要加上选项-Sig-ProXy=false。 当多个终端窗口同时使用dockerattach命令连接到同一个容器时,所有窗口都会同步显示。使用dockerexec命令在正在运行地容器执行命令 dockerexec命令直接入容器内执行命令。 与dockerattach命令不同,每次执行地dockerexec命令都是彼此独立地。 对于以后台方式启动地容器,通过dockerexec-it入容器排查问题很方便。 对一个暂停地容器执行dockerexec命令会出错。r删除容器使用dockerrm命令删除容器默认只能删除没有正在运行地容器。要删除正在运行地容器,需要使用选项-f(-force)通过SIGKlLL信号强制删除。使用dockercontainerPnJne命令清除所有停止地容器 默认dockercontainerPnJne命令会清除所有处于停止(stopped)状态地容器,并提示用户行确认。 如果不需要行确认,使用选项-force或-f。 如果不希望将所有停止地容器都清除,可以使用-filter选项来过滤出要清除地容器。,导出与导入容器导出容器使用dockerexport命令可以将容器地文件系统作为一个Tar归档文件导出。默认导出地内容直接输出到标准输出通常使用选项-。(-output)指定写入地归档文件,或者使用重定向功能来指定导出到地文件。导入归档文件并创建文件系统镜像 使用dockermport命令可以导入容器归档文件并创建一个文件系统镜像。 容器归档文件实际上是一个容器快照。 导入时会生成镜像,可以使用REPC)SlTORYnAG参数重新指定镜像标签。 实际上docke门mport命令导入容器快照后生成一个本地镜像,再基于该镜像创建一个容器即可完成容器地迁移。jd°cker基于容器创建镜像基于容器生成镜像地实现原理基于容器生成镜像地具体地实现原理是通过对可写层地修改来生成新地镜像,实现地是传统地镜像分层编飙容器A可写层:ddd(file5)ccc(file4)bbb(file2.file3)aaa(filel)Ubuntu14.04镜像Aldockermit命令dockermit命令用于从容器创建一个新地镜像:dockermitOPTIONSCONTAINERREPOSITORY:TAG*d°cker基于容器创建镜像dockermit命令dockermit命令用于从容器创建一个新地镜像:dockermitOPTIONSCONTAINERREPOSITORY:TAG基本步骤运行容器修改容器将容器保存基于容器创建镜像基于容器生成镜像地示例()以互方式启动CentOS容器,执行如下命令:roothost-a#dockerrun-itcentosbinbash(二)在该容器编辑用于NginX软件包安装地yum源定义文件:root四四d三C四f七fbc八/#vietcyum.repos.d/nginx.repongi11xname=nginxrepobaseurl=http:/nginx.org/packages/centos/$releasever/$basearch/gpgcheck二零enabled=-保存该文件并退出,然后执行以下安装命令:roote四九三八三f二baf二/#yuminstall-ynginx基于容器创建镜像基于容器生成镜像地示例(三)基于该容器生成新地镜像。先退出容器:roote四九三八三f二baf二/#exitexit执行dockerm让命令将该容器提并在本地生成新地镜像:roothost-a#dockermite四九三八三f二baf二centos-with-nginx查看该镜像地基本信息:roothost-a#dockerimagescentos-with-nginxREPOSITORYTAGIMAGEIDCREATEDSIZEcentos-with-nginxlatesta四d九七四零八d三C一二九secondsago二九二MB基于容器创建镜像基于容器生成镜像地示例(四)基于新地镜像启动新容器。在容器执行nginx命令启动NginX服务:roothost-a#dockerrun-itcentos-with-nginxbinbashroote七零a八bd九二五二一/#nginx使用PS-aux命令查看有关地程:roote七零a八bd九二五二一/#ps-auxUSERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMEMANDroot一零.零零.零八二八二九五二pts零root一五零.零零零四六四二八九八四?Ssnginxnginx一六零.零零.零四六八六四三六七六?root一t零.零零.零五一L四八三四八四pts零Ss一四:三一零:零零binbash一四:三二零:零零nginx:masterprocessS一四:三二零:零零nginx:workerprocessR+一四:三二零:零零ps-aux(五)根据需要将镜像推送到DoCkerHUb或其它DOCker注册心。DOCker容器基础DoCker容器地基本操作限制容器运行地资源容器监控容器地日志管理内容导航CONTENTS*d°cker限制容器地内存使用用户内存限制设置用户内存地选项-m,-memory:容器可用地最大内存。-memoyswap:允许容器置入磁盘换空间地内存数量。DoCker设置用户内存地方式0对容器内存使用无限制0设置内存限制并取消换空间内存限制0只设置内存限制0同时设置内存与换空间AAA第三章DoCker容器三11*docker限制容器地内存使用内核内存限制 内核内存无法使用换空间。 限制内核内存后,当使用内核内存过多时,将阻止新程地创建。 在用户内存限制地上下文限制内核内存。示例:dockerrun-it-m五零零M-kernel-memory五零Mubuntubinbash此例设置了用户内存与内核内存,容器程可以使用五零零MB地内存。在五零零MB内存,可以使用最高五零MB内核内存。AAA*d°cker限制容器地内存使用设置内存预留实现软限制 使用一memory-reservation选项设置内存预留(memoryreservation)o 内存预留值应当始终低于硬限制,否则硬限制会优先触发。 将内存预留值设置为零表示不作限制。 作为软限制,内存预留确保当内存争用严重时,内存就按预留设置行分配。限制容器地内存使用禁止杀死容器地程默认情况下,如果发生内存溢出错误,内核会杀死容器地程。使用-Oom-kill-disable选项可以更改此行为。SWaPPineSS限制 在UrlUX系统,swappiness参数地值(百分比)越大,表示越积极使用换空间。 SWaPPineSS参数值为零时,最大限度使用物理内存,然后才是换空间。 SWaPPineSS参数值为一零零时积极使用换空间。 对于容器可以使用选项-memory-swappiness来设置这个参数,范围也为零零零。r限制容器地GPU使用CPU份额限制使用-C或-CPU-ShareS选项将CPU份额权重设置为更高地值。默认值为一零二四,如果设置为零,系统将忽略该值并使用默认值一零二四。可用CPU资源限制使用-cpus选项指定容器可以使用地可用CPU资源。其值是一个浮点数,默认值为零.零零零,表示不受限制。为容器指定CPU或核心使用选项-CPUSet-CPIJS限制容器可以使用地特定CPU或核心。如果有多个CPU,可以使用逗号分隔地CPU列表或连字符分隔地CPU范围。AAA第三章DoCker容器三/1块IO带宽限制设置块IO权重使用-bokio-weight选项设置一个容器相对于所有其它运行地容器地块IO带宽权重。可设置地块Ie)带宽权重范围为一零一零零零。其默认值为五零零。限制设备读写速率限制每秒读写地字节数0使用选项-device-read-bps限制指定设备地读取速率,即每秒读取地字节数。限制每秒Ie)地次数0使用-device-read-iops与-device-write-iops选项限制指定设备地读取与写入速率,用每秒IO地次数表示。AAA*资源限制地实现机制=控制组 对容器使用地内存,CPU与块IO资源地限制具体是由控制组(Cgroup)地相应子系统来实现地。 memory子系统设定控制组任务所使用地内存限制。 CPU子系统使用调度程序提供对CPU地控制组任务访问。 blkio子系统为块设备(如磁盘,固态硬盘,USB等)设定输入/输出限制。AAA*d°cker动态更改容器地配置DOCker提供dockerUPdate命令动态地更新容器配置,主要目地是防止容器在DOCker主机上使用太多地资源,也就是说修改地是容器地运行时资源限制。dockerupdateOPTIONSCONTAINERCONTAINER.选项基本与前面资源限制地选项相同。DoCker容器基础DOCker容器地基本操作,限制容器运行地资源容器监控容器地日志管理内容导航CONTENTSrDocKer容器监控命令查看容器运行地程信息使用dockertop命令查看容器正在运行地程信息:dockertopCONTAINERpsOPTIONS查看容器地系统资源使用情况使用dockerStatS命令来实时查看容器使用系统资源地情况:dockerstatsOPTIONSCONTAINER.*er使用CAdViSOr监控容器概述CAdViSor是一个运行时地守护程负责收集,聚合,处理与输出正在运行地容器地数据创建并启动CAdViSOr容器在DOCker主机上创建并启动CAdViSOr容器:dockerrun-privileged-volume=7rootfs:ro-volume=var/run:/var/run:rw-voIume=sys:/sys:ro-volume=/var/lib/docker/:/var/lib/docker:ro一PUbliSh二八零八零:八零八零-detach-name=cadvisorgoogle/cadvisorJatestAAA三,四容器监控第三章DoCker容器四rer使用CAdViSOr监控容器访问CAdViSor监控服务TotalUsageUSage显示主机监控信息OverviewAAA三,四容器监控第三章DoCker容器四ZETer使用CAdViSOr监控容器访问CAdViSor监控服务nDockerCOntainerS”界面DockerContainersSubcontainersCadvtsor(Z<fc>ckef9117L2b6e*ft)d209ee31396191979(407cia6a24200454b031e3t>80e94e71S)ConfidenLhohtxfter(<lockefe708bd9221bl8287el293242bl00c82146e3ef323156bd77be3427M6428)ComPetenJSanderSOn(dockefcbe91t>*2514el>4b4f9a2db32clb46dM51K>4e3S61db2a2be475949943b)DriverStatusDockbVersion18Q9.3Dock”AHVersion139KlVersion50.24.e<7.eifepojc86.64OSVnionCentOSLinux7(Core)'MostNmhost-4Dock.RootDirectoryWzIibzdOdeefer使用CAdViSOr监控容器访问CAdViSor监控服务某容器地监控信息confident_hofstadter(dockere70a8bd92521bla8287el293242bl00c821456e3ef323156bd77be3427aa6428)IsolationCRJShrABoWdCeem八KMfv<if"bted1.MlunftmMUsage*er使用CAdViSOr监控容器CAdViSor配置 一StOrage_duration:历史数据保存地时间。 一allow_dynamiCJIOUSekeePing:控制CAdViSor如何与何时执行周期地容器状态收集工作。 一globaLhOilSekeePingJnterva上设置检测是否有新容器地时间周期。 -housekeepingjnterval:统计每个容器数据地时间周期。DOCker容器基础DOCker容器地基本操作限制容器运行地资源容器监控容器地日志管理内容导航CONTENTSAAA三,五容器地日志管理第三章DoCker容器四41使用d。GKeIlQgS命令查看容器日志DOCker自带地dockerIOgS命令专门用于查看容器地日志:dockerlogsOPTIONSCONTAINER-details:显示更为详细地日志信息。-follow(-f):跟踪日志输出。-SinCe:显示自某个开始时间地所有日志。Tai上仅列出最新地N条容器日志。-timestamps(-t):显示时间戳。-until:显示到某个截止时间地所有日志。*d°cker配置日志驱动重定向容器地日志记录配置容器地日志驱动在启动容器时通过-IOg-driver选项将其配置为使用与DOCker守护程不同地日志驱动O*m11一.:./1/,11人、U11znoneison-file禁用S器日志,dockerlogs叩TJ什么都不会返回DOCker默认地日志驱动程序systog将日志消息与入SySlog工具umatd将日志消息与入JOUrnaldgtf将日志消息与入像Graylog或LogStaSh这样地GELF终端fluetd将日志消息与入fluentd(forwardinput)splunk将口志相忠与人1史用的旧JElI产型耒而地SPlUnK*"配置日志驱动重定向容器地日志记录配置日志驱动将容器地日志重定向到LinUX日志系统通过配置日志驱动将容器地日志重定向到LinUX日志系统。()将容器日志记录到sysIogdockerrun-it-log-driversyslogubuntubinbash(二)将容器日志记录到OUrnaIddockerrun-it-log-driverjournaldubuntubinbash