非常详细的Docker学习笔记.docx
《非常详细的Docker学习笔记.docx》由会员分享,可在线阅读,更多相关《非常详细的Docker学习笔记.docx(8页珍藏版)》请在冰点文库上搜索。
非常详细的Docker学习笔记
非常详细的Docker学习笔记
一、Docker简介Docker两个主要部件:
Docker:
开源的容器虚拟化平台DockerHub:
用于分享、管理Docker容器的DockerSaaS平台--DockerHubDocker使用客户端-服务器(C/S)架构模式。
Docker客户端会与Docker守护进程进行通信。
Docker守护进程会处理复杂繁重的任务,例如建立、运行、发布你的Docker容器。
Docker客户端和守护进程可以运行在同一个系统上,当然你也可以使用Docker客户端去连接一个远程的Docker守护进程。
Docker客户端和守护进程之间通过socket或者RESTfulAPI进行通信。
1.1Docker守护进程如上图所示,Docker守护进程运行在一台主机上。
用户并不直接和守护进程进行交互,而是通过Docker客户端间接和其通信。
1.2Docker客户端Docker客户端,实际上是docker的二进制程序,是主要的用户与Docker交互方式。
它接收用户指令并且与背后的Docker守护进程通信,如此来回往复。
1.3Docker内部要理解Docker内部构建,需要理解以下三种部件:
Docker镜像-DockerimagesDocker仓库-DockerregisteriesDocker容器-DockercontainersDocker镜像Docker镜像是Docker容器运行时的只读模板,每一个镜像由一系列的层(layers)组成。
Docker使用UnionFS来将这些层联合到单独的镜像中。
UnionFS允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。
正因为有了这些层的存在,Docker是如此的轻量。
当你改变了一个Docker镜像,比如升级到某个程序到新的版本,一个新的层会被创建。
因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。
现在你不用重新发布整个镜像,只需要升级,层使得分发Docker镜像变得简单和快速。
Docker仓库Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。
同样的,Docker仓库也有公有和私有的概念。
公有的Docker仓库名字是DockerHub。
DockerHub提供了庞大的镜像集合供使用。
这些镜像可以是自己创建,或者在别人的镜像基础上创建。
Docker仓库是Docker的分发部分。
Docker容器Docker容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。
每一个Docker容器都是从Docker镜像创建的。
Docker容器可以运行、开始、停止、移动和删除。
每一个Docker容器都是独立和安全的应用平台,Docker容器是Docker的运行部分。
1.4libcontainerDocker从0.9版本开始使用libcontainer替代lxc,libcontainer和Linux系统的交互图如下:
图片来源:
Docker0.9:
introducingexecutiondriversandlibcontainer1.5命名空间「Namespaces」pidnamespace不同用户的进程就是通过pidnamespace隔离开的,且不同namespace中可以有相同PID。
具有以下特征:
每个namespace中的pid是有自己的pid=1的进程(类似/sbin/init进程)每个namespace中的进程只能影响自己的同一个namespace或子namespace中的进程因为/proc包含正在运行的进程,因此在container中的pseudo-filesystem的/proc目录只能看到自己namespace中的进程因为namespace允许嵌套,父namespace可以影响子namespace的进程,所以子namespace的进程可以在父namespace中看到,但是具有不同的pid参考文档:
IntroductiontoLinuxnamespaces-Part3:
PIDmntnamespace类似chroot,将一个进程放到一个特定的目录执行。
mntnamespace允许不同namespace的进程看至U的文件结构不同,这样每个namespace中的进程所看到的文件目录就被隔离开了。
同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mountpoint。
netnamespace网络隔离是通过netnamespace实现的,每个netnamespace有独立的networkdevices,IPaddresses,IProutingtables,/proc/net目录。
这样每个container的网络就能隔离开来。
docker默认采用veth的方式将container中的虚拟网卡同host上的一个dockerbridge连接在一起。
参考文档:
IntroductiontoLinux
namespaces-Part5:
NETutsnamespaceUTS('UNIXTime-sharingSystem')namespace允许每个container拥有独立的hostname和domainname,使其在网络上可以被视作一个独立的节点而非Host上的一个进程。
参考文档:
IntroductiontoLinuxnamespaces-Part1:
UTSipcnamespacecontainer中进程交互还是采用Linux常见的进程间交互方法(interprocesscommunication-IPC),包括常见的信号量、消息队列和共享内存。
然而同VM不同,container的进程间交互实际上还是host上具有相同pidnamespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息-每个IPC资源有一个唯一的32bitID。
参考文档:
IntroductiontoLinuxnamespaces—Part2:
IPCusernamespace每个container可以有不同的user和groupid,也就是说可以以container内部的用户在container内部执行程序而非Host上的用户。
有了以上6种namespace从进程、网络、IPC、文件系统、UTS和用户角度的隔离,一个container就可以对外展现出一个独立计算机的能力,并且不同container从OS层面实现了隔离。
然而不同namespace之间资源还是相互竞争的,仍然需要类似ulimit来管理每个container所能使用的资源-cgroup。
ReferenceDockerGettingStart:
RelatedKnowledgeDocker介绍以及其相关术语、底层原理和技术1.6资源配额「cgroups」
cgroups实现了对资源的配额和度量。
cgroups的使用非常简单,提供类似文件的接口,在/cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并
将pid写入该文件,即可实现对该进程的资源控制。
具体的资源配置选项可以在该文件夹中新建子subsystem,{子系统前缀}.{资源项}是典型的配置方法,如memory.usageinbytes就定义了该group在subsystemmemory中的一个内存限制选项。
另外,cgroups中的subsystem可以随意组合,一个subsystem可以在不同的group中,也可以一个group包含多个subsystem-也就是说一个subsystem。
memory内存相关的限制cpu在cgroup中,并不能像硬件虚拟化方案一样能够定义CPU能力,但是能够定义CPU轮转的优先级,因此具有较高CPU优先级的进程会更可能得到CPU运算。
通过将参数写入cpu.shares,即可定义改cgroup的CPU优先级-这里是一个相对权重,而非绝对值blkioblockIO相关的统计和限制,byte/operation统计和限制(IOPS等),读写速度限制等,但是这里主要统计的都是同步IOdevices设备权限限制参考文档:
howtousecgroup二、Docker安装docker的相关安装方法这里不作介绍,具体安装参考官档获取当前docker版本$sudodockerversionClientversion:
1.3.2ClientAPIversion:
1.15Goversion(client):
go1.3.3Gitcommit(client):
39fa2fa/1.3.2OS/Arch(client):
linux/amd64Serverversion:
1.3.2ServerAPIversion:
1.15Goversion(server):
go1.3.3Gitcommit(server):
39fa2fa/1.3.2三、Docker基础用法DockerHUB:
Docker镜像首页,包括官方镜像和其它公开镜像因为国情的原因,国内下载DockerHUB官方的相关镜像比较慢,可以使用镜像,镜像保持和官方一致,关键是速度块,推荐使用。
3.1Searchimages$sudodockersearchubuntu3.2Pullimages$sudodockerpullubuntu#获取ubuntu官方镜像$sudodockerimages#查看当前镜像列表3.3Runninganinteractiveshell$sudodockerrun-i-tubuntu:
14.04/bin/bashdockerrun-运行一个容器-t-分配一个(伪)tty(linkisexternal)-i-交互模式(sowecaninteractwithit)ubuntu:
14.04-使用ubuntu基础镜像14.04/bin/bash-运行命令bashshell注:
ubuntu会有多个版本,通过指定tag来启动特定的版本[image]:
[tag]$sudodockerps#查看当前运行的容器,ps-a列出当前系统所有的容器CONTAINERIDIMAGE
COMMANDCREATEDSTATUSPORTS
NAMES6c9129e9df10ubuntu:
14.04
/bin/bash6minutesagoUp6minutescranky_babbage3.4相关快捷键退出:
Ctrl-Dorexitdetach:
Ctrl-P+Ctrl-Qattach:
dockerattachCONTAINER-ID四、Docker命令帮助4.1dockerhelpdockercommand$sudo
docker#docker命令帮助Commands:
像commitCreateanewimagefromacontainer's
changes#提交当前容器为新的镜像cpCopyfiles/foldersfromthecontainersfilesystemtothehostpath
#从容器中拷贝指定文件或者目录到宿主机中createCreateanewcontainer#创建一
个新的容器,同run,但不启动容器diffInspect
changesonacontainer'sfilesystem#查看docker容器变化eventsGetrealtimeeventsfromtheserver
#在已存在的容器
#从docker服务获取容器实时事件execRuna
上运行命令
commandinanexistingcontainer
exportStreamthecontentsofacontainer
imagefromthecontentsofatarball#从tar
包中的内容创建一个新的文件系统映像[对应export]
#显示系统相关信息informationonacontainerKillarunningcontainerdocker容器load
infoDisplaysystem-wideinformationinspectReturnlow-level
#查看容器详细信息kill
#kill指定
Loadanimagefromatararchive#从一个tar包中加载一个镜像[对应save]login
RegisterorLogintothedockerregistryserver
#注册或者登陆一个docker源服务器logoutLogoutfromaDockerregistryserver#从当前Docker
registry退出logsFetchthelogsofacontainer
#输出当前容器日志信息portLookupthepublic-facingportwhichisNAT-edtoPRIVATE_PORT
#查看映射端口对应的容器内部源端口pause
Pauseallprocesseswithinacontainer#暂停容器
psListcontainers
#列出容器列表pullPullanimageorarepository
fromthedockerregistryserver#从docker镜
像源服务器拉取指定镜像或者库镜像pushPushanimageorarepositorytothedockerregistryserver
#推送指定镜像或者库镜像至docker源服务器restart
#重启运行
Restartarunningcontainer
#移除一个或者多个容器rmi
Removeoneor
moreimages
#移除一个
或多个镜像[无容器使用该镜像才可删除,
否则需删除相关容
器才可继续或-f强制删除]run
Runacommand
的容器rm
Removeoneormorecontainers
inanewcontainer#创建一个新的容器并运行一个命令saveSaveanimagetoatararchive
#保存一个镜像为一个tar包[对应load]searchSearchforanimageontheDockerHub#在docker
hub中搜索镜像startStartastoppedcontainers
#启动容器stop
#停止容器tag
#给源中镜像打标签
Stoparunningcontainers
TaganimageintoarepositorytopLookuptherunning
unpauseUnpauseapausedcontainer
#取消暂停容器versionShowthedockerversioninformation#查看docker版本号wait
Blockuntilacontainerstops,thenprintitsexitcode
#截取容器停止时的退出状态值Run'dockerCOMMAND
--help'formoreinformationonacommand.dockeroptionUsageofdocker:
--api-enable-cors=falseEnable
CORSheadersintheremoteAPI
远程API中开启CORS头-b,--bridge=''
Attachcontainerstoapre-existingnetworkbridge#桥接网络
use'none'todisablecontainernetworking--bip=''
UsethisCIDRnotationaddressforthenetworkbridge'sIP,notcompatiblewith-b
#和-b选项不兼容,具体没有测试过-d,--daemon=false
Enabledaemonmode
#daemon模式-D,--debug=false
Enabledebugmode
#debug模式--dns=[]
ForcedockertousespecificDNSservers
#强制docker使用指定dns服务器--dns-search=[]
ForceDockertousespecificDNSsearchdomains
#强制docker使用指定dns搜索域-e,
--exec-driver='native'Forcethedockerruntime
touseaspecificexecdriver#强制docker运行时使用
指定执行驱动器--fixed-cidr=''
IPv4subnetforfixedIPs(ex:
10.20.0.0/16)
thissubnetmustbenestedinthebridgesubnet(whichisdefinedby-bor--bip)-G,--group='docker'
Grouptoassigntheunixsocketspecifiedby-Hwhenrunningindaemonmode
use''(theemptystring)todisablesettingofagroup-g,--graph='/var/lib/docker'Pathtouseastherootof
thedockerruntime#容器运行的根目录路径
-H,--host=[]
Thesocket(s)to
bindtoindaemonmode
#daemon模
式下docker指定绑定方式[tcpor本地
socket]
specifiedusingoneormoretcp:
//host:
port,
unix:
///path/to/socket,fd:
//*orfd:
//socketfd.
--icc=true
Enableinter-containercommunication
#跨容器通信--insecure-registry=[]
Enableinsecurecommunicationwithspecifiedregistries(nocertificateverificationforHTTPSandenableHTTPfallback)(e.g.,localhost:
5000or10.20.0.0/16)--ip='0.0.0.0'DefaultIPaddresstousewhen