Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

私有注册表身份验证

Amazon ECS 容器代理可使用基本身份验证对私有注册表(包括 Docker Hub)进行身份验证。当启用私有注册表身份验证时,您可以在任务定义中使用私有 Docker 镜像。

当启动时,该代理将查找两个环境变量:ECS_ENGINE_AUTH_TYPE(指定要发送的身份验证数据的类型)和 ECS_ENGINE_AUTH_DATA(包含实际身份验证凭证)。

当容器实例启动时以及每次启动容器服务 (利用 sudo start ecs 命令) 时,针对 Amazon ECS 优化过的 AMI 将在 /etc/ecs/ecs.config 文件中扫描这些变量。未针对 Amazon ECS 优化过的 AMI 应将这些环境变量存储在一个文件中,然后利用 --env-file path_to_env_file 选项将其传递到用于启动容器代理的 docker run 命令。

重要

我们不建议您在实例启动时利用 Amazon EC2 用户数据注入这些身份验证环境变量或利用 --env 选项将其传递到 docker run 命令。这些方法不适合敏感数据,例如身份验证凭证。要将身份验证凭证安全地添加到容器实例,请参阅将容器实例配置存储在 Amazon S3 中

身份验证格式

私有注册表身份验证有两种可用格式:dockercfgdocker

dockercfg 身份验证格式

dockercfg 格式使用存储在您在运行 docker login 命令时创建的配置文件中的身份验证信息。您可以通过在本地系统上运行 docker login (或通过登录到容器实例并在其中运行命令) 并输入注册表用户名、密码和电子邮件地址来创建此文件。根据您的 Docker 版本的不同,此文件将以 ~/.dockercfg~/.docker/config.json 的形式保存。

Copy
$ cat ~/.docker/config.json

输出:

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "zq212MzEXAMPLE7o6T25Dk0i"
    }
  }
}

重要

较新版本的 Docker 可使用外部 auths 对象创建上面所示的配置文件。Amazon ECS 代理仅支持以下格式的 dockercfg 身份验证数据,无需 auths 对象。如果您已安装 jq 实用程序,则可以使用以下命令提取此数据:cat ~/.docker/config.json | jq .auths

Copy
$ cat ~/.docker/config.json

输出:

{
  "https://index.docker.io/v1/": {
    "auth": "zq212MzEXAMPLE7o6T25Dk0i",
    "email": "email@example.com"
  }
}

在上面的示例中,以下环境变量应添加到 Amazon ECS 容器代理在运行时加载的环境变量文件中 (对于针对 Amazon ECS 优化过的 AMI,该文件为 /etc/ecs/ecs.config)。如果您未使用针对 Amazon ECS 优化过的 AMI 并且正在利用 docker run 手动启动代理,请在启动代理时利用 --env-file path_to_env_file 选项指定环境变量文件。

Copy
ECS_ENGINE_AUTH_TYPE=dockercfg ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example.com"}}

您也可以使用以下语法配置多个私有注册表。

Copy
ECS_ENGINE_AUTH_TYPE=dockercfg ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"email@example-01.com"},"repo.example-02.com":{"auth":"fQ172MzEXAMPLEoF7225DU0j","email":"email@example-02.com"}}

docker 身份验证格式

docker 格式使用注册表服务器(代理应向其进行身份验证)的 JSON 表示形式以及注册表需要的身份验证参数(如该账户的用户名、密码和电子邮件地址)。对于 Docker Hub 账户,JSON 表示形式如下所示:

Copy
{ "https://index.docker.io/v1/": { "username": "my_name", "password": "my_password", "email": "email@example.com" } }

在该示例中,以下环境变量应添加到 Amazon ECS 容器代理在运行时加载的环境变量文件中 (对于针对 Amazon ECS 优化过的 AMI,该文件为 /etc/ecs/ecs.config)。如果您未使用针对 Amazon ECS 优化过的 AMI 并且正在利用 docker run 手动启动代理,请在启动代理时利用 --env-file path_to_env_file 选项指定环境变量文件。

Copy
ECS_ENGINE_AUTH_TYPE=docker ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}

您也可以使用以下语法配置多个私有注册表。

Copy
ECS_ENGINE_AUTH_TYPE=docker ECS_ENGINE_AUTH_DATA={"repo.example-01.com":{"username":"my_name","password":"my_password","email":"email@example-01.com"},"repo.example-02.com":{"username":"another_name","password":"another_password","email":"email@example-02.com"}}

启用私有注册表

使用以下过程可为容器实例启用私有注册表。

在针对 Amazon ECS 优化过的 AMI 中启用私有注册表

  1. 通过 SSH 登录到容器实例。

  2. 打开 /etc/ecs/ecs.config 文件并为注册表和账户添加 ECS_ENGINE_AUTH_TYPEECS_ENGINE_AUTH_DATA 值。

    Copy
    [ec2-user ~]$ sudo vi /etc/ecs/ecs.config

    此示例将对 Docker Hub 用户账户进行身份验证。

    Copy
    ECS_ENGINE_AUTH_TYPE=docker ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"username":"my_name","password":"my_password","email":"email@example.com"}}
  3. 检查您的代理是否使用 ECS_DATADIR 环境变量保存其状态。

    Copy
    [ec2-user ~]$ docker inspect ecs-agent | grep ECS_DATADIR

    输出:

    "ECS_DATADIR=/data",

    重要

    如果上一个命令未返回 ECS_DATADIR 环境变量,则您在停止代理前必须停止在此容器实例上运行的任何任务。使用 ECS_DATADIR 环境变量的较新的代理将会保存其状态,您可以在任务运行的过程中停止和启动它们,而不会造成问题。有关更多信息,请参阅 更新 Amazon ECS 容器代理

  4. 停止 ecs 服务。

    Copy
    [ec2-user ~]$ sudo stop ecs

    输出:

    ecs stop/waiting
  5. 重新启动 ecs 服务。

    Copy
    [ec2-user ~]$ sudo start ecs

    输出:

    
    ecs start/running, process 2959
  6. (可选)您可以通过查询代理自检 API,验证代理是否正在运行并查看有关新容器实例的一些信息。有关更多信息,请参阅 Amazon ECS 容器代理自检

    Copy
    [ec2-user ~]$ curl http://localhost:51678/v1/metadata

    输出:

    
    {
      "Cluster": "default",
      "ContainerInstanceArn": "<container_instance_ARN>",
      "Version": "Amazon ECS Agent - v1.14.3 (15de319)"
    }