摘要

在 Docker 生态系统中,镜像是一个核心概念,它是容器运行的基础。本实验将帮助你理解 Docker 镜像的基本操作,包括下载、改名、查看信息、搜索和删除镜像,以及验证镜像的分层结构。

知识准备

镜像和容器的关系

镜像运行起来是容器,就像软件运行起来是进程。

镜像名的格式

一个完整的镜像名包括:注册中心/仓库名:标签

  • 其中注册中心和标签都可以省略
    • 默认的注册中心是 docker.io
    • 默认的标题是 latest
  • 仓库名不可省略,有两种写法:
    • 用户名/软件名 用户名也可以叫项目名(Harbor)、命名空间(阿里)等
    • 软件名

镜像参数
镜像参数

任务一:拉取和查看

Docker 镜像存储在 Docker Hub 或其他镜像仓库中。我们可以使用 docker pull 命令从这些仓库中下载镜像到本地。

docker pull ubuntu:14.04

这个命令会从 Docker Hub 下载标签为 14.04 的 Ubuntu 镜像。其中 ubuntu 是镜像名称,14.04是标签(通常表示版本)。

成功下载后,你将看到类似下图的输出:

Docker 会分层下载镜像,每一行代表一个镜像层。当所有层都下载完成后,Docker 会将这些层组合成一个完整的镜像。

下载失败怎么办?

Docker Hub 的网站在国外,从国内访问经常出现问题,可以选择从其他镜像仓库获取:

docker pull harbor.seahi.me/docker/ubuntu:14.04 

下载完成后,使用命令 docker images 进行查看

任务二:镜像改名

先准备几个镜像用来做练习:

  1. harbor.seahi.me/docker/ubuntu:latest
  2. harbor.seahi.me/docker/httpd:latest

可以使用 docker tag 命令为镜像改名,包括注册中心、仓库名、标签。

1.查看刚才下载镜像的ID

docker images

此命令列出本地所有镜像,包括它们的仓库名、标签、ID、创建时间和大小。

镜像列表
镜像列表

2.为镜像改标签

docker tag 13b66b487594 ubuntu:14.04a

这个命令将 ID 为 13b66b487594 的镜像改名为 ubuntu:14.04a。

“新”镜像
“新”镜像

注意:修改镜像名称不会创建新的镜像,只是为同一个镜像创建了一个新的引用。你可以看到两个镜像的 ID 是相同的,这表明它们指向同一个镜像。

3.改仓库名

docker tag 13b66b487594 ubuntua:14.04a

这个命令不仅修改了标签,还修改了仓库名为 ubuntua。

查看效果:

“新”镜像
“新”镜像

4.增加命名空间(等同于用户名、项目名)

docker tag 13b66b487594 docker/ubuntu:14.04

这个命令为镜像添加了 docker 命名空间,镜像名称变为 docker/ubuntu:14.04。

查看效果:

“新”镜像
“新”镜像

5.增加注册中心

如果你想将镜像推送到私有仓库,需要在镜像名称前加上注册服务器的地址。

docker tag 13b66b487594 harbor.seahi.me/docker/ubuntu:14.04

这个命令指定了注册中心为 harbor.seahi.me。

镜像列表
镜像列表

任务三:删除镜像

使用命令 docker rmi 镜像ID或名称 可以对镜像进行删除操作

练习

练习一:发布稳定版

我们的项目需要一个稳定的基础镜像,希望为 ubuntu:latest 打上一个新的标签 ubuntu:stable,以表示这是我们的稳定版本。

请执行以下操作:

  1. 使用 docker tag 命令为 ubuntu:latest 创建名为 ubuntu:stable 的新标签。
  2. 使用 docker images 命令查看结果,并观察新标签的 IMAGE ID 是否与 ubuntu:latest 完全相同。

练习二:发布新版本

假设 helloworld:latest 是我们开发的应用程序镜像。现在版本 1.0 开发完毕,需要为其创建一个带版本号的标签 helloworld:v1.0。

请执行以下操作:

  1. 使用 docker tag 命令,基于 helloworld:latest 创建 helloworld:v1.0 标签。
  2. 再次使用 docker tag 命令,将 helloworld:v1.0 重新标记为 helloworld:prod(模拟上线生产环境)。
  3. 最后,使用 docker images 列出所有 helloworld 相关的镜像,查看现在有几个标签。
关于第3题的小技巧

试试 docker images helloworld 命令,观察结果有什么特点?

练习三:添加仓库路径(为推送做准备)

现在需要将旧的 ubuntu:14.04 镜像推送至公司的私有仓库 my-registry.com:5000 的 base/ubuntu 仓库中。

推送是什么意思

推送和拉取刚好相反,拉取pull是将镜像从网上下载到本地;推送push是将镜像从本地上传到网上。思考:推送到网络上的哪个位置?或者说,哪个注册中心(网站)?

请执行以下操作:

  1. 使用 docker tag 命令,为 ubuntu:14.04 创建一个符合私有仓库规范的新标签 my-registry.com:5000/base/ubuntu:14.04。

问题: 为什么在推送镜像到仓库之前,必须使用 docker tag 为其添加完整的仓库地址