搜索镜像
搜索镜像有两种方式(官方仓库搜索),一种是在网页上搜索,一种是通过命令进行搜索
通过网页搜索
打开Docker Hub官网,在搜索框中输入自己想要找的镜像名称,这里以myslq为例输入后 按回车进行检索,并可以对搜索结果进行过滤
点击自己需要的镜像,可以进入详情页面,通过详情页面可以获取到镜像下载命令,以及镜像使用说明等信息,可以帮助我们快速的使用镜像文件启动容器
通过命令搜索
docker search
# 命令格式
$ docker search [OPTIONS] TERM
搜索OPTIONS(选项)
--filter , -f:基于给定条件过滤输出
--format:使用模板格式化显示输出
--limit:最大搜索结果数 ,默认值25
--no-trunc:禁止截断输出
--stars , -s:弃用,只显示收藏数不小于几颗星的镜像,移到--filter中使用
示例
搜索镜像名中包含mysql的镜像
docker search mysql
搜索镜像名中包含redis,star不少于5,不截断输出的镜像
docker search --filter stars=5 --no-trunc redis
限制输出个数
docker search redis --limit 5
过滤 --filter 的使用
目前搜索支持的过滤条件有三个,分别是 stars(收藏星数)、is-automated(是否自动构建)、is-official(是否官方镜像)
搜索镜像名包含ubuntu,stars不少于10的官方镜像
docker search --filter is-official=true --filter stars=10 ubuntu
搜索是否自动构建的镜像
docker search -f is-automated=true mysql
搜索结果格式化输出
1).Description 镜像描述
2).StarCount star数量
3).IsOfficial “OK” 表示官方镜像
4).IsAutomated “OK” 表示自动构建
docker search --format "table {{.Name}}\t{{.IsAutomated}}\t{{.IsOfficial}}" nginx
获取镜像
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 效果相同
虚悬镜像
有时候在列出镜像的时候我们会发现有的镜像没有仓库名,也没有标签,仓库名和标记均显示<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
- 输出镜像id、仓库名、和Tag
结合--format选项,使用go模板进行格式化输出,go 模板语法可以参考Hugo Templating
$ docker image ls --format "{{.ID}}:{{.Repository}}:{{.Tag}}"
以表格形式输出
$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
删除镜像
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
删除注意事项:
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
镜像删除中Ungagged与Deleted
在删除镜像的时候,我们可以从输出的信息中发现删除分为两种,一种时Untagged,一种时Deleted。镜像的唯一标识是ID和摘要,一个镜像可以有多个标签。 当需要删除某个标签的镜像时,首先是取消此镜像的标签,也就是我们看到输出的 Untagged:node:16-alpine 之类信息。因为一个镜像可能有多个标签,在删除某一个标签后,可能还有其它标签指向这个镜像,如果是这种情况那么Delete动作则不会发生,只是取消了此镜像指定删除的标签。如下图
当一个镜像所有的标签都被取消了,在删除此镜像的时候就会触发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镜像操作命令参考 Docker Image Documentation