如何使用 docker image pull 命令下载镜像

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用 docker pull 命令从镜像仓库(registry)下载 Docker 镜像。你将探索不同的镜像拉取方法,包括从 Docker Hub 按标签(tag)拉取特定镜像、使用不可变的摘要(digest)拉取镜像以确保版本控制、从仓库拉取所有带标签的镜像,以及从 Docker Hub 以外的镜像仓库拉取镜像。

通过完成这些步骤,你将获得获取 Docker 镜像的实践经验,这是构建和运行容器化应用程序的一项基本技能。你将学习如何指定镜像版本和来源,确保能够可靠地获取项目所需的镜像。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/pull -.-> lab-555159{{"如何使用 docker image pull 命令下载镜像"}} docker/images -.-> lab-555159{{"如何使用 docker image pull 命令下载镜像"}} end

从 Docker Hub 按标签拉取特定镜像

在这一步中,你将学习如何从 Docker Hub 按标签拉取特定的 Docker 镜像。Docker Hub 是一个公共镜像仓库(registry),托管着许多官方和社区贡献的 Docker 镜像。拉取镜像意味着将其从镜像仓库下载到你的本地机器。

拉取镜像的基本命令是 docker pull <镜像名称>:<标签>。如果你不指定标签,Docker 默认会拉取 latest 标签的镜像。不过,为了确保获取特定版本的镜像,最好指定标签。

让我们拉取带有 latest 标签的 hello-world 镜像。这是一个非常小的镜像,用于测试你的 Docker 安装是否正常工作。

docker pull hello-world:latest

你应该会看到表明 Docker 正在下载镜像层的输出。

Using default tag: latest
latest: Pulling from library/hello-world
Digest: sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

现在,让我们拉取带有特定标签(例如 20.04)的 ubuntu 镜像。这将下载 Ubuntu 20.04 LTS 镜像。

docker pull ubuntu:20.04

你会看到类似的显示下载进度的输出。

20.04: Pulling from library/ubuntu
... (download progress) ...
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04

要查看你已拉取的镜像,可以使用 docker images 命令。

docker images

此命令会列出存储在你本地机器上的所有镜像,包括它们的仓库、标签、镜像 ID、创建时间和大小。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        20.04     ...            ...            ...
hello-world   latest    ...            ...            ...

你已成功从 Docker Hub 按标签拉取特定镜像。

按不可变的摘要拉取镜像

在这一步中,你将学习如何使用不可变的摘要(digest)拉取 Docker 镜像。虽然标签(tag)使用起来很方便,但它们可以被更新以指向不同的镜像版本。而摘要则是特定镜像层配置及其历史记录的唯一标识符。这是一种更可靠的方法,能确保你每次拉取的都是完全相同的镜像。

按摘要拉取镜像的格式是 docker pull <镜像名称>@<摘要>

首先,让我们找出我们已经拥有的一个镜像的摘要。我们可以使用 docker images --digests 命令来显示本地镜像的摘要。

docker images --digests

你应该会看到类似下面的输出,其中包含 DIGEST 列:

REPOSITORY    TAG       DIGEST                                                                      IMAGE ID       CREATED        SIZE
ubuntu        20.04     sha256:...   ...            ...
hello-world   latest    sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc   ...            ...            ...

让我们使用 hello-world 镜像的摘要。复制完整的摘要字符串(以 sha256: 开头)。

现在,让我们再次尝试拉取 hello-world 镜像,但这次使用它的摘要。将 <摘要> 替换为你复制的实际摘要。

docker pull hello-world@sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc

由于你可能已经拥有这个镜像层,Docker 会报告该镜像已是最新版本。

sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc: Pulling from library/hello-world
Digest: sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc
Status: Downloaded newer image for hello-world@sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc
docker.io/library/hello-world@sha256:f52335ce493f8f15cfcf46725b2909db9087b688aedabbbd2a167ae30b6da6fc

在生产环境或自动化脚本中,当你需要确保部署的是特定的、不变的镜像版本时,按摘要拉取镜像特别有用。

你可以再次使用 docker images --digests 命令来验证镜像。你会看到 hello-world 镜像被列出,如果之前你按标签拉取过,可能会同时显示标签和摘要。

docker images --digests

从仓库拉取所有带标签的镜像

在这一步中,你将学习如何从 Docker Hub 上的特定仓库拉取所有带标签的镜像。当你想下载某个镜像的多个版本用于测试或其他目的时,这会很有用。

要从仓库拉取所有带标签的镜像,你可以使用 docker pull -a <镜像名称> 命令。-a 标志代表“all-tags”(所有标签)。

让我们尝试拉取 alpine 仓库的所有带标签的镜像。Alpine 是一种轻量级的 Linux 发行版,常用于容器中。

docker pull -a alpine

此命令将启动对 alpine 仓库中所有带标签镜像的下载。你会看到显示各种标签(如 latest3.143.15 等)下载情况的输出。

Using default tag: latest
latest: Pulling from library/alpine
... (download progress for various tags) ...
Status: Downloaded newer image for alpine:latest
Status: Downloaded newer image for alpine:3.14
Status: Downloaded newer image for alpine:3.15
...
docker.io/library/alpine:latest
docker.io/library/alpine:3.14
docker.io/library/alpine:3.15
...

根据仓库中标签的数量,此命令可能需要一些时间才能完成。

命令完成后,你可以使用 docker images 命令查看你已拉取的所有 alpine 镜像。

docker images | grep alpine

你会看到一个带有不同标签的 alpine 镜像列表。

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
alpine        latest    ...            ...            ...
alpine        3.14      ...            ...            ...
alpine        3.15      ...            ...            ...
...

这种方法对于从单个仓库下载某个镜像的多个版本很有效。

从其他镜像仓库拉取镜像

在这一步中,你将学习如何从 Docker Hub 以外的镜像仓库拉取 Docker 镜像。虽然 Docker Hub 是默认的镜像仓库,但你可能需要从私有镜像仓库、云服务提供商的镜像仓库(如 Google Container Registry、Amazon Elastic Container Registry)或其他公共镜像仓库拉取镜像。

要从其他镜像仓库拉取镜像,你需要在镜像名称前指定镜像仓库的主机名。格式通常为 <镜像仓库主机名>/<镜像名称>:<标签><镜像仓库主机名>/<用户或组织>/<镜像名称>:<标签>

在这个示例中,我们将从 Google Container Registry (GCR) 拉取一个镜像。我们将从 google-samples 项目中拉取 hello-app 镜像。GCR 的镜像仓库主机名是 gcr.io

docker pull gcr.io/google-samples/hello-app:1.0

这个命令告诉 Docker 从位于 gcr.io 的镜像仓库中的 google-samples 项目里拉取标签为 1.0hello-app 镜像。

你会看到显示从指定镜像仓库下载过程的输出。

1.0: Pulling from google-samples/hello-app
... (download progress) ...
Status: Downloaded newer image for gcr.io/google-samples/hello-app:1.0
gcr.io/google-samples/hello-app:1.0

拉取完成后,你可以使用 docker images 命令列出本地镜像,查看刚刚从 GCR 拉取的镜像。

docker images

你应该会在镜像列表中看到 gcr.io/google-samples/hello-app

REPOSITORY                         TAG       IMAGE ID       CREATED        SIZE
gcr.io/google-samples/hello-app    1.0       ...            ...            ...
ubuntu                             20.04     ...            ...            ...
hello-world                        latest    ...            ...            ...
alpine                             latest    ...            ...            ...
alpine                             3.14      ...            ...            ...
alpine                             3.15      ...            ...            ...
...

这展示了如何通过指定镜像仓库主机名从非默认的 Docker Hub 镜像仓库拉取镜像。

总结

在本次实验中,你学习了如何使用 docker pull 命令从镜像仓库下载 Docker 镜像。你首先通过标签从 Docker Hub 拉取特定的镜像,了解到指定标签对于获取特定版本的镜像至关重要。你还学习了如何使用 docker images 命令查看本地已下载的镜像。

本次实验还展示了如何使用镜像的不可变摘要(immutable digest)来拉取镜像,确保无论标签如何变化,你都能获取到完全相同版本的镜像。你还探索了从仓库拉取所有带标签的镜像,以及从 Docker Hub 以外的镜像仓库拉取镜像,这拓展了你从各种来源获取镜像的能力。