我们首先来看看 /var/lib/docker/这个文件夹下的内容。打开这个文件夹下的 repositories 文件,你将会看到类似下面这样的JSON 文件:
$ sudo cat /var/lib/docker/repositories | python -mjson.tool { “Repositories”: { “ubuntu”: { “12.04″: “8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c”, “12.10″: “b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc”, “latest”: “8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c”, “precise”: “8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c”, “quantal”: “b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc” } } }
看看,是不是正好和docker images的内容一致呢。
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 12.04 8dbd9e392a96 8 months ago 131.3 MB (virtual 131.3 MB) ubuntu latest 8dbd9e392a96 8 months ago 131.3 MB (virtual 131.3 MB) ubuntu precise 8dbd9e392a96 8 months ago 131.3 MB (virtual 131.3 MB) ubuntu 12.10 b750fe79269d 8 months ago 24.65 kB (virtual 179.7 MB) ubuntu quantal b750fe79269d 8 months ago 24.65 kB (virtual 179.7 MB)
接着,我们再来看看 /var/lib/docker/graph/这个文件夹:
$ sudo ls -al /var/lib/docker/graph total 24drwx—— 6 root root 4096 Nov 22 06:52 . drwx—— 5 root root 4096 Dec 13 04:25 .. drwxr-xr-x 3 root root 4096 Dec 13 04:26 27cf784147099545 drwxr-xr-x 3 root root 4096 Nov 22 06:52 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c drwxr-xr-x 3 root root 4096 Nov 22 06:52 b750fe79269d2ec9a3c593ef05b4332b1d1a02a62b4accb2c21d589ff2f5f2dc drwx—— 3 root root 4096 Nov 22 06:52 _tmp
这些输出结果可能有点晦涩(Not terribly friendly),但是从中我们可以看出Docker是使用repositories JSON文件来记述镜像信息的,此JSON文件包含了仓库名、标签、以及标签对应的镜像ID。
我们有两个来自ubuntu仓库的镜像,这其中标签为12.04,precise和latest都指向的是同一个镜像,其ID为 8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c (这个ID长度为64位,但是我们可以使用其12位的简短模式,比如8dbd9e392a96)。
那么这些以镜像ID命名的文件夹下面又保存了什么东西呢?
$ sudo ls -al /var/lib/docker/graph/8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c total 20 drwxr-xr-x 3 root root 4096 Nov 22 06:52 . drwx—— 6 root root 4096 Nov 22 06:52 ..-rw——- 1 root root 437 Nov 22 06:51 jsondrwxr-xr-x 22 root root 4096 Apr 11 2013 layer-rw——- 1 root root 9 Nov 22 06:52 layersize
这个文件夹下的内容如下:
json -保存着关于这个镜像的元数据
layersize – 一个整数,表示layer的大小。
layer/ – 子文件夹,保存着rootfs该容器的镜像
$ sudo cat /var/lib/docker/graph/8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c/json | python -mjson.tool { “comment”: “Imported from -“, “container_config”: { “AttachStderr”: false, “AttachStdin”: false, “AttachStdout”: false, “Cmd”: null, “Env”: null, “Hostname”: “”, “Image”: “”, “Memory”: 0, “MemorySwap”: 0, “OpenStdin”: false, “PortSpecs”: null, “StdinOnce”: false, “Tty”: false, “User”: “” }, “created”: “2013-04-11T14:13:15.57812-07:00″, “docker_version”: “0.1.4″, “id”: “8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c” } $ sudo cat /var/lib/docker/graph/8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c/layersize131301903$ sudo ls -al /var/lib/docker/graph/8dbd9e392a964056420e5d58ca5cc376ef18e2de93b5cc90e868a1bbc8318c1c/layer total 88drwxr-xr-x 22 root root 4096 Apr 11 2013 . drwxr-xr-x 3 root root 4096 Nov 22 06:52 .. drwxr-xr-x 2 root root 4096 Apr 11 2013 bin drwxr-xr-x 2 root root 4096 Apr 19 2012 boot drwxr-xr-x 4 root root 4096 Nov 22 06:51 dev drwxr-xr-x 41 root root 4096 Nov 22 06:51 etc drwxr-xr-x 2 root root 4096 Apr 19 2012 home drwxr-xr-x 11 root root 4096 Nov 22 06:51 lib drwxr-xr-x 2 root root 4096 Nov 22 06:51 lib64 drwxr-xr-x 2 root root 4096 Apr 11 2013 media drwxr-xr-x 2 root root 4096 Apr 19 2012 mnt drwxr-xr-x 2 root root 4096 Apr 11 2013 opt drwxr-xr-x 2 root root 4096 Apr 19 2012 proc drwx—— 2 root root 4096 Nov 22 06:51 root drwxr-xr-x 4 root root 4096 Nov 22 06:51 run drwxr-xr-x 2 root root 4096 Nov 22 06:51 sbin drwxr-xr-x 2 root root 4096 Mar 5 2012 selinux drwxr-xr-x 2 root root 4096 Apr 11 2013 srv drwxr-xr-x 2 root root 4096 Apr 14 2012 sys drwxrwxrwt 2 root root 4096 Apr 11 2013 tmp drwxr-xr-x 10 root root 4096 Nov 22 06:51 usr drwxr-xr-x 11 root root 4096 Nov 22 06:51 var
看到这里你应该有些顿悟了吧,这就是我们为什么即使我们不和远程索引或者注册表交互也能通过仓库名来使用一个镜像的原理了。因为一旦你将镜像从远程下载到本地,Docker可以通过仓库名称来使用它们。当你创建自己的Dockerfile的时候也不例外。