非常详细的Docker学习笔记.docx

上传人:b****1 文档编号:2351538 上传时间:2023-05-03 格式:DOCX 页数:8 大小:82.59KB
下载 相关 举报
非常详细的Docker学习笔记.docx_第1页
第1页 / 共8页
非常详细的Docker学习笔记.docx_第2页
第2页 / 共8页
非常详细的Docker学习笔记.docx_第3页
第3页 / 共8页
非常详细的Docker学习笔记.docx_第4页
第4页 / 共8页
非常详细的Docker学习笔记.docx_第5页
第5页 / 共8页
非常详细的Docker学习笔记.docx_第6页
第6页 / 共8页
非常详细的Docker学习笔记.docx_第7页
第7页 / 共8页
非常详细的Docker学习笔记.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

非常详细的Docker学习笔记.docx

《非常详细的Docker学习笔记.docx》由会员分享,可在线阅读,更多相关《非常详细的Docker学习笔记.docx(8页珍藏版)》请在冰点文库上搜索。

非常详细的Docker学习笔记.docx

非常详细的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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2