如何使用 docker login 命令对镜像仓库进行身份验证

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 docker login 命令对 Docker 镜像仓库进行身份验证。我们将介绍使用标准的基于 Web 的登录方式对 Docker Hub 进行身份验证,使用用户名和密码对自托管的镜像仓库进行身份验证,以及在非交互式场景下通过标准输入 (STDIN) 提供密码。通过这个实践经验,你将掌握在各种 Docker 镜像仓库环境中安全访问和管理镜像的必要技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/login("Log into Docker Registry") subgraph Lab Skills docker/pull -.-> lab-555166{{"如何使用 docker login 命令对镜像仓库进行身份验证"}} docker/login -.-> lab-555166{{"如何使用 docker login 命令对镜像仓库进行身份验证"}} end

使用基于 Web 的登录方式对 Docker Hub 进行身份验证

在这一步中,你将学习如何使用基于 Web 的登录方式对 Docker Hub 进行身份验证。这是登录 Docker Hub 最常用的方法,适用于交互式会话。

Docker Hub 是 Docker 提供的基于云的镜像仓库服务,允许你存储和共享 Docker 镜像。要推送或拉取私有镜像,你需要对 Docker Hub 进行身份验证。

docker login 命令用于对 Docker 镜像仓库进行身份验证。默认情况下,它会对 Docker Hub 进行身份验证。

在 LabEx 环境中打开你的终端。你当前位于 ~/project 目录。

要登录 Docker Hub,请运行以下命令:

docker login

当你运行此命令时,系统会提示你输入 Docker Hub 用户名和密码。

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
Username: your_docker_username
Password: your_docker_password

在提示时输入你的 Docker Hub 用户名和密码。如果身份验证成功,你将看到类似以下的消息:

WARNING! Your password will be stored unencrypted in /home/labex/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-helpers

Login Succeeded

此消息表明你已成功登录 Docker Hub。在这种情况下,关于密码未加密的警告是正常的,在本实验中可以忽略。

现在你已登录,你可以从 Docker Hub 拉取私有镜像,或将自己的镜像推送到你的仓库。

让我们尝试拉取一个公共镜像,以确认登录后 Docker 命令可以正常工作。我们将拉取 hello-world 镜像,这是一个用于测试的小镜像。

docker pull hello-world

你应该会看到表明正在拉取和提取镜像的输出:

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

这证实了你在进行身份验证后可以与 Docker Hub 进行交互。

使用用户名和密码对自托管的镜像仓库进行身份验证

在这一步中,你将学习如何使用用户名和密码对自托管的 Docker 镜像仓库进行身份验证。虽然 Docker Hub 是默认的镜像仓库,但你可能需要与组织内部或云服务提供商上托管的私有镜像仓库进行交互。

自托管的镜像仓库是你自己设置和管理的 Docker 镜像仓库,而不是使用像 Docker Hub 这样的公共服务。出于安全、合规性或性能方面的考虑,通常会采用这种方式。

要对自托管的镜像仓库进行身份验证,你可以使用相同的 docker login 命令,但需要指定镜像仓库的地址。格式为 docker login <registry_address>

在本实验中,我们将模拟一个自托管的镜像仓库。我们将使用占位地址 myregistry.local。在实际场景中,这将是你镜像仓库的实际域名或 IP 地址。

~/project 目录中打开你的终端。

要登录我们模拟的自托管镜像仓库,请运行以下命令,将 your_registry_usernameyour_registry_password 替换为你用于该镜像仓库的假设凭证:

docker login myregistry.local

系统会提示你输入镜像仓库 myregistry.local 的用户名和密码:

Login with your Docker ID to push and pull images from myregistry.local. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
Username: your_registry_username
Password: your_registry_password

输入假设的用户名和密码。由于 myregistry.local 在这个环境中不是一个实际运行的镜像仓库,登录可能会失败,并显示一条错误消息,表明无法访问该镜像仓库或身份验证失败。这在这个模拟中是预期的结果。重要的是要理解命令语法以及指定不同镜像仓库的过程。

Error response from daemon: Get "http://myregistry.local/v2/": dial tcp: lookup myregistry.local on 127.0.0.53:53: no such host

尽管由于镜像仓库不存在而导致登录失败,但 docker login <registry_address> 这个命令语法对于尝试对自托管的镜像仓库进行身份验证是正确的。

在实际运行的自托管镜像仓库场景中,成功登录会显示“Login Succeeded”消息,并且你针对该特定镜像仓库的凭证将存储在你的 Docker 配置文件 (~/.docker/config.json) 中。

让我们查看 Docker 配置文件,了解镜像仓库信息是如何存储的。

cat ~/.docker/config.json

你将看到一个 JSON 结构。在上一步成功登录 Docker Hub 后,你应该会看到一个 https://index.docker.io/v1/ 的条目。如果你成功登录了 myregistry.local,你会看到该镜像仓库地址的额外条目。

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "..."
    }
  },
  "HttpHeaders": {
    "User-Agent": "Docker-Client/..."
  },
  "credsStore": "desktop"
}

auths 部分包含了你已登录的不同镜像仓库的身份验证信息。auths 中的每个键都是镜像仓库地址,其值包含身份验证详细信息。

这一步演示了在使用 docker login 时如何指定自托管镜像仓库的地址。

使用标准输入 (STDIN) 提供密码以进行非交互式登录

在这一步中,你将学习如何使用标准输入 (STDIN) 提供 Docker 镜像仓库的密码。这种方法在非交互式场景中特别有用,例如脚本编写或自动化部署,在这些场景中,当系统提示输入密码时,你无法手动输入。

当你在交互式终端中使用 docker login 时,系统会提示你输入密码。然而,在脚本中,你需要一种无需手动干预就能传递密码的方法。--password-stdin 标志允许你从 STDIN 读取密码。

重要安全提示:直接在命令行上传递密码通常是不安全的,因为命令及其参数可能会在进程列表 (ps) 或 shell 历史记录中可见。从 STDIN 读取密码是一种更安全的脚本编写方法,因为它避免了密码在这些地方暴露。

~/project 目录中打开你的终端。

为了演示这一点,我们将模拟使用 STDIN 登录 Docker Hub。你需要提供你的 Docker Hub 用户名和密码。

命令结构是将密码通过 echo 输出并通过管道传递给 docker login --username <your_docker_username> --password-stdin

your_docker_username 替换为你实际的 Docker Hub 用户名,将 your_docker_password 替换为你实际的 Docker Hub 密码。

echo "your_docker_password" | docker login --username your_docker_username --password-stdin

运行此命令后,你应该会看到类似以下的输出,表明登录成功:

WARNING! Your password will be stored unencrypted in /home/labex/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-helpers

Login Succeeded

同样,在本实验环境中,关于密码未加密的警告是正常的。

这种方法对于自动化需要身份验证的 Docker 操作至关重要。例如,在 CI/CD 管道中,你可以将 Docker Hub 凭证存储为环境变量,并在构建和推送镜像之前使用此方法进行登录。

你还可以通过在命令末尾添加镜像仓库地址,使用此方法登录自托管的镜像仓库:

echo "your_registry_password" | docker login myregistry.local --username your_registry_username --password-stdin

和上一步一样,此命令在本实验中可能会失败,因为 myregistry.local 不是一个正在运行的镜像仓库。但是,通过 STDIN 为特定镜像仓库提供密码的语法是正确的。

这一步向你展示了如何通过使用 --password-stdin 标志将密码通过管道传递给 docker login 命令,来实现对 Docker 镜像仓库的非交互式登录。

总结

在本实验中,你学习了如何使用 docker login 命令对 Docker 镜像仓库进行身份验证。你首先练习了使用标准的基于 Web 的交互式登录方法登录 Docker Hub,在系统提示时提供用户名和密码。这展示了登录默认 Docker 镜像仓库的基本过程。

接着,你探索了通过指定镜像仓库 URL 以及用户名和密码来对自托管的镜像仓库进行身份验证。最后,你学习了如何使用标准输入 (STDIN) 提供密码,这是一种在非交互式场景和脚本编写中更安全的方法,可以防止密码在命令历史记录或日志中暴露。这些步骤涵盖了确保访问 Docker 镜像仓库以推送和拉取镜像的不同方法。