dockerhistory显示完整信息_Docker的镜像基本原理和概念

更新时间:2023-07-13 04:59:59 阅读: 评论:0

dockerhistory显⽰完整信息_Docker的镜像基本原理和概念
这篇⽂章主要讲讲 docker 中镜像有关的知识,将涉及到下⾯⼏个⽅⾯:
docker images 命令的使⽤
docker 和 registry 交互的过程,pull 命令到底做了什么
docker storage driver
aufs 的格式和实际的组织结构怎么让脸变白
Dockerfile 原语和 docker 镜像之间的关系
作者:cizixs
时间:2016-04-06
原⽂链接: /2016/04/06/d ocker-images/
简介
docker 镜像代表了容器的⽂件系统⾥的内容,是容器的基础,镜像⼀般是通过 Dockerfile ⽣成的
docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上⾃⼰这层的内容⽣成的
每⼀层镜像的元数据都是存在 json ⽂件中的,除了静态的⽂件系统之外,还会包含动态的数据
使⽤镜像:docker image 命令
docker client 提供了各种命令和 daemon 交互,来完成各种任务,其中和镜像有关的命令有:
docker images :列出 docker host 机器上的镜像,可以使⽤ -f 进⾏过滤
docker build:从 Dockerfile 中构建出⼀个镜像
docker history:列出某个镜像的历史
docker import:从 tarball 中创建⼀个新的⽂件系统镜像
docker pull:从 docker registry 拉去镜像
docker push:把本地镜像推送到 registry
docker rmi: 删除镜像
docker save:把镜像保存为 tar ⽂件
docker arch:在 docker hub 上搜索镜像
docker tag:为镜像打上 tag 标记
从上⾯这么多命令中,我们就可以看出来,docker 镜像在整个体系中的重要性。
下载镜像:pull 和 push 镜像到底在做什么?
如果了解 docker 结构的话,你会知道 docker 是典型的 C/S 架构。平时经常使⽤的 docker pull, docker run 都是客户端的命令,最终这些命令会发送到 rver 端(docker daemon 启动的时候会启动docker rver)进⾏处理。下载镜像还会和 Registry 打交道,下⾯我们就说说使⽤ docker pull 的时候,docker 到底在做些什么!
docker client 组织配置和参数,把 pull 指令发送给 docker rver,rver 端接收到指令之后会交给对应的 handler。handler 会新开⼀个 CmdPull job 运⾏,这个 job 在 docker daemon 启动的时候被注册进来,所以控制权就到了 docker daemon 这边。docker daemon 是怎么根据传过来的 registry 地址、repo 名、image 名和tag 找到要下载的镜像呢?具体流程如下:
1. 获取 repo 下⾯所有的镜像 id:GET /repositories/{repo}/images
2. 获取 repo 下⾯所有 tag 的信息: GET /repositories/{repo}/tags
3. 根据 tag 找到对应的镜像 uuid,并下载该镜像
获取该镜像的 history 信息,并依次下载这些镜像层: GET /images/{image_id}/ancestry
如果这些镜像层已经存在,就 skip,不存在的话就继续
获取镜像层的 json 信息:GET /images/{image_id}/json
下载镜像内容: GET /images/{image_id}/layer
下载完成后,把下载的内容存放到本地的 UnionFS 系统
在 TagStore 添加刚下载的镜像信息
存储镜像:docker storage 介绍
在上⼀个章节提到下载的镜像会保存起来,这⼀节就讲讲到底是怎么存的。
UnionFS 和 aufs
如果对 docker 有所了解的话,会听说过 UnionFS 的概念,这是 docker 实现层级镜像的基础。在 wikipedia 是这么解释的:
Unionfs is a filesystem rvice for Linux, FreeBSD and NetBSD which
implements a union mount for other file systems. It allows files and
directories of parate file systems, known as branches, to be
transparently overlaid, forming a single coherent file system.
Contents of directories which have the same path within the merged
branches will be en together in a single merged directory, within
the new, virtual filesystem.
简单来说,就是⽤多个⽂件夹和⽂件(这些是系统⽂件系统的概念)存放内容,对上(应⽤层)提供虚拟的⽂件访问。
⽐如 docker 中有镜像的概念,应⽤层看来只是⼀个⽂件,可以读取、删除,在底层却是通过 UnionFS 系统管理各个镜像层的内容和关系。
docker 负责镜像的模块是 Graph,对上提供⼀致和⽅便的接⼝,在底层通过调⽤不同的 driver 来实现。常⽤的 driver 包括 aufs、devicemapper,这样的好处是:⽤户可以选择甚⾄实现⾃⼰的 driver。
aufs 镜像在机器上的存储结构
NOTE:高考的英语
只下载了 ubuntu:14.04 镜像
docker version:1.6.3
image driver:aufs
使⽤ docker history 查看镜像历史:
药膳root@cizixs-ThinkPad-T450:~# docker images
REPOSITORY                TAG                IMAGE ID            CREATED            VIRTUAL SIZE
172.16.1.41:5000/ubuntu  14.04              2d24f826cb16        13 months ago      188.3 MB
root@cizixs-ThinkPad-T450:~# docker history 2d24
IMAGE              CREATED              CREATED BY                                      SIZE
2d24f826cb16        13 months ago        /bin/sh -c #(nop) CMD [/bin/bash]              0 B
117ee323aaa9        13 months ago        /bin/sh -c d -i 's/^#s*(deb.*univer)$/  1.895 kB
1c8294cc5160        13 months ago        /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic  194.5 kB
fa4fd76b09ce        13 months ago        /bin/sh -c #(nop) ADD file:0018ff77d038472f52  188.1 MB
511136ea3c5a        2.811686 years ago                                                  0 B
可以看到,ubuntu:14.04 ⼀共有五层镜像。aufs 数据存放在 /var/lib/docker/aufs ⽬录下:
root@cizixs-ThinkPad-T450:/var/lib/docker/aufs# tree -L 1
.
├── diff
├── layers
└── mnt
⼀共有三个⽂件夹,每个⽂件夹下⾯都是以镜像 id 命令的⽂件夹,保存了每个镜像的信息。先来介绍⼀下这三个⽂件夹
layers:显⽰了每个镜像有哪些层构成
diff:每个镜像的和之前镜像的区别,就是这⼀层的内容
mnt:UnionFS 对外提供的 mount point,因为 UnionFS 底层是多个⽂件夹和⽂件,对上层要提供统⼀的⽂件服务,是通过 mount 的形式实现的。每个运⾏的容器都会在这个⽬录下有⼀个⽂件夹
⽐如 diff ⽂件夹是这样的:
root@cizixs-ThinkPad-T450:/var/lib/docker/aufs# ls diff/2d24f826cb16146e2016ff349a8a33ed5830f3b938d45c0f82943f4ab8c097e7/
root@cizixs-ThinkPad-T450:/var/lib/docker/aufs# ls diff/117ee323aaa9d1b136ea55e4421f4ce413dfc6c0cc6b2186dea6c88d93e1ad7c/
etc
root@cizixs-ThinkPad-T450:/var/lib/docker/aufs# ls diff/1c8294cc516082dfbb731f062806b76b82679ce38864dd87635f08869c993e45/
etc  sbin  usr  var
root@cizixs-ThinkPad-T450:/var/lib/docker/aufs# ls diff/fa4fd76b09ce9b87bfdc96515f9a5dd5121c01cc996cf5379050d8e13d4a864b/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@cizixs-ThinkPad-T450:/var/lib/docker/aufs# ls diff/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/
除了这些实际的数据之外,docker 还为每个镜像层保存了 json 格式的元数据,存储在 /var/lib/docker/graph//json,⽐如:
root@cizixs-ThinkPad-T450:/var/lib/docker# cat graph/2d24f826cb16146e2016ff349a8a33ed5830f3b938d45c0f82943f4ab8c097e7/json | jq '.'
{
{
"id": "2d24f826cb16146e2016ff349a8a33ed5830f3b938d45c0f82943f4ab8c097e7",
"parent": "117ee323aaa9d1b136ea55e4421f4ce413dfc6c0cc6b2186dea6c88d93e1ad7c",
"created": "2015-02-21T02:11:06.735146646Z",
dnf疲劳值"container": "c9a3eda5951d28aa8dbe5933be94c523790721e4f80886d0a8e7a710132a38ec",  "container_config": {
"Hostname": "43bd710ec89a",
梅州客家人
"Domainname": "",
"Ur": "",
"Memory": 0,
"MemorySwap": 0,
"CpuShares": 0,
"Cput": "",
"AttachStdin": fal,
"AttachStdout": fal,
"AttachStderr": fal,
"PortSpecs": null,
"ExpodPorts": null,
"Tty": fal,
"OpenStdin": fal,
男孩女孩教案
"StdinOnce": fal,
"Env": [沙滩的滩
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) CMD [/bin/bash]"
],
"Image": "117ee323aaa9d1b136ea55e4421f4ce413dfc6c0cc6b2186dea6c88d93e1ad7c",    "Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"NetworkDisabled": fal,
"MacAddress": "",
"OnBuild": [],
"Labels": null
},
"docker_version": "1.4.1",
"config": {
"Hostname": "43bd710ec89a",
"Domainname": "",
"Ur": "",
"Memory": 0,
"MemorySwap": 0,
"CpuShares": 0,
"Cput": "",
"AttachStdin": fal,
"AttachStdout": fal,
"AttachStderr": fal,
"PortSpecs": null,
"ExpodPorts": null,
"Tty": fal,
"OpenStdin": fal,
"StdinOnce": fal,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "117ee323aaa9d1b136ea55e4421f4ce413dfc6c0cc6b2186dea6c88d93e1ad7c",    "Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"NetworkDisabled": fal,
"NetworkDisabled": fal,
"MacAddress": "",
"OnBuild": [],
"Labels": null
},
"architecture": "amd64",
"os": "linux",
"Size": 0
}大学生的责任与担当
除了 json 之外,还有⼀个⽂件 /var/lib/docker/graph//layersize 保存了镜像层的⼤⼩。
创建镜像:镜像的 cache 机制
在使⽤ docker build 创建新的镜像的时候,docker 会使⽤到 cache 机制,来提⾼执⾏的效率。为了理解这个问题,我们先看⼀下 build 命令都做了哪些东西吧。
我们来看⼀个简单的 Dockerfile:
FROM ubuntu:14.04
RUN apt-get update
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]
这个⽂件虽然简单,却包含了很多命令:RUN、ADD、VOLUME、CMD 涉及到很多概念。
⼀般情况下,对于每条命令,docker 都会⽣成⼀层镜像。 cache 的作⽤也很容易猜测,如果在构建某个镜像层的时候,发现这个镜像⼀般情况下,对于每条命令,docker 都会⽣成⼀层镜像。
怎么知道要构建的镜像层已经存在了? 下⾯就重点解释这个问层已经存在了,就直接使⽤,⽽不是重
新构建。这⾥最重要的问题在于:怎么知道要构建的镜像层已经存在了?
题。
docker daemon 读到 FROM 命令的时候,会在本地查找对应的镜像,如果没有找到,会从 registry 去取,当然也会取到包含 metadata 的 json ⽂件。然后到了 RUN 命令,如果没有 cache 的话,这个命令会做什么呢?
我们已经知道,每层镜像都是由⽂件系统内容和 metadata 构成的。
⽂件系统的内容,就是执⾏ apt-get update 命令导致的⽂件变动,会保存到 /var/lib/docker/aufs/diff//,⽐如这⾥的命令主要会修改 /var/lib 和 /var/cache 下⾯和 apt 有关的内容:
root@cizixs-ThinkPad-T450:/var/lib/docker# tree -L 2 aufs/diff/e7ae26691ff649c55296adf7c0e51b746e22abefa6b30310b94bbb9cfa6fce63/
aufs/diff/e7ae26691ff649c55296adf7c0e51b746e22abefa6b30310b94bbb9cfa6fce63/
├── tmp
└── var
├── cache
└── lib
我们来看⼀下 json ⽂件的内容,最重要的改变就是 container_config.Cmd 变成了:
"Cmd": [
"/bin/sh",
"-c",
"apt-get update"
],
也就是说,如果下次再构建镜像的时候,我们发现新的镜像层 parent 还是 ubuntu:14.04,并且 json ⽂件中 cmd 要更改的内容也⼀致,那么就认为这两层镜像是相同的,不需要重新构建。好了,那么构建的时候,daemon ⼀定会遍历本地所有镜像,如果发现镜像⼀致就使⽤已经构建好的镜像。
ADD 和 COPY ⽂件

本文发布于:2023-07-13 04:59:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1093767.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:镜像   下载   命令   内容   时候   构建   系统
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图