镜像管理和使用
获取镜像
镜像是容器的基础,在运行容器之前,必须获得容器的镜像。在Docker CLI中,我们可以通过 docker pull
命令从往上下载我们需要的镜像。
# 拉取镜像
docker pull php
在获取php镜像时,没有指定镜像的命名空间,因为我们需要的 php 镜像属于 Docker 官网管理的镜像,这些镜像是没有命名空间的。同时我们没有指定镜像的标签,这个时候 Docker 会自动使用 latest 这个默认标签。通常我们更倾向于使用更确定的镜像信息,减少镜像版本带来的不确定性:
# 拉取镜像
docker pull xingfupeng/centos:v6
Docker 会利用镜像的分层机制,将镜像分为多个包进行下载,我们可以在终端输出中看到每层的下载状态。当所有的镜像层下载和解压等操作完成,它就会出现在本地的镜像仓库中,与此同时,终端屏幕上会输出镜像下载成功的提示:
当然,互联网上已经存在很多由组织或者个人提供的镜像,我们可以通过 docker search
命令在 Docker 官网提供的镜像仓库 Docker hub 中查找需要的镜像:
# 查询 php 相关的镜像
docker search php
命令显示出来搜索结果中包含了镜像的主要信息:
字段名称 | 字段解释 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 创建者提供的对镜像的简单描述 |
STARS | 镜像在官方镜像仓库中收到用户给出的星星的数量,表示镜像受欢迎的程度。 |
OFFICIAL | 镜像是否由 Docker 官方提供。我们更倾向于使用官方提供的镜像,因为它们更稳定。 |
AUTOMATED | 镜像是否使用了自动构建 |
通过 docker search
和 docker pull
命令可以很轻松地从网上下载所需要的镜像,当然,对于已经可以使用互联网获取到的镜像,图鉴直接下载使用。
列出镜像
# 镜像列表
docker images
命令所返回的镜像列表中主要包含了以下 5 个字段:
字段名称 | 字段解释 |
---|---|
REPOSITORY | 镜像的名称,如果镜像名称中含有 Namespace,这里也会一并显示。在某些场合下,镜像的名称会显示为<none>,比如创建时没有指定名称的时候,或者新建镜像时使用了和之前相同名称的时候。 |
TAG | 镜像的标签 |
IMAGE ID | 镜像的ID。镜像的ID是更精确地识别镜像的属性,它由SHA256散列算法生成,表示为一个长度为64位的十六进制字符串。为了节省页面,这里只显示了镜像ID的前部分,不过这也足以说明问题。 |
CREATED | 镜像的创建时间 |
SIZE | 镜像所占用的硬盘空间,包括被共享的镜像层大小。 |
当本地镜像较多时,我们还可以通过通配符过滤出符合条件的镜像:
# 根据通配符查看 ph相关镜像
docker images "ph*"
获得镜像的详细信息
我们可以根据 docker inspect
命令获取镜像更详细的信息:
docker inspect nginx
信息太多,截取了 4 张图片展示。
docker inspect
命令可以获得镜像的详细信息,也可以接受镜像的名称、镜像的ID等唯一的信息:
docker inspect c82521676580 # nginx 镜像的 IMAGE ID
Docker 允许在命令中只给出部分ID,这里我们只使用了镜像ID的前12位,不过这足以识别镜像在本地的唯一性了,也可以得出我们想要的结果。当然,我们还可以只提供镜像ID的前8位、前5位,甚至前2位,只要我们能够保证给出的前缀可以在本地找到唯一对应的镜像即可。
使用docker inspect 命令会议 json 格式返回镜像的很多信息,如果只想得到某部分信息,可以使用输出格式进行过滤:
docker inspect -f {{".Size"}} c82521676580
第三幅图中的 size 信息。
删除镜像
如果需要删除本地的镜像,可以使用 docker rmi
命令进行删除:
# 查询一下本地镜像
docker images xingfupeng/centos
# 删除本地镜像
docker rmi xingfupeng/centos:v6
如果一个镜像中含有某些其他镜像共享的镜像层,这些镜像层仍然会保留下来,只有未被其他镜像层使用的层会被删除。
同样我们可以指定镜像ID来删除镜像:
docker rmi a1b0aa83a826
镜像要是被容器使用的,如果我们删除镜像时正有容器使用它,那它将无法被删除。我们可以携带 -f
参数的 docker rmi 命令强制删除镜像:
docker rmi -f a1b0aa83a826
注意
不过不推荐使用这种方法,因为这会带来一些难以处理的遗留问题,所以最好还是先关闭或清理掉使用镜像的容器再删除镜像。
迁移镜像
虚拟化部署的高效率,主要是镜像无缝迁移的功劳,也就是说,镜像的导入/导出是虚拟化过程中最基础的操作,Docker 也提供了镜像导出和载入本地镜像库的方法。
使用 docker save
命令可将本地镜像库中的镜像导出:
# 导出 php 镜像
docker save -o php.tar php:latest
我们看到了当前目录下有一个 php-migrate.tar 的镜像导出的迁移文件。
默认情况下,docker save 命令是把镜像写出到输出流中,可以通过 -o 或 --output 参数将导出的镜像数据写入到指定的文件,也可以使用 > 写出到指定文件:
# 导出 php 镜像
docker save php:latest > php.tar
另外, docker save 命令支持同时导出多个镜像,只要将镜像逐个传入即可:
docker save -o php-nginx.tar php:latest nginx:latest
通过迁移文件的大小我们能看出迁移文件中的镜像内容是有区别的。
要将导出的镜像数据重新导入到本地的镜像仓库中,可以使用 docker load 命令:
先将本地的 php 镜像删除:
# 导入镜像
docker load -i php.tar
导入成功后,再查看一下镜像列表 php 镜像已恢复。
默认情况下,docker load 命令从输入流中读取数据,可以通过 -i 或 --input 参数将指定的文件传入镜像数据,也可以通过 < 来完成:
# 导入镜像
docker load < php.tar