xuncode 发表于 2015-10-13 09:25:29

Docker中的镜像

Docker中的镜像


1、镜像命名


在本机查看镜像:
$ docker images
REPOSITORY          TAG               IMAGE ID            CREATED             VIRTUAL SIZE
learn/deploy_new    bloomfilterv0.1   33c4fc7846db      46 hours ago      196.2 MB
learn/deploy      latest            8acaaacef9e1      47 hours ago      209 MB


Repository下面有一系列打了tag的Image,每个Image有一个GUID,为了方便也可以通过Repository:tag来引用。


在Repository之上还有一个Registry。


Registry包含一个或多个Repository;
Repository包含一个或多个Image;
Image用GUID表示,有一个或多个Tag与之关联。


对于如下命令:
docker pull centos


其实相当于(Registry/Repository:Tag):
docker pull index.docker.io/library/centos:latest


最终下载的镜像都是:
REPOSITORY          TAG               IMAGE ID            CREATED             VIRTUAL SIZE
centos            latest            7322fbe74aa5      10 weeks ago      172.2 MB


2、配置Registry Mirror(可跳过)


如果直接使用国外的Registry,速度会非常慢,为了提高下载速度,可以使用Registry Mirror:


在DaoCloud上注册后,执行下列命令安装daomonit:


curl -sSL https://get.daocloud.io/daomonit/install.sh | sh -s dad55b899168bebb5d622f1045cb7fb2f5ebe5df


卸载方法:dpkg -r daomonit;


看到如下提示表示安装成功,重启docker生效(sudo service docker restart):
...
You have successfuly configured your docker mirror.
You need to restart docker to enable the docker mirror
...


查看已修改的配置:
more /etc/default/docker
发现配置文件中多了一行:
DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://8bfb7c60.m.daocloud.io"


这样就可以直接使用docker pull命令拉镜像了,除此之外不用关心任何问题,唯一的变化就是速度更快。


3、镜像的内容及存储位置


docker history ubuntu
IMAGE               CREATED             CREATED BY                                    SIZE                COMMENT
91e54dfb1179      7 days ago          /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B               
d74508fb6632      7 days ago          /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/   1.895 kB            
c22013c84729      7 days ago          /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic   194.5 kB            
d3a1f33e8a5a      7 days ago          /bin/sh -c #(nop) ADD file:5a3f9e9ab88e725d60   188.2 MB            


可以看到直接下载的官方ubuntu镜像分4层。


查看每层的内容,Docker镜像层的内容一般在Docker根目录的aufs路径下,为/var/lib/docker/aufs/diff/:


进入该目录执行:


root@python-Lenovo:/var/lib/docker/aufs/diff# ls | xargs ls


...


91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c:


c22013c8472965aa5b62559f2b540cd440716ef149756e7b958a1b2aba421e87:
etcsbinusr var


d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391:
bin   devhomelib64 mntprocrunsrvtmpvar
bootetclib mediaoptrootsbinsysusr


d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82:
etc


...


可以看到91e的镜像层中不包含文件系统,其他3个层都包含文件,因为d74处在上层,因此etc的内容最终被d74中的etc覆盖。


每个镜像层还包含了一个json文件,json文件的存储路径为/var/lib/docker/graph:


root@python-Lenovo:/var/lib/docker/graph# ls | xargs ls


...


91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c:
jsonlayersize


c22013c8472965aa5b62559f2b540cd440716ef149756e7b958a1b2aba421e87:
jsonlayersize


d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391:
jsonlayersize


d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82:
jsonlayersize


...


layersize记录了镜像层内部文件内容的总大小。


看看镜像层91e的json内容:


root@python-Lenovo:/var/lib/docker/graph/91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c# more json
{"id":"91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c","parent
":"d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82","created":"
2015-08-20T20:21:15.767240511Z","container":"74bb7db8d212f77ab6d467b710451e54d2c
60533f641de8c91e7ef343b88a146","container_config":{"Hostname":"e611e15f9c9d","Do
mainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":f
alse,"PortSpecs":null,"ExposedPorts":null,"Tty":false,"OpenStdin":false,"StdinOn
ce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"/bin/bash\"]"],"Image"
:"d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82","Volumes":nu
ll,"VolumeDriver":"","WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"
MacAddress":"","OnBuild":null,"Labels":{}},"docker_version":"1.7.1","config":{"H
ostname":"e611e15f9c9d","Domainname":"","User":"","AttachStdin":false,"AttachStd
out":false,"AttachStderr":false,"PortSpecs":null,"ExposedPorts":null,"Tty":false
,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/bash"],"Image":"d74
508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82","Volumes":null,"V
olumeDriver":"","WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"MacAd
dress":"","OnBuild":null,"Labels":{}},"architecture":"amd64","os":"linux","Size"
:0}


4、镜像与容器的启动


容器的启动可以概括为以下两点:
Docker可以通过解析Docker镜像的json的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,此时也就实现了静态向动态的转变。
Docker守护进程手握Docker镜像的json文件,为容器配置相应的环境,并真正运行Docker镜像所指定的进程,完成Docker容器的真正创建。

         版权声明:本文为博主原创文章,未经博主允许不得转载。
页: [1]
查看完整版本: Docker中的镜像