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 打基础。