搜索镜像

搜索镜像有两种方式(官方仓库搜索),一种是在网页上搜索,一种是通过命令进行搜索

通过网页搜索

打开Docker Hub官网,在搜索框中输入自己想要找的镜像名称,这里以myslq为例输入后 按回车进行检索,并可以对搜索结果进行过滤

点击自己需要的镜像,可以进入详情页面,通过详情页面可以获取到镜像下载命令,以及镜像使用说明等信息,可以帮助我们快速的使用镜像文件启动容器  

docker images没有 docker images找不到镜像_docker

通过命令搜索 

docker search 

# 命令格式
$ docker search [OPTIONS] TERM

搜索OPTIONS(选项)

--filter , -f:基于给定条件过滤输出

--format:使用模板格式化显示输出    

--limit:最大搜索结果数 ,默认值25

--no-trunc:禁止截断输出

--stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到--filter中使用 

示例

搜索镜像名中包含mysql的镜像
docker search mysql

 

docker images没有 docker images找不到镜像_容器_02

搜索镜像名中包含redis,star不少于5,不截断输出的镜像
docker search --filter stars=5 --no-trunc redis

docker images没有 docker images找不到镜像_容器_03

限制输出个数
docker search redis --limit 5

docker images没有 docker images找不到镜像_docker images没有_04

 过滤 --filter 的使用

 目前搜索支持的过滤条件有三个,分别是 stars(收藏星数)、is-automated(是否自动构建)、is-official(是否官方镜像)

搜索镜像名包含ubuntu,stars不少于10的官方镜像

docker search  --filter is-official=true  --filter stars=10 ubuntu

docker images没有 docker images找不到镜像_容器_05

搜索是否自动构建的镜像 

docker search -f is-automated=true mysql

docker images没有 docker images找不到镜像_容器_06

 搜索结果格式化输出

1).Description   镜像描述

2).StarCount    star数量    

3).IsOfficial    “OK” 表示官方镜像

4).IsAutomated    “OK” 表示自动构建 

 docker search --format "table {{.Name}}\t{{.IsAutomated}}\t{{.IsOfficial}}" nginx

docker images没有 docker images找不到镜像_docker_07

获取镜像

docker pull

# 命令格式
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

选项 

  • --all-tags , -a:下载所有标签镜像
  • --disable-content-trust:跳过验证,默认值true
  • --platform:体验版(daemon) 服务器支持多平台时进行选择    
  • --quiet , -q:静默输出   
  • Docker镜像仓库地址格式: <域名/IP>[:端口号]    默认的地址是Docker Hub(docker.io)
  • Docker镜像仓库的命名格式:仓库名通常以两段路径形式给出,<用户名>/<软件名>,比如library/mysql,前面的library标识Docker仓库多用户环境下的用户名,后者的mysql对应于软件名。对于Docker Hub如果不给出用户名,则默认为library,也就是官方镜像。
  • Docker镜像仓库中镜像命名格式:通常为了便于仓库管理,一个仓库会包含一个软件不同版本的镜像,而标签可用于标识不同版本。即我们可以通过<仓库名>:<Tag>的格式来标识仓库中的镜像,例如library/nginx:1.21.1如果不给出标签,则会使用默认的latest标签。
$ docker pull nginx:1.21.1
1.21.1: Pulling from library/nginx
a330b6cecb98: Pull complete
5ef80e6f29b5: Pull complete
f699b0db74e3: Pull complete
0f701a34c55e: Pull complete
3229dce7b89c: Pull complete
ddb78cb2d047: Pull complete
Digest: sha256:a05b0cdd4fc1be3b224ba9662ebdf98fe44c09c0c9215b45f84344c12867002e
Status: Downloaded newer image for nginx:1.21.1
docker.io/library/nginx:1.21.1

    由于镜像是由多层存储构成,所以下载也是一层一层的进行下载,下载每一层都会展现每一层的ID的前12位字符,下载结束后也会展示出完整镜像的sha256摘要信息,确保了下载一致性。

    上面命令中下载nginx镜像,没有指定docker镜像仓库地址,因此会从Docker Hub(docker.io)获取镜像。镜像名称为 nginx:1.21.1,则会获取官方镜像library/nginx仓库中标签为1.21.1的镜像。命令最后一行输出了镜像的完整名称:docker.io/library/nginx:1.21.1。

列出镜像

docker image ls、docker images、docker image list

# 命令格式
docker image ls [OPTIONS] [REPOSITORY[:TAG]]
选项
  -a, --all             Show all images (default hides intermediate images)(列出本地所有镜像,包含中间映像层,默认情况下会隐藏中间映像层)
       --digests         Show digests(显示镜像摘要信息)
   -f, --filter filter   Filter output based on conditions provided(过滤显示符合条件的镜像)
       --format string   Pretty-print images using a Go template(格式化输出)
       --no-trunc        Don't truncate output(显示完成的镜像信息)
   -q, --quiet           Only show numeric IDs(只显示镜像ID)
示例
docker image ls -a

docker images、docker image list与docker image ls 效果相同

docker images没有 docker images找不到镜像_nginx_08

 虚悬镜像

有时候在列出镜像的时候我们会发现有的镜像没有仓库名,也没有标签,仓库名和标记均显示<none>如下

$ docker images
REPOSITORY        TAG         IMAGE ID       CREATED         SIZE
redis             latest      2e50d70ba706   8 days ago      117MB
python            3.8         a603f4f4683f   8 days ago      912MB
node              latest      057129cb5d6f   9 days ago      998MB
node              16-alpine   97c7a05048e1   3 weeks ago     112MB
node              v1          97c7a05048e1   3 weeks ago     112MB
<none>            <none>      97c7a05048e1   3 weeks ago     112MB
nginx             1.21.1      822b7ec2aaf2   10 months ago   133MB
primetoninc/jdk   1.8         f4b4fccc65bb   4 years ago     657MB

 <none>镜像原本是有镜像名和标签的,由于官方对镜像进行维护,发布新版本后,重新使用docker pull拉取镜像时,原理的镜像名会转移到新下载的镜像上,旧镜像上的名字则被取消,从而变成了<none>。在我们使用 docker build 镜像的时候也会出现此现象,由于新旧镜像的名字相同,旧镜像将被新镜像取代,旧镜像的仓库名和标签都成了<none>。这种没有仓库名和标签名的镜像我们就称为虚悬镜像,虚悬镜像一般已经没有什么价值,可以根据自己需要进行删除。为了方便查看虚悬镜像,我们我们可以使用docker images -f dangling=true 或docker image ls -f dangling=true 命令可以专门显示此类镜像

$ docker images
REPOSITORY        TAG         IMAGE ID       CREATED         SIZE
<none>            <none>      97c7a05048e1   3 weeks ago     112MB

中间层镜像

docker中间层镜像最大的作用就是在镜像构建(docker build)中加速镜像构建、重复利用资源,可以简单的理解位它就是被其他镜像所依赖的镜像。在使用docker images查看镜像时只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像需要加上-a参数

$ docker images -a 

或
$ docker image ls -a

从显示的结果可以看到很多没有仓库名和标签的镜像,看上去和虚悬镜像一样与之不同的是中间层镜像被其他镜像所依赖。docker文件系统是由很多layers组成的,每个layer之间存在父子关系,所有的docker文件系统层默认存储在/var/lib/docker/graph目录下,所以这些<none>:<none>中间层镜像是依赖他们镜像的父镜像,这些镜像是不能随意删除的,删除后可能会导致上层镜像出错。这些镜像也不用手动镜像删除,在删除依赖他们的镜像时如果没有其它镜像依赖他们会被连带删除。

Docker镜像磁盘空间占用

在使用 docker image ls 命令查看镜像时所看到的镜像大小的总和并不是所有镜像的实际磁盘占用大小。由于docker镜像是多层存储的,并且可以继承、复用,不同的镜像可能会使用相同的基础镜像(父镜像),这样他们会具有共同的层,在docker中采用Union FS文件系统,此文件系统中相同的层只需要保存一份,因此实际镜像磁盘空间占用可能要比镜像列表中镜像大小的总和要小。可以通过docker system df 命令来查看镜像、容器、数据卷所占用的空间。

$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              20                  16                  3.207GB             424.6MB (13%)
Containers          47                  28                  32.34GB             26.96kB (0%)
Local Volumes       9                   8                   99.03MB             0B (0%)
Build Cache         0                   0                   0B                  0B

docker system df -v 显示详细的空间使用情况

$ docker system df -v
Images space usage:

REPOSITORY        TAG         IMAGE ID       CREATED         SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
nginx             v1          8b56e5a6346c   2 hours ago     133.2MB   133.2MB       38B           0
nginx             v2          cb3a30f5dc47   2 hours ago     133.2MB   133.2MB       31B           0
<none>            <none>      ed368af9ec53   2 hours ago     133.2MB   133.2MB       24B           0
redis             latest      2e50d70ba706   9 days ago      116.8MB   0B            116.8MB       0
python            3.8         a603f4f4683f   9 days ago      912.2MB   834.3MB       77.93MB       0
node              latest      057129cb5d6f   10 days ago     997.6MB   834.3MB       163.3MB       0
node              16-alpine   97c7a05048e1   3 weeks ago     112MB     0B            112MB         0
nginx             1.21.1      822b7ec2aaf2   10 months ago   133.2MB   133.2MB       0B            1
primetoninc/jdk   1.7         2b2bf2dcec72   4 years ago     589.1MB   0B            589.1MB       0
primetoninc/jdk   1.8         f4b4fccc65bb   4 years ago     657.3MB   0B            657.3MB       0

Containers space usage:

CONTAINER ID   IMAGE          COMMAND                  LOCAL VOLUMES   SIZE      CREATED          STATUS          NAMES
670627157e8d   nginx:1.21.1   "/docker-entrypoint.…"   0               1.09kB    24 minutes ago   Up 24 minutes   sad_neumann

Local Volumes space usage:

VOLUME NAME   LINKS     SIZE

Build cache usage: 0B

CACHE ID   CACHE TYPE   SIZE      CREATED   LAST USED   USAGE     SHARED

 指定格式列出镜像

  • 只输出镜像ID
$ docker image ls -q

docker images没有 docker images找不到镜像_docker_09

  •  输出镜像id、仓库名、和Tag

结合--format选项,使用go模板进行格式化输出,go 模板语法可以参考Hugo Templating

$ docker image ls --format "{{.ID}}:{{.Repository}}:{{.Tag}}"

docker images没有 docker images找不到镜像_nginx_10

 以表格形式输出

$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

docker images没有 docker images找不到镜像_docker_11

删除镜像

docker image rm、docker rmi、docker image remove

删除本地镜像命令格式如下

docker image rm [选项]  <镜像1> [<镜像2> <镜像3> ...]

选项

--force, -f  强制移除镜像

--no-prune  不移除该镜像的过程镜像,默认移除

docker rmi 和 docker image remove 与docker image rm

使用镜像名删除

$ docker rmi nginx:v1
Untagged: nginx:v1
Deleted: sha256:8b56e5a6346cc6354a3533992437229410f0914c0aaaefd3fb023c248e20055b
Deleted: sha256:4ca0b42043ec3edea4d93681c69cd98e9502b014ebd01048f78005ed618a565f

使用镜像ID删除(可以使用长ID或短ID)

# 短ID删除镜像
$ docker rmi 0ef90

# 长ID删除镜像
$ docker rmi feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

docker images没有 docker images找不到镜像_docker_12

删除注意事项

1. 在删除镜像时,如果由此镜像创建的容器未被销毁时,镜像是无法被删除的,因为有容器还在引用他。删除时报错信息如下,此时我们可以先删除由此镜像创建的容器然后再删除此镜像,或者在删除的时候使用 -f 参数进行强制删除。

Error response from daemon: conflict: unable to remove repository reference "nginx:1.21.1" (must force) - container 670627157e8d is using its referenced image 822b7ec2aaf2

2. 在使用ID删除的时候,如果一个ID对应了多个标签的镜像,删除时会提示以下错误信息。如果我们只是希望删除此ID对应的某一个标签的镜像,可以之间使用镜像名进行删除。如果需要删除此ID对应的所有标签的镜像时,可以在删除的时候加上 -f 参数进行强制删除。

 Error response from daemon: conflict: unable to delete 97c7a05048e1 (must be forced) - image is referenced in multiple repositories

docker images没有 docker images找不到镜像_容器_13

 

docker images没有 docker images找不到镜像_nginx_14

 镜像删除中Ungagged与Deleted

在删除镜像的时候,我们可以从输出的信息中发现删除分为两种,一种时Untagged,一种时Deleted。镜像的唯一标识是ID和摘要,一个镜像可以有多个标签。 当需要删除某个标签的镜像时,首先是取消此镜像的标签,也就是我们看到输出的 Untagged:node:16-alpine 之类信息。因为一个镜像可能有多个标签,在删除某一个标签后,可能还有其它标签指向这个镜像,如果是这种情况那么Delete动作则不会发生,只是取消了此镜像指定删除的标签。如下图

docker images没有 docker images找不到镜像_nginx_15

 当一个镜像所有的标签都被取消了,在删除此镜像的时候就会触发Delete行为。因为镜像是多层存储结构,这也使得镜像复用变的非常容易,正因如此有可能某个镜像正在依赖当前镜像的某一层,所以在删除的时候也是从上层向基础层依次判断依赖关系进行删除。如果此层仍被依赖就不会删除此层,直到没有任何镜像依赖此层时才会真正的删除当前层。

虚悬镜像删除

 docker image prune 删除虚悬镜像时会提示是否删除全部虚悬镜像,选择是(y)即可。如果不想提示可以在后面加上参数 -f 进行强行删除

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:ed368af9ec5306c8cc0d74021eb38b1c29529f133fe623be247f3b728241818f
deleted: sha256:d279a321e678584e18cb5bd2aa42599debb20242cb8503bbd2a7662a024c0733

Total reclaimed space: 24B

删除没有容器使用的镜像

docker image prune -a 可以删除没有容器使用的镜像,此操作慎重使用,会删除所有没有容器使用的镜像包括中间层镜像,可能有的镜像并不是你想删除的,删除时也可以结合 --filter 参数进行过滤删除以免误删。

docker images没有 docker images找不到镜像_docker_16

Docker镜像操作命令参考 Docker Image Documentation