基本操作

  1. docker search [keyword] # 搜索镜像
  2. docker pull [<repo/container>:<tag>] # 下载镜像, tag可以不指定,默认使用 latest,代表最新版, docker pull centos 相当于 docker pull centos:latest
  3. docker images # 列出所有镜像
  4. docker image ls # 列出所有镜像
  5. docker image ls ubuntu # 列出 ubuntu 相关的镜像
  6. docker rmi [image1] [image2]... # 删除镜像
  7. docker image rm [image1] [image2]... # 删除镜像
  8. docker image rm -f [image1] [image2]... # 强制删除镜像
  9. docker image rm $(docker image ls -q redis) # 批量删除redis相关的镜像
  10. docker image rm $(docker image ls -q -f before=mongo:3.2) # 批量删除mongo3.2版本之前的镜像
  11. docker system df # 查看镜像、容器、数据卷所占用的空间
  12. docker history [image:tag] # 查看历史镜像
  13. docker build -f Dockerfile -t imageName # 使用Dockerfile进行镜像构建

虚悬镜像

在镜像列表中,还可能看到一些特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>

这个镜像原本是有镜像名和标签的,原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:

  1. $ docker image ls -f dangling=true
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. <none> <none> 00285df0df87 5 days ago 342 MB

一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。

  1. $ docker image prune

中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

  1. $ docker image ls -a

这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。

镜像构建

docker build 命令用于从 Dockerfile 构建镜像。

命令格式:

  1. docker build -f Dockerfile -t imageName # 使用Dockerfile进行镜像构建
  2. docker build -f Dockerfile -t imageName . # . 用于路径参数传递,标识当前路径

可以在 docker build 命令中使用 -f 标志指向文件系统中任何位置的 Dockerfile, 加上 -t 为构建的镜像打标签

  1. docker build -t '731734107/test' -f /path/to/a/Dockerfile # 以指定路径的Dockerfile进行构建

如果 Docker 文件就在当前目录,则不需要显式指定Dockerfile的路径:

  1. docker build -t "731734107/test" .