首先说明一下如何从 Docker hub 中获取高质量的镜像,从 Docker 镜像库获取镜像的命令是 docker pull 。其命令格式为:
- docker pull[选项][Docker Registry地址 [: 端口号] / ]仓库名 [: 标签]
具体的选项可以通过 docker pull --help 命令看到,下面我们说一下镜像名称的格式:
比如:
- sudo docker pull ubuntu:16.04
- #输出一下信息
- 16.04: Pulling from library/ubuntu
- 50aff78429b1: Pull complete
- f6d82e297bce: Pull complete
- 275abb2c8a6f: Pull complete
- 9f15a39356d6: Pull complete
- fc0342a94c89: Pull complete
- Digest: sha256:fbaf303d18563e57a3c1a0005356ad102509b60884f3aa89ef9a90c0ea5d1212
- Status: Downloaded newer image for ubuntu:16.04
上述命令没有给出 docker 镜像仓库地址,将会从 docker hub 获取镜像。镜像名是 ubuntu:16.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜
像。
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也
是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结
束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。
有了 docker 镜像后,我们就可以以这个镜像为基础启动运行一个容器,以上面的镜像为例,我们想启动上面的 bash 并以交互的方式运行,可以使用一下命令:
- sudo docker run - it--rm ubuntu: 16.04 bash
docker run 是运行容器的命令,上面用到的参数意义如下:
进入容易后,我们可以通过 shell 执行任何所需要的命令,最后我们通过 exit 退出这个容器。
使用 sudo docker image ls 或则 sudo docker images 可以列出本地已下载的镜像。
- sudo docker image ls
- #结果
- REPOSITORY TAG IMAGE ID CREATED SIZE
- ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB
- hello-world latest f2a91732366c 6 weeks ago 1.85kB
从上面可知,列表包含了仓库名,标签,镜像 ID,创建时间,占用空间这些信息,镜像 ID 是镜像的唯一表示,一个镜像可以对应多个标签,相同镜像 ID 不同标签的镜像可以认为是同一个镜像
通过观察镜像的 size 我们可以发现,镜像表示所占用的空间和 docker hub 上看到的镜像的大小不一致。这是因为 docker hub 显示的大小是压缩后的体积大小。镜像的下载和上传过程中是保持压缩状态的。因此 docker hub 显示的大小是压缩后的体积大小。而 docker image 看到的是下载到本地后展开后的大小,是展开后各层所占用的空间的总和。查看空间的时候更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是, docker image ls 列表中的镜像体积总和并非是所有镜像实际硬
盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为
使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保
存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间:
- docker system df
- TYPE TOTAL ACTIVE SIZE RECLAIMABLE
- Images 2 1 110.5MB 110.5MB (99%)
- Containers 2 0 0B 0B
- Local Volumes 0 0 0B 0B
- Build Cache 0B 0B
悬挂镜像是一种特殊的镜像,这种镜像既没有仓库名也没有标签,他们的值都为
- docker image ls - f dangling = true
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:
docker image prune
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果
希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数
docker image ls -a
不加任何参数的情况下, docker image ls 会列出所有顶级镜像,但是有时候我们只希望列出
部分镜像。 docker image ls 有好几个参数可以帮助做到这个事情。
- docker image ls ubuntu
- docker image ls ubuntu: 16.04
- #如果镜像构建时,定义了 LABEL ,还可以通过 LABEL 来过滤
- docker image ls -f label=com.example.version=0.1
默认情况下, docker image ls 会输出一个完整的表格,但是我们并非所有时候都会需要这些
内容。比如,刚才删除虚悬镜像的时候,我们需要利用 docker image ls 把所有的虚悬镜像
的 ID 列出来,然后才可以交给 docker image rm 命令作为参数来删除指定的这些镜像,这个
时候就用到了 -q 参数
- docker image ls -q
- 00fd29ccc6f1
- f2a91732366c
另外一些时候,我们可能只是对表格的结构不满意,希望自己组织列;或者不希望有标题,
这样方便其它程序解析结果等,这就用到了 Go 的模板语法
比如,下面的命令会直接列出镜像结果,并且只包含镜像 ID 和仓库名:
- docker image ls--format "{{.ID}}: {{.Repository}}"
或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:
- docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
- IMAGE ID REPOSITORY TAG
- 00fd29ccc6f1 ubuntu 16.04
- f2a91732366c hello-world latest
删除本地镜像可以使用 docker image rm 命令格式如下:
- docker image rm[选项] < 镜像1 > [ < 镜像2 > ...]
其中, <镜像> 可以是 镜像短 ID 、 镜像长 ID 、 镜像名 或者 镜像摘要 。
如果我们需要删除所有仓库名为 redis 的镜像,可以使用下面的命令
- docker image rm $(docker image ls - q redis)
删除行为分为两类,一类是 Untagged,另一类是 Deleted。我们使用上述命令删除的时候,实际上是在要求删除某个标签的镜像,这就是我们看到的 Untagged 信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像。如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker rmi 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。
来源: http://www.bubuko.com/infodetail-2453865.html