Docker 命令 之 镜像管理

摘要

docker search : 搜索镜像

  • 推荐在dockerhub上搜索镜像,以获取更详细的镜像信息。

1
2
3
4
5
6
7
8
9
10
$ docker search --help
用法: docker search [OPTIONS] TERM

在 Docker Hub 中搜索镜像

选项:
-f, --filter filter 根据提供的条件过滤输出,常见的过滤条件包括:stars(星级)、is-official(是否为官方镜像)
--format string 使用 Go 模板美化输出,不太常用
--limit int 搜索结果的最大数量
--no-trunc 不截断输出内容,显示完整信息(默认输出中某些字段如描述可能被截断)

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 搜索名称中包含 nginx 的镜像
$ docker search nginx

# 搜索名称中包含 nginx 且星级不少于 100 的镜像。
$ docker search -f stars=100 nginx
# 搜索官方镜像
$ docker search -f is-official=true nginx

# 搜索 nginx,按照指定模板格式化输出
$ docker search nginx --format "{{.Name}}: {{.StarCount}} stars: {{.Description}}"

# 搜索nginx镜像,并限制5个结果
$ docker search nginx --limit 5

# 组合使用多个选项
$ docker search -f stars=100 --limit 5 --no-trunc nginx

docker image : 镜像管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ docker image --help
用法: docker image COMMAND

管理镜像

命令:
build 从 Dockerfile 构建一个镜像,docker image build == docker build
history 显示镜像的历史记录, docker image history == docker history
import 从 tar 包导入内容以创建文件系统镜像,docker image import == docker import
inspect 显示一个或多个镜像的详细信息,docker image inspect == docker inspect
load 从 tar 归档或标准输入中加载镜像, docker image load == docker load
ls 列出镜像,docker image ls == docker images
prune 移除未使用的镜像
pull 从镜像仓库下载镜像,docker image pull == docker pull
push 上传镜像到镜像仓库,docker image push == docker push
rm 移除一个或多个镜像,docker image rm == docker rmi
save 将一个或多个镜像保存为 tar 归档(默认输出到标准输出), docker image save == docker save
tag 创建一个标签 TARGET_IMAGE 指向 SOURCE_IMAGE,docker image tag == docker tag

运行 'docker image COMMAND --help' 以获取某个命令的更多信息。

docker pull : 拉取镜像

  • docker image pull == docker pull

1
2
3
4
5
6
7
8
9
10
# 命令格式,不加tag默认拉取 :latest
$ docker pull <image_name>[:<tag>]

# 拉取nginx镜像,默认拉取最新版本:latest,nginx是官方镜像,完整名称实际上是 library/nginx
$ docker pull nginx == docker pull library/nginx == docker pull nginx:latest
# 拉取指定tag的镜像
$ docker pull nginx:1.28.0

# 拉取非官方镜像,用户上传的
$ docker pull hanqunfeng/alpine-jre8-slim:1.0.0

如何获取镜像tag

  • docker 命令中没有提供直接获取镜像tag的命令,如果不想到dockerhub上查看,可以通过如下方式获取:
1
2
3
4
5
6
7
8
9
10
11
# 只显示tag名称,官方镜像替换 nginx,非官方镜像替换 libryary/nginx,page_size=5表示每页5条数据,page=1表示第一页(默认为1)
curl -s "https://registry.hub.docker.com/v2/repositories/library/nginx/tags?page_size=5&page=1" | jq '.results[].name'

# 输出json格式,并显示最后更新时间和镜像大小
curl -s "https://registry.hub.docker.com/v2/repositories/library/nginx/tags?page_size=5&page=1" | jq '.results[] | {name,last_updated,full_size}'

# 输出表格格式,并格式化输出
curl -s "https://registry.hub.docker.com/v2/repositories/library/nginx/tags?page_size=5&page=1" \
| jq -r '.results[] |
"\(.name)\t\t\(.last_updated | sub("T"; " ") | sub("\\..*"; ""))\t\t\(((.full_size / 1024 / 1024 * 100 | round)/100) | tostring) MB"' \
| awk '{printf "%-30s %-20s %8.2f MB\n", $1, $2" "$3, $4}'

docker images : 列出镜像

  • docker image ls == docker images

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 列出所有镜像,不包括悬空镜像,(dangling images:没有 tag 的镜像,通常是构建中间产物,例如:<none>:<none> 形式。)
$ docker images
# 列出所有镜像,包括悬空镜像
$ docker images -a

# 列出所有镜像,并显示镜像的摘要信息
$ docker images --digests

# 列出所有镜像,并输出为json格式
$ docker images --format json
# 只显示镜像名称和标签
$ docker images --format "{{.Repository}}:{{.Tag}}"

# 只显示镜像ID
$ docker images -q

docker inspect : 查看镜像的详细信息

  • docker image inspect == docker inspect

  • 这里要注意,docker inspect如果基于名称查找会优先查找容器

1
2
3
4
5
6
7
8
9
10
11
# 命令格式
$ docker inspect [OPTIONS] NAME|ID [NAME|ID...]

# 显示镜像的详细信息,镜像名称
$ docker inspect nginx

# 显示镜像的详细信息,镜像ID
$ docker inspect 9f0c0d0a0f0f

# 显示镜像的Labels信息,获取json中指定的字段
$ docker image inspect --format='{{json .Config.Labels}}' nginx

docker image prune : 删除未使用的镜像

1
2
3
4
5
6
# 删除悬空镜像,(dangling images:没有 tag 的镜像,通常是构建中间产物,例如:<none>:<none> 形式。)
$ docker image prune
# 删除全部未使用镜像(未被任何一个容器引用),包括悬空镜像
$ docker image prune -a
# 不进行确认提示,直接执行
$ docker image prune -f

docker rmi : 删除镜像

  • docker image rm == docker rmi

1
2
3
4
5
6
7
8
9
10
11
12
13
# 命令格式
$ docker rmi [OPTIONS] IMAGE [IMAGE...]

# 删除镜像,镜像名称
$ docker rmi nginx
# 删除多个镜像,空格分隔
$ docker rmi nginx mysql
# 删除镜像,镜像ID
$ docker rmi 9f0c0d0a0f0f
# 强制删除镜像,当镜像被容器引用时,会报错,需要使用-f参数进行强制删除
$ docker rmi -f nginx
# 删除全部镜像
$ docker rmi $(docker images -q)

docker history : 查看镜像的历史记录

  • docker image history == docker history

1
2
3
4
5
6
7
8
9
10
# 命令格式
$ docker history [OPTIONS] IMAGE
# 查看镜像的历史记录,镜像名称
$ docker history nginx
# 查看镜像的历史记录,镜像ID
$ docker history 9f0c0d0a0f0f
# 显示完整的镜像历史记录,默认`CREATED BY`中的信息太长会被截断
$ docker history --no-trunc nginx
# 显示为json格式
$ docker history --format=json nginx

docker tag : 创建一个标签

  • docker image tag == docker tag

1
2
3
4
5
6
7
8
9
10
11
12
# 命令格式
$ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 创建一个标签
$ docker tag nginx:latest hanqunfeng/nginx:latest
# 查看镜像,可以看到两个镜像的 IMAGE ID 一致
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hanqunfeng/nginx latest be69f2940aaf 5 weeks ago 192MB
nginx latest be69f2940aaf 5 weeks ago 192MB
# 此时若通过 IMAGE ID 删除镜像,会报错,提示被多个 REPOSITORY 关联,需要使用 -f 参数进行强制删除
$ docker rmi be69f2940aaf
Error response from daemon: conflict: unable to delete be69f2940aaf (must be forced) - image is referenced in multiple repositories

docker save : 将镜像保存为 tar 归档

  • docker image save == docker save

1
2
3
4
5
6
# 命令格式
$ docker save [OPTIONS] IMAGE [IMAGE...]
# 将镜像保存为 tar 归档,-o 指定输出文件,文件名称任意,甚至都不需要以 .tar 结尾
$ docker save -o nginx.tar nginx
# 或者
$ docker save nginx > nginx.tar

docker load : 从 tar 归档中加载镜像

  • docker image load == docker load

1
2
3
4
5
6
# 命令格式
$ docker load [OPTIONS]
# 从 tar 归档中加载镜像,导出tar归档时的镜像名称就是加载后的镜像名称
$ docker load -i nginx.tar
# -q 参数表示不显示进度条
$ docker load -q -i nginx.tar

docker import : 从文件创建镜像

  • docker image import == docker import

1
2
3
4
5
6
7
8
9
10
11
12
13
# 命令格式
$ docker import [OPTIONS] FILE|URL|- [REPOSITORY[:TAG]]
## 参数说明
file 本地 tar 文件,例如 rootfs.tar
URL 网络地址(http/https)
- 从标准输入读取(比如通过管道)

# 输出镜像名称与标签
REPOSITORY[:TAG] 导入后镜像的名称与标签

# OPTIONS
--change 在导入镜像时设置 Dockerfile 指令,如 CMD、ENV、EXPOSE 等
--message, -m 添加导入说明(commit message)
  • docker importdocker load 的区别

命令 用途 格式 是否保留历史
docker import 导入文件系统,创建镜像 纯文件系统 tar 包 ❌ 不保留历史、标签等元数据
docker load 加载镜像(通常由 docker save 生成) Docker 镜像 tar(含元数据) ✅ 保留 tag、层、历史等
  • 示例: 从容器导出再导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动一个容器
$ docker run -d -p 8080:80 --name nginx nginx

# 导出容器文件系统,此时 nginx 容器中的所有文件都保存在 my_nginx.tar 文件中
$ docker export -o my_nginx.tar nginx

# 导入文件系统,导入时指定 启动命令,因为 my_nginx.tar 只是文件,并不包含任何启动命令
$ docker import --change='CMD ["nginx", "-g", "daemon off;"]' my_nginx.tar nginx:my_tag

# 查看镜像,镜像ID不一致
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx my_tag 4ab42de31bac 4 seconds ago 191MB
nginx latest be69f2940aaf 5 weeks ago 192MB

docker build : 从指定目录或URL中的 Dockerfile 构建 Docker 镜像

  • docker image build == docker build

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 命令格式
docker build [OPTIONS] PATH | URL | -
# 参数说明
PATH Dockerfile 所在的目录
URL Git 仓库的 URL
- 从标准输入读取 Dockerfile


# 构建镜像,-t: 指定镜像名称,.: 表示从当前目录查找Dockerfile,默认文件名称为 Dockerfile
docker build -t myimage:latest .
# 构建镜像,-f: 指定 Dockerfile 的相对路径,.: 表示基于当前目录,实际的 Dockerfile 路径就是 ./path/MyDockerfile
docker build -t myimage:latest -f path/MyDockerfile .
# 实际的 Dockerfile 路径就是 /usr/local/path/MyDockerfile
docker build -t myimage:latest -f path/MyDockerfile /usr/local

# 构建镜像,从 Git 仓库中构建,git 仓库的 Dockerfile 必须在根目录下
docker build https://github.com/hanqunfeng/docker_test.git -t abc:1.0.0
# 构建镜像,从 Git 仓库中构建,指定 Dockerfile 的相对路径
docker build -f docker/Dockerfile https://github.com/hanqunfeng/docker_test.git -t abc:1.0.1
# 构建镜像,从 Git 仓库中构建,指定分支或 tag
docker build -f docker/Dockerfile https://github.com/hanqunfeng/docker_test.git#release -t abc:1.0.2

docker push : 推送本地镜像到远程仓库

  • docker image push == docker push

  • 这里介绍如何将镜像推送到docker hub远程仓库

  • 需要先在docker hub网站上创建一个账号,比如我的用户名是hanqunfeng

  • 然后就可以使用下面的命令将本地镜像推送到远程仓库了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看本地镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e573c6323878 18 hours ago 191MB

# 对nginx镜像打tag,前缀必须与用户名一致
$ docker tag nginx hanqunfeng/nginx:1.0.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hanqunfeng/nginx 1.0.0 be69f2940aaf 5 weeks ago 192MB
nginx latest be69f2940aaf 5 weeks ago 192MB

# 登录 loghup
$ docker login -u hanqunfeng

i Info → A Personal Access Token (PAT) can be used instead.
To create a PAT, visit https://app.docker.com/settings


Password: # 输入密码
Login Succeeded

# 推送到docker hub,此后就可以通过 docker pull hanqunfeng/nginx:1.0.0 获取了
$ docker push hanqunfeng/nginx:1.0.0