Docker 的镜像存储中心通常被称为 Registry。

当您需要获取 Docker 镜像时,首先需要登录 Registry,然后拉取镜像。在您修改过镜像之后,您可以再次将镜像推送到 Registry 中去。

基本概念

Docker的镜像地址是什么?我们来看一个完整的例子。以容器服务的公共镜像为例,registry.cn-hangzhou.aliyuncs.com/acs/agent:0.8

  • registry.cn-hangzhou.aliyuncs.com:Registry 域名。
  • acs:命名空间。
  • agent:仓库名称。
  • 0.8:Tag、镜像标签(非必须,默认为 latest)。

将这个几个完全独立的概念组合一下:

  • registry.cn-hangzhou.aliyuncs.com/acs/agent:仓库坐标。
  • acs/agent:仓库全名(通常在 API 中使用)。

基本使用

本文档的重点是介绍 Docker 最常用的三个命令:login、pull、push。

docker login

以阿里云杭州公网 Registry 为例。

登录时必须指明 Registry 域名,并输入您的用户名和登录密码。

Note
此处的登录密码是您在 镜像仓库管理控制台 设置的,而不是您的阿里云登录密码。


docker@default-online:~$ docker login registry.cn-hangzhou.aliyuncs.com
Username: sample@alibaba-inc.com
Password:
Login Succeeded

登录成功之后会显示 Login Succeeded

另外,您还可以通过查看 config.json 文件,确认您的登录信息。

docker@default-online:~$ cat ~/.docker/config.json
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com": {
            "auth": "XXXXXXXXXXXXXXXXXXXXXX"
        }
    }
}

docker pull

Note
  • 如果您要拉取 Docker 官方的镜像,参考下方相关链接中的加速器文档。
  • 如果您要拉取公共仓库下的镜像,不登录 Registry 也是可以拉取的。

以容器服务的公共镜像 registry.cn-hangzhou.aliyuncs.com/acs/agent:0.8 为例。

docker@default-online:~$ docker pull registry.cn-hangzhou.aliyuncs.com/acs/agent:0.8
0.8: Pulling from acs/agent
5a026b6c4964: Already exists
e4b621e8d9cb: Already exists
8bc2fd04bdd4: Pull complete
a977b0087b3e: Pull complete
8f6e00ea13c6: Pull complete
875dd8c9666f: Pull complete
9c07bcabc35d: Pull complete
Digest: sha256:cac848bd31bccf2a041bda7b57e3051341093abde6859df9ee9d332dfec6ddd9
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/acs/agent:0.8

您可以使用下边的命令查看下载下来的镜像(注意仓库坐标和 Tag)。

docker@default-online:~$ docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/acs/agent   0.8                 b9ba5841bdb0        24 hours ago        42.18 MB

docker push

镜像在本地环境构建或是打包好之后,就可以推到 Registry。

前提条件是,您有对这个仓库的读写权限或是读写授权。否则您会看到下面的报错信息。

docker@default-online:~$ docker push registry.cn-hangzhou.aliyuncs.com/acs/agent:0.8
The push refers to a repository [registry.cn-hangzhou.aliyuncs.com/acs/agent]
359f80267111: Layer already exists
7e5fa28d90b8: Layer already exists
b20d7f600f63: Layer already exists
4a159b4f8370: Layer already exists
7c3712ebe877: Layer already exists
d91d130a53aa: Layer already exists
fcad8ad5a40f: Layer already exists
unauthorized: authentication required

FAQ

docker login 失败

主要需要排查以下两种可能。

  • 您使用了阿里云账户的登录密码,而不是 Registry 的独立登录密码。Registry 的登录密码是在 镜像仓库管理控制台 上设置与修改的。


  • 您使用了 sudo 进行登录。使用 sudo 时,系统第一个要求输入的密码是 Linux 的用户密码。您可能在这里输入了 Registry 的登录密码,导致登录操作失败。

    区分这个错误的方式很简单,Linux 的用户密码大多允许尝试三次,错误时会提示 try again。而 Registry 的登录密码错误一次之后就会退出,并返回以下错误。

    Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: unauthorized: authentication required

docker pull 失败,提示 Error: image xxx not found

主要的排查步骤。

  • 如果您下载的是公共仓库,那么问题应该为镜像地址不正确。请在 镜像仓库管理控制台 搜索一下这个公共仓库,检查一下想要下载的这个镜像版本是不是真实存在。
  • 您想要下载一个私有仓库中的镜像,这时首先确认一下 Registry 的登录状态。运行下边的命令,可以看到所有登录的 Registry 域名。
    cat ~/.docker/config.json

    查看里面是不是包括您想要下载镜像的 Registry 域名。如果没有的话,您需要先进行登录操作。

    如果显示已经登录的话,那么您需要确认您登录的这个账户是否有权限下载这个镜像。子账户默认没有任何权限,参见下方相关链接中主子账户授权的文档。

docker push 失败

主要的排查步骤和 docker pull 基本一致,仅仅是授权要求的级别较 pull 更高一些。