谁百度云有侠盗猎车手圣安地列斯百度云资源4资源

> 博客详情
以docker pull ubuntu:14.04为例
首先需要创建Docker Client,Docker Client的创建比较简单,这里暂时不说明。当用户输入docker pull Ubuntu:14.04后,进入解析工作,相关代码如下:
if&err&:=&cli.Cmd(flag.Args()...);&err&!=&nil&{
&&&&if&sterr,&ok&:=&err.(*utils.StatusError);&ok&{
&&&&&&&&if&sterr.Status&!=&""&{
&&&&&&&&&&&&log.Println(sterr.Status)
&&&&&&&&os.Exit(sterr.StatusCode)&
&&&&log.Fatal(err)&&&
其中,cli.Cmd()函数的具体代码如下:
//&Cmd&executes&the&specified&command
func&(cli&*DockerCli)&Cmd(args&...string)&error&{
&&&&if&len(args)&&&0&{
&&&&&&&&method,&exists&:=&cli.getMethod(args[0])
&&&&&&&&if&!exists&{
&&&&&&&&&&&&fmt.Println("Error:&Command&not&found:",&args[0])
&&&&&&&&&&&&return&cli.CmdHelp(args[1:]...)
&&&&&&&&return&method(args[1:]...)
&&&&return&cli.CmdHelp(args...)
根据docker pull ubuntu:14.04命令,函数Cmd里的形参args ...string所对应的实参为pull ubuntu:14.04。如果实参的长度大于0,则继续往下进行。cli调用getMethod处理args[0]即pull,得到具体的处理方法method,getMethod的具体代码如下:
func&(cli&*DockerCli)&getMethod(name&string)&(func(...string)&error,&bool)&{
&&&&if&len(name)&==&0&{
&&&&&&&&return&nil,&false
&&&&methodName&:=&"Cmd"&+&strings.ToUpper(name[:1])&+&strings.ToLower(name[1:])
&&&&method&:=&reflect.ValueOf(cli).MethodByName(methodName)
&&&&if&!method.IsValid()&{
&&&&&&&&return&nil,&false
&&&&return&method.Interface().(func(...string)&error),&true
根据以上流程,getMethod返回的方法为CmdPull,实参为ubuntu:14.04.其中,CmdPull函数的具体代码如下的所示:
func&(cli&*DockerCli)&CmdPull(args&...string)&error&{
&&&&cmd&:=&cli.Subcmd("pull",&"NAME[:TAG]",&"Pull&an&image&or&a&repository&from&the&registry")
通过cli的Subcmd方法,返回了一个Flagset类型的对象cmd,Subcmd的方法如下所示:
func (cli *DockerCli) Subcmd(name, signature, description string) *flag.FlagSet {
&&&&flags := flag.NewFlagSet(name, flag.ContinueOnError)
&&&&flags.Usage = func() {
&&&&&&&&fmt.Fprintf(cli.err, "\nUsage: docker %s %s\n\n%s\n\n", name, signature, description)
&&&&&&&&flags.PrintDefaults()
&&&&&&&&os.Exit(2)
tag&:=&cmd.String([]string{"#t",&"#-tag"},&"",&"Download&tagged&image&in&a&repository")
为cmd对象定义了一个类型为string的flag,初始值为空,目前这个flag参数基本已经弃用。
if&err&:=&cmd.Parse(args);&err&!=&nil&{
&&&&return&nil
对args参数进行解析,此时args的实参为ubuntu:14.04,解析过程中,首先提取是否有符合tag这个flag参数。若有,则赋值给tag参数,其余的参数存入cmd.NArg();若没有,则将所有的参数存入cmd.NArg()中。
if&cmd.NArg()&!=&1&{
&&&&cmd.Usage()
&&&&return&nil
判断经过flag解析后的参数列表,若参数个数不为1,则调用错误处理方法cmd.Usage()。ps,在docker的原先版本中是不支持同时下载多个镜像的,docker1.10版本后支持了该功能。
&&&&v&&&&&&=&url.Values{}
&&&&remote&=&cmd.Arg(0)
v.Set("fromImage",&remote)
if&*tag&==&""&{
&&&&v.Set("tag",&*tag)
创建一个map类型的变量v,该变量用来存放下拉镜像时所需的URL参数;通过以上设置后,v的值为{"fromImage":ubuntu, "tag":14.04]
remote,&_&=&parsers.ParseRepositoryTag(remote)
//&Resolve&the&Repository&name&from&fqn&to&hostname&+&name
hostname,&_,&err&:=&registry.ResolveRepositoryName(remote)
if&err&!=&nil&{
&&&&return&err
cli.LoadConfigFile()
//&Resolve&the&Auth&config&relevant&for&this&server
authConfig&:=&cli.configFile.ResolveAuthConfig(hostname)
通过cli对象获得与Docker Server通信所需要的配置信息。
pull&:=&func(authConfig&registry.AuthConfig)&error&{
&&&&buf,&err&:=&json.Marshal(authConfig)
&&&&if&err&!=&nil&{
&&&&&&&&return&err
&&&&registryAuthHeader&:=&[]string{
&&&&&&&&base64.URLEncoding.EncodeToString(buf),
&&&&return&cli.stream("POST",&"/images/create?"+v.Encode(),&nil,&cli.out,&map[string][]string{
&&&&&&&&"X-Registry-Auth":&registryAuthHeader,
定义名为pull的函数,传入的参数类型为registry.AuthConfig,函数最为重要的部分是
cli.stream("POST", "/images/create?"+v.Encode(), nil, cli.out, map[string][]string{
&&&&"X-Registry-Auth": registryAuthHeader,
cli的stream函数代码如下所示:
func&(cli&*DockerCli)&stream(method,&path&string,&in&io.Reader,&out&io.Writer,&headers&map[string][]string)&error&{
&&&&return&cli.streamHelper(method,&path,&true,&in,&out,&nil,&headers)
cli的streamHelper函数代码如下所示:
func&(cli&*DockerCli)&streamHelper(method,&path&string,&setRawTerminal&bool,&in&io.Reader,&stdout,&stderr&io.Writer,&headers&map[string][]string)&error&{
&&&&if&(method&==&"POST"&||&method&==&"PUT")&&&&in&==&nil&{
&&&&&&&&in&=&bytes.NewReader([]byte{})
&&&&req,&err&:=&http.NewRequest(method,&fmt.Sprintf("http://v%s%s",&api.APIVERSION,&path),&in)
&&&&if&err&!=&nil&{
&&&&&&&&return&err
&&&&req.Header.Set("User-Agent",&"Docker-Client/"+dockerversion.VERSION)
&&&&req.URL.Host&=&cli.addr
&&&&req.URL.Scheme&=&cli.scheme
&&&&if&method&==&"POST"&{
&&&&&&&&req.Header.Set("Content-Type",&"plain/text")
&&&&if&headers&!=&nil&{
&&&&&&&&for&k,&v&:=&range&headers&{
&&&&&&&&&&&&req.Header[k]&=&v
&&&&resp,&err&:=&cli.HTTPClient().Do(req)&
&&&&if&err&!=&nil&{&
&&&&&&&&&&&if&strings.Contains(err.Error(),&"connection&refused")&{&
&&&&&&&&&&&&&&&&&&return&fmt.Errorf("Cannot&connect&to&the&Docker&daemon.&Is&'docker&-d'&running&on&this&host?")&&
&&&&&&&&&&&}
&&&&&&&&&&&return&err
&&&&defer&resp.Body.Close()
&&&&if&resp.StatusCode&&&200&||&resp.StatusCode&&=&400&{
&&&&&&&&body,&err&:=&ioutil.ReadAll(resp.Body)
&&&&&&&&if&err&!=&nil&{
&&&&&&&&&&&&return&err
&&&&&&&&if&len(body)&==&0&{&&
&&&&&&&&&&&&return&fmt.Errorf("Error&:%s",&http.StatusText(resp.StatusCode))
&&&&&&&&return&fmt.Errorf("Error:&%s",&bytes.TrimSpace(body))
&&&&if&api.MatchesContentType(resp.Header.Get("Content-Type"),&"application/json")&{
&&&&&&&&return&utils.DisplayJSONMessagesStream(resp.Body,&stdout,&cli.terminalFd,&cli.isTerminal)
在stream函数里构建的请求会发送到docker server,并路由至相应的处理方法。其中,路由规则如下所示:
&&&&"/images/create": & & & & & & & &postImagesCreate,
因此,docker client发送过来的请求会进一步的交给postImagesCreate函数处理,具体代码如下所示:
&&&&image = r.Form.Get("fromImage")
&&&&repo &= r.Form.Get("repo")
&&&&tag & = r.Form.Get("tag")
&&&&job & *engine.Job
首先是解析请求参数,为后续job的运行提供依据‘另外,Docker Server通过从HTTP Header中解析出authEncoded,还原出类型为registry.AuthConfig的对象authConfig,源码如下:
authEncoded := r.Header.Get("X-Registry-Auth")
authConfig := &registry.AuthConfig{}
if authEncoded != "" {
&&&&authJson := base64.NewDecoder(base64.URLEncoding, strings.NewReader(authEncoded))
&&&&if err := json.NewDecoder(authJson).Decode(authConfig); err != nil {
&&&&&&&&// for a pull it is not an error if no auth was given
&&&&&&&&// to increase compatibility with the existing api it is defaulting to be empty
&&&&&&&&authConfig = &registry.AuthConfig{}
当解析出的image参数不为空的时候,则执行下述代码:
job = eng.Job("pull", image, tag)
job.SetenvBool("parallel", version.GreaterThan("1.3"))
job.SetenvJson("metaHeaders", metaHeaders)
job.SetenvJson("authConfig", authConfig)
eng是docker中处理任务的基本单元job的载体,其中在docker daemon启动的时候已经配置了“pull”所对应的处理方法,实际为graph包中的CmdPull函数,具体代码如下:
func&(s&*TagStore)&Install(eng&*engine.Engine)&error&{
&&&&for&name,&handler&:=&range&map[string]engine.Handler{
&&&&&&&&"image_set":&&&&&&s.CmdSet,
&&&&&&&&"image_tag":&&&&&&s.CmdTag,
&&&&&&&&"tag":&&&&&&&&&&&&s.CmdTagLegacy,&//&FIXME&merge&with&"image_tag"
&&&&&&&&"image_get":&&&&&&s.CmdGet,
&&&&&&&&"image_inspect":&&s.CmdLookup,
&&&&&&&&"image_tarlayer":&s.CmdTarLayer,
&&&&&&&&"image_export":&&&s.CmdImageExport,
&&&&&&&&"history":&&&&&&&&s.CmdHistory,
&&&&&&&&"images":&&&&&&&&&s.CmdImages,
&&&&&&&&"viz":&&&&&&&&&&&&s.CmdViz,
&&&&&&&&"load":&&&&&&&&&&&s.CmdLoad,
&&&&&&&&"import":&&&&&&&&&s.CmdImport,
&&&&&&&&"pull":&&&&&&&&&&&s.CmdPull,
&&&&&&&&"push":&&&&&&&&&&&s.CmdPush,
&&&&&&&&&if&err&:=&eng.Register(name,&handler);&err&!=&nil&{
&&&&&&&&&&&&&return&fmt.Errorf("Could&not&register&%q:&%v",&name,&err)
&&&&&&&&&}
&&&&&return&nil
CmdPull的函数的执行分为以下几个步骤:
&&&&localName & = job.Args[0]
&&&&sf & & & & &= utils.NewStreamFormatter(job.GetenvBool("json"))
&&&&authConfig &= &registry.AuthConfig{}
&&&&hostname, remoteName, err := registry.ResolveRepositoryName(localName)
&&&&endpoint, err := registry.ExpandAndVerifyRegistryUrl(hostname)
localName代表镜像的repository信息
tag代表镜像的tag信息
authConfig代表用户在指定的的Docker Registry上的认证信息
metaHeaders代表请求中的HTTP Headers信息
hostname代表Docker Registry信息
remoteName代表Docker镜像的repository名称信息
endpoint代表Docker Registry完整的URL
在TagStore类型中设计了pullingPool对象,用于保存正在下载的Docker镜像,下载完毕之前禁止其他docker client发起相同镜像的下载请求,下载完毕之后pullingPool中的记录被清楚。
c, err := s.poolAdd("pull", localName+":"+tag)
if err != nil {
&&&&if c != nil {
&&&&&&&&// Another pull of the same repository is
just wait for it to finish&&&&&&&&job.Stdout.Write(sf.FormatStatus("", "Repository %s already being pulled by another client. Waiting.", localName))
&&&&&&&&&-c
&&&&&&&&return engine.StatusOK
&&&&return job.Error(err)
defer s.poolRemove("pull", localName+":"+tag)
为了下载docker镜像,docker daemon采用了session机制从docker registry中下载镜像,
r, err := registry.NewSession(authConfig, registry.HTTPRequestFactory(metaHeaders), endpoint, true)
完成以上所有的配置之后,则进入真正的镜像下载阶段。
if err = s.pullRepository(r, job.Stdout, localName, remoteName, tag, sf, job.GetenvBool("parallel")); err != nil {
函数pullRepository的执行流程如下所示:
repoData, err := r.GetRepositoryData(remoteName)
函数GetRepositoryData的作用是获得镜像名称所在repository中所有image的ID信息。Docker Daemon通过RepositoryData和ImageData类型对象来存储这个repository中的所有的image信息。
tagsList, err := r.GetRemoteTags(repoData.Endpoints, remoteName, repoData.Tokens)
函数GetRemoteTags的作用是获取镜像名称所在repository中所有的tag信息。
if err := s.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil {
函数pullImage的作用是下载镜像,具体流程如下:
history, err := r.GetRemoteHistory(imgID, endpoint, token)
函数GetRemoteHistory的作用是获取指定image及其所有祖先image的id。
imgJSON, imgSize, err = r.GetRemoteImageJSON(id, endpoint, token)
函数GetRemoteImageJSON的作用是得到代表image的json信息imgJSON。
img, err = image.NewImgJSON(imgJSON)
通过imgJSON对象创建一个image对象。
layer, err := r.GetRemoteImageLayer(img.ID, endpoint, token, int64(imgSize))
函数GetRemoteImageLayer的作用是下载镜像layer的内容:该image在parent image之上做的文件系统内容更新,包括文件的增、删、改。
err = s.graph.Register(imgJSON,
&&&&utils.ProgressReader(layer, imgSize, out, sf, false, utils.TruncateID(id), "Downloading"),
函数Register完成镜像的存储。
err := s.Set(localName, tag, id, true)
func&(store&*TagStore)&Set(repoName,&tag,&imageName&string,&force&bool)&error&{
&&&&&&&&img,&err&:=&store.LookupImage(imageName)
&&&&&&&&store.Lock()
&&&&&&&&defer&store.Unlock()
&&&&&&&&if&tag&==&""&{
&&&&&&&&&&&&tag&=&DEFAULTTAG
&&&&&&&&if&err&:=&validateRepoName(repoName);&err&!=&nil&{
&&&&&&&&&&&&return&err
&&&&&&&&if&err&:=&validateTagName(tag);&err&!=&nil&{
&&&&&&&&...
&&&&&&&&if&err&:=&store.reload();&err&!=&nil
人打赏支持
码字总数 9730
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥Docker image 镜像是指什么呢?
1、Docker image 镜像是指什么呢?
孙宏亮解释 Docker image& 没看明白
2、镜像文件是用来做什么的呢?
网上解释是这么定义镜像文件的——镜像文件
所谓镜像文件其实和ZIP压缩包类似,它将特定的一系列文件按照一定的格式制作成单一的文件,以方便用户下载和使用,例如一个测试版的操作系统、游戏等。
镜像文件不仅具有ZIP压缩包的“合成”功能,它最重要的特点是可以被特定的软件识别并可直接刻录到光盘上。其实通常意义上的镜像文件可以再扩展一下,在
镜像文件中可以包含更多的信息。比如说系统文件、引导文件、分区表信息等,这样镜像文件就可以包含一个分区甚至是一块硬盘的所有信息。使用这类镜像文件的
经典软件就是Ghost,它同样具备刻录功能,不过它的刻录仅仅是将镜像文件本身保存在光盘上,而通常意义上的刻录软件都可以直接将支持的镜像文件所包含
的内容刻录到光盘上。
常见的镜像文件格式主要有:.iso、.bin、.nrg、.vcd、.cif、.fcd、.img、.ccd、.c2d、.dfi、.tao、.dao
和.cue 等。
3、gho镜像有什么用?
docker image可以简单理解为数据光盘(注意是只读的),可以被docker从image库中拉下来(自动安装后)运行,运行后就变成 实例 了。
问题2:你的文字已经讲得很清楚了。
问题3:gho文件,使用ghost软件将磁盘(如:安装了操作系统的磁盘或其他普通数据磁盘)备份为gho文件,在将来根据自己的需要完全覆盖恢复到指定磁盘上。对普通用户来说,主要是数据备份、数据安全保障作用;对系统管理员来说,可以提高操作系统安装效率。博客访问: 339982
博文数量: 210
博客积分: 0
博客等级: 民兵
技术积分: 2630
注册时间:
认证徽章:
鸟在笼中,恨关羽不能张飞;Survival of the fittest
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 虚拟化
1. 查看docker信息(version、info)
2. 对image的操作(search、pull、images、rmi、history)
3.&启动容器(run)
docker容器可以理解为在沙盒中运行的进程。这个沙盒包含了该进程运行所必须的资源,包括文件系统、系统类库、shell 环境等等。但这个沙盒默认是不会运行任何程序的。你需要在沙盒中运行一个进程来启动某一个容器。这个进程是该容器的唯一进程,所以当该进程结束的时候,容器也会完全的停止。
Note: &在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。apt-get 命令执行完毕之后,容器就会停止,但对容器的改动不会丢失。
4. 查看容器(ps)
5. 保存对容器的修改(commit)
当你对某一个容器做了修改之后(通过在容器中运行某一个命令),可以把对容器的修改保存下来,这样下次可以从保存后的最新状态运行该容器。
Note:&&image相当于类,container相当于实例,不过可以动态给实例安装新软件,然后把这个container用commit命令固化成一个image。
6. 对容器的操作(rm、stop、start、kill、logs、diff、top、cp、restart、attach)
Note:&attach命令允许你查看或者影响一个运行的容器。你可以在同一时间attach同一个容器。你也可以从一个容器中脱离出来,是从CTRL-C。
7. 保存和加载镜像(save、load)
当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
8、 登录registry server(login)
9. 发布image(push)
10.&&根据Dockerfile 构建出一个容器
阅读(24535) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 侠盗猎车手圣安地列斯百度云资源 的文章

 

随机推荐