镜像是Docker的三大组件之一。
Docker运行容器前需要本地存在对应的镜像,如果本地不存,Docker会从镜像仓库下载。
本文将介绍更多关于镜像的内容,包括:
- 从仓库获取镜像;
- 管理本地主机上的镜像;
- 介绍镜像实现的基本原理;
查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个tomcat的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索tomcat来寻找适合我们的镜像。
[root@guoweixin ~]# docker search --help
Usage: docker search [OPTIONS] TERM
Search the Docker Hub for images
Options:
-f, --filter filter Filter output based on conditions provided
根据提供的条件过滤器输出
--format string Pretty-print search using a Go template
⽤Go模板打印出漂亮的搜索结果
--limit int Max number of search results (default 25)
搜索结果的最⼤数量(默认值为25)
--no-trunc Don't truncate output
不要截断输出
docker search tomcat
docker search 某个镜像的名称 对应DockerHub仓库中的镜像。
--filter=stars=50 : 列出收藏数不小于指定值的镜像。
获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull 其命令格式为:
docker pull [选项] [Docker Registey 地址[:端口号]/] 仓库名[:标签]
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。- Docker 镜像仓库地址: 地址的格式一般是 < 域名 /IP>[: 端口号 ] 。默认地址是 Docker Hub 。- 仓库名:这里的仓库名是两段式名称, 即 < 用户名 >/< 软件名 > 。对于 Docker Hub ,如果不给出用户名,则默认为 library ,也就是官方镜像。
我们需要一个tomcat的镜像来作为我们的web服务。通过 docker pull获取镜像
docker pull tomcat:版本号 //不写 :版本号 代表laster版本
如上图所示。从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。
在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。
Docker 列出镜像
要想列出已经下载下来的镜像,可以使用 docker image ls 命令。
docker images
参数:
-a:--all,列出所有镜像
-q:--quiet,只显示镜像的id
--digests: 显示镜像的摘要信息
列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。 其中仓库名、标签在之前的基础概念已经介绍过了。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。因此,如果拥有相同的 ID,因为它们对应的是同一个镜像。
REPOSITORY 镜像的仓库源TAG 镜像的标签IMAGE ID 镜像的 IDCREATED 镜像创建时间SIZE 镜像大小
同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG 定义不同的镜像,如果你不定义镜像的标签版本,docker将默认使用 lastest 镜像!
镜像体积
如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 docker image ls 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。 另外一个需要注意的问题是,docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
虚悬镜像
镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为
这个镜像原本是有镜像名和标签的,原来为 tomcat:8.0,随着官方镜像维护,发布了新版本后,重新 docker pull tomcat:8.0 时,tomcat:8.0 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同
名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像(danglingimage) 。 一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:
docker image prune
Docker 删除本地镜像
语法:
docker image rm [选项] <镜像1> [<镜像2>.....]
用 ID 、镜像名、摘要删除镜像 其中, < 镜像 > 可以是 镜像短 ID 、镜像长 ID 、镜像名 或者 镜像摘要。
如果要删除本地的镜像,可以使用docker rmi 命令
docker rmi -f 镜像ID //常用,删除指定的镜像
docker rmi -f 镜像ID 镜像ID 镜像ID 镜像ID // 删除多个镜像
docker rmi -f $(docker images -aq) // 删除全部镜像
要删除镜像必须确认此镜像⽬前没有被任何容器使⽤
Docker保存镜像
备份本地仓库的镜像
1 ⽤ save ⼦命令将本地仓库的镜像保存当前⽬录下
docker save -o tomcat.guo.tar 镜像名称
2 将本地目录下的镜像备份文件导⼊到本地 Docker 仓库
# ⽅式⼀(不输出详细信息):
[root@localhost ~]# docker load -i tomcat.guo.tar
# ⽅式⼆(输出详细信息):
[root@localhost ~]# docker load < tomcat.guo.tar