Docker 镜像管理

镜像是容器运行的「只读模板」,由一层层文件系统叠加而成。日常开发中查看、拉取、打标签、删除镜像是最高频的操作,本章把镜像管理命令一次讲清。

查看本机镜像

docker images 列出本地已有镜像,包括仓库名、标签、镜像 ID、大小:

docker images
# 输出:REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
#       nginx        latest    66a83e77d785   2 weeks ago    187MB

镜像 ID 实际是完整 ID 的前 12 位,后续命令里可以只写前几位。加 -f 可过滤,例如只看悬空镜像:

docker images -f dangling=true   # 列出没有标签、没有被引用的悬空镜像

搜索与拉取镜像

docker search 在仓库里搜索镜像,docker pull 按「仓库名:标签」拉取,不写标签时默认 latest:

docker search nginx     # 搜索镜像,OFFICIAL 列为 [OK] 的是官方镜像
docker pull nginx:alpine
# 输出:alpine: Pulling from library/nginx ... Status: Downloaded newer image

国内公共仓库:除 Docker Hub 外,各云厂商也提供公共镜像仓库。把仓库域名作为镜像名前缀即可,形如 docker pull <仓库域名>/<命名空间>/<镜像名>:<标签>。

打标签 docker tag

tag 相当于给镜像复制一个「别名」,常用于改仓库名与版本号,便于后续推送:

docker tag nginx:alpine myhub.example.com/web/nginx:v1   # 新标签:仓库路径:版本
docker images | grep nginx   # 可见两个条目指向同一个 IMAGE ID

删除镜像 docker rmi

rmi 删除镜像;镜像正被容器使用时删不掉,需先删除相关容器:

docker rmi nginx:alpine      # 按 仓库:标签 删除
# 输出:Untagged: nginx:alpine
docker rmi 66a83e77d785      # 也可直接写镜像 ID
docker image prune           # 批量清理所有悬空镜像
# 输出:Deleted Images: ...

镜像分层与写时复制

镜像分层与可写容器层 镜像是多层只读层的叠加,每一层对应 Dockerfile 里的一条指令产生的差异;容器运行时再在最上层加一层「可写层」,容器内写文件只发生在可写层,这就是写时复制(Copy-on-Write)。因此多个容器共享同一基础层非常省空间。

docker history 查看分层

history 能查看镜像由哪些层构成、每层多大,排查「镜像为什么这么大」时常用:

docker history nginx:alpine
# 输出:IMAGE        CREATED       CREATED BY                            SIZE
#       ...         2 weeks ago   /bin/sh -c #(nop)  CMD ["nginx"...]    0B

小结

镜像管理四件事:images 查看、pull 拉取、tag 打标签、rmi 删除,悬空镜像用 image prune 批量清理;理解分层与写时复制之后,就能解释镜像为什么「小且省空间」,也为后面写 Dockerfile 打基础。

笔记加载中…