运行 Docker 容器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

运行 Docker 容器

您可以配置Amazon IoT Greengrass组件来运行Docker容器中存储在以下位置的映像:

  • Amazon Elastic Container Registry (Amazon ECR) 中的公有和私有映像存储库

  • Docker Hub 存储库

  • 公共码头可信注册表

  • S3 存储桶

在您的自定义组件中,将 Docker 映像 URI 作为工件来检索映像并在核心设备上运行它。对于亚马逊 ECR 和 Docker 集线器映像,您可以使用Docker 应用程序管理器组件下载映像并管理私有 Amazon ECR 存储库的凭据。

Requirements

要在组件中运行 Docker 容器,您需要以下操作:

  • Greengrass 的核心设备。如果没有,请参阅开始使用 Amazon IoT Greengrass V2

  • Docker 引擎Greengrass 核心设备上安装的 1.9.1 或更高版本。版本 20.10 是经验证可与连接器一起使用的最新版本。在部署运行 Docker 容器的自定义组件之前,您必须直接在核心设备上安装 Docker。

  • 根用户权限或 Docker 配置为您将其作为非 root 用户. 将用户添加到docker组允许您调用docker命令,不使用sudo. 添加ggc_user,或用于运行Amazon IoT Greengrass,添加到docker组,运行sudo usermod -aG docker user-name.

  • Docker 容器组件访问的文件作为卷装载在 Docker 容器中。

除了这些要求之外,如果这些要求适用于您的环境,还必须满足以下要求:

  • 使用Docker Compose创建并启动 Docker 容器,在您的 Greengrass 核心设备上安装 Docker Compose,然后将 Docker Compose 文件上传到 S3 存储桶。您必须将 Compose 文件存储在 S3 存储桶中Amazon Web Services 账户和Amazon Web Services 区域作为组件。对于一个使用docker-compose up命令,请参阅从亚马逊 ECR 或 Docker 中心的公共映像运行 Docker 容器.

  • 如果您运行Amazon IoT Greengrass,请将 Docker 守护进程配置为使用代理服务器.

  • 如果您的 Docker 映像存储在亚马逊 ECR 或 Docker 中心中,请在Docker 组件管理器组件作为 Docker 容器组件中的依赖关系。您必须在核心设备上启动 Docker 守护程序,然后再部署组件。

    此外,将图像 URI 作为组件工件包含在内。映像 URI 必须采用格式docker:registry/image[:tag|@digest]如以下示例所示:

    • 亚马逊私人 ECR 图片:docker:account-id.dkr.ecr.region.amazonaws.com/repository/image[:tag|@digest]

    • 亚马逊公共 ECR 图片:docker:public.ecr.aws/repository/image[:tag|@digest]

    • 公共码头中心映像:docker:name[:tag|@digest]

  • 如果 Docker 映像存储在 Amazon ECR 专用存储库中,则必须将令牌交换服务组件作为依赖项包含在 Docker 容器组件中。此外,Greengrass 设备角色必须允许ecr:GetAuthorizationTokenecr:BatchGetImage, 和ecr:GetDownloadUrlForLayer操作,如以下示例 IAM 策略中所示。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    有关从存储在 Amazon ECR 专用存储库中的图像运行 Docker 容器的信息,请参阅从亚马逊 ECR 中的私有映像运行 Docker 容器.

  • 如果您的 Docker 映像或 Compose 文件存储在 S3 存储桶中,则Greengrass 设备角色必须允许s3:GetObject权限,允许核心设备将映像下载为组件项目,如以下示例 IAM 策略中所示。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    有关从 Amazon S3 中存储的映像运行 Docker 容器的信息,请参阅从 Amazon S3 中的映像运行 Docker 容器.

使用进程间通信 (IPC) 以使 Docker 容器组件能够与其他Amazon IoT Greengrass组件,您还必须设置Amazon IoT GreengrassDocker 容器中的核心环境变量,然后挂载Amazon IoT Greengrass核心根文件夹作为 Docker 容器中的卷。有关更多信息,请参阅 在 Docker 容器组件中使用进程间通信

从亚马逊 ECR 或 Docker 中心的公共映像运行 Docker 容器

本节介绍如何创建自定义组件,该组件使用 Docker Compose 从存储在 Amazon ECR 和 Docker Hub 的 Docker 映像运行 Docker 容器。

使用 Docker 撰写运行 Docker 容器的步骤

  1. 创建 Docker Compose 文件并将其上传到 Amazon S3 存储桶。确保已使用Greengrass 设备角色允许s3:GetObject权限,以使设备能够访问撰写文件。以下示例中显示的撰写文件示例包括来自亚马逊 ECR 的亚马逊 CloudWatch 代理映像和 Docker 中心的 MySQL 映像。

    version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
  2. 创建自定义组件在您的Amazon IoT Greengrass核心设备。以下示例中显示的配方示例具有以下属性:

    • Docker 应用程序管理器组件作为依赖项。此组件启用Amazon IoT Greengrass从亚马逊 ECR 和 Docker 中心公共存储库下载图像。

    • 在公共 Amazon ECR 存储库中指定 Docker 映像的组件工件。

    • 在公共 Docker Hub 存储库中指定 Docker 映像的组件工件。

    • 一个组件工件,它指定 Docker Compose 文件,其中包含要运行的 Docker 映像的容器。

    • 生命周期运行脚本,使用码头组成从指定的图像创建和启动容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComposeComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "Run": "docker-compose -f {artifacts:path}/docker-compose.yaml up" }, "Artifacts": [ { "URI": "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" }, { "URI": "docker:mysql:8.0" }, { "URI": "s3://DOC-EXAMPLE-BUCKET/folder/docker-compose.yaml" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyDockerComposeComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: Run: docker-compose -f {artifacts:path}/docker-compose.yaml up Artifacts: - URI: "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" - URI: "docker:mysql:8.0" - URI: "s3://DOC-EXAMPLE-BUCKET/folder/docker-compose.yaml"
    注意

    若要在 Docker 容器组件中使用进程间通信 (IPC),必须将Amazon IoT GreengrassDocker 容器中的核心环境变量。有关更多信息,请参阅 在 Docker 容器组件中使用进程间通信

  3. 测试组件验证它可以按预期运行。

    重要

    在部署组件之前,您必须安装并启动 Docker 守护进程。

    在本地部署组件后,您可以运行Docker 容器 ls命令来验证容器是否运行。

    docker container ls
  4. 组件准备就绪后,将组件上载到Amazon IoT Greengrass部署到其他核心设备。有关更多信息,请参阅 上传要部署到核心设备的组件

从亚马逊 ECR 中的私有映像运行 Docker 容器

本节介绍如何创建一个自定义组件,该组件通过存储在 Amazon ECR 私有存储库中的 Docker 映像运行 Docker 容器。

运行 Docker 容器

  1. 创建自定义组件在您的Amazon IoT Greengrass核心设备。使用以下配方示例,具有以下属性:

    • Docker 应用程序管理器组件作为依赖项。此组件启用Amazon IoT Greengrass管理凭据,以便从私有存储库下载映像。

    • 令牌交换服务组件作为依赖关系。此组件启用Amazon IoT Greengrass检索Amazon凭证以与亚马逊 ECR 进行交互。

    • 在私有 Amazon ECR 存储库中指定 Docker 映像的组件工件。

    • 生命周期运行脚本,使用码头运行从映像创建和启动容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyPrivateDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from a private Amazon ECR image.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" }, "aws.greengrass.TokenExchangeService": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "Run": "docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" }, "Artifacts": [ { "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyPrivateDockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from a private Amazon ECR image.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 aws.greengrass.TokenExchangeService: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: Run: account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest] Artifacts: - URI: "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
    注意

    若要在 Docker 容器组件中使用进程间通信 (IPC),必须将Amazon IoT GreengrassDocker 容器中的核心环境变量。有关更多信息,请参阅 在 Docker 容器组件中使用进程间通信

  2. 测试组件验证它可以按预期运行。

    重要

    在部署组件之前,您必须安装并启动 Docker 守护进程。

    在本地部署组件后,您可以运行Docker 容器 ls命令来验证容器是否运行。

    docker container ls
  3. 将组件上载到Amazon IoT Greengrass部署到其他核心设备。有关更多信息,请参阅 上传要部署到核心设备的组件

从 Amazon S3 中的映像运行 Docker 容器

本节介绍如何通过存储在 Amazon S3 中的 Docker 映像在组件中运行 Docker 容器。

从 Amazon S3 中的映像运行组件中的 Docker 容器

  1. 运行Docker 保存命令创建 Docker 容器的备份。您可以将此备份作为组件对象提供,以便在Amazon IoT Greengrass. Replacehello-world替换为映像名称,然后将hello-world.tar替换为要创建的存档文件的名称。

    docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
  2. 创建自定义组件在您的Amazon IoT Greengrass核心设备。使用以下配方示例,具有以下属性:

    • 生命周期安装脚本,使用Docker 负载从存档加载 Docker 映像。

    • 生命周期运行脚本,使用码头运行可从该映像创建和启动容器。这些区域有:--rm选项会在容器退出时清除容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "Install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "Run": { "Script": "docker run --rm hello-world" } } } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: Install: Script: docker load -i {artifacts:path}/hello-world.tar Run: Script: docker run --rm hello-world
    注意

    若要在 Docker 容器组件中使用进程间通信 (IPC),必须将Amazon IoT GreengrassDocker 容器中的核心环境变量。有关更多信息,请参阅 在 Docker 容器组件中使用进程间通信

    您也可以配置Amazon IoT Greengrass以在组件安装时安装 Docker 引擎。例如,以下安装脚本会在加载 Docker 映像之前安装 Docker 引擎。此安装脚本适用于基于 Debian 的 Linux 发行版,例如 Ubuntu。如果您使用此命令将组件配置为安装 Docker Engine,则可能需要添加sudo添加到docker命令来运行它们。

    sudo apt-get install docker-ce docker-ce-cli containerd.io && sudo docker load -i {artifacts:path}/hello-world.tar
  3. 测试组件验证它可以按预期运行。

    在本地部署组件后,您可以运行Docker 容器 ls命令来验证容器是否运行。

    docker container ls
  4. 组件就绪后,将 Docker 映像存档上传到 S3 存储桶,然后将其 URI 添加到组件配方。然后,您可以将组件上传到Amazon IoT Greengrass部署到其他核心设备。有关更多信息,请参阅 上传要部署到核心设备的组件

    完后,组件配方应与以下示例类似。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "Install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "Run": { "Script": "docker run --rm hello-world" } }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: Install: Script: docker load -i {artifacts:path}/hello-world.tar Run: Script: docker run --rm hello-world Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar

在 Docker 容器组件中使用进程间通信

进程间通信使您能够开发可以与Amazon IoT Greengrass核心和其他组成部分。要在 Docker 容器组件中使用进程间通信,您必须将以下环境变量设置为Amazon IoT Greengrass核心提供给组件。

  • AWS_REGION

  • SVCUID

  • AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT

  • AWS_CONTAINER_AUTHORIZATION_TOKEN

  • AWS_CONTAINER_CREDENTIALS_FULL_URI

您可以使用-e--env,或者--env-fileParameter Parameter在 Docker 容器中设置环境变量你跑的

启动 Docker 容器时,还必须将 Docker 容器组件需要访问的任何文件作为卷装载。要使用进程间通信,请挂载Amazon IoT GreengrassCore 软件。您可以使用-v--volume,或者--mountParameter Parameter在 Docker 容器中装载卷你跑的

以下组件配方示例具有以下属性:

  • Docker 应用程序管理器组件作为依赖项。此组件启用Amazon IoT Greengrass管理凭据,以便从私有存储库下载映像。

  • 令牌交换服务组件作为依赖关系。此组件启用Amazon IoT Greengrass检索Amazon凭证以与亚马逊 ECR 进行交互。

  • 在私有 Amazon ECR 存储库中指定 Docker 映像的组件工件。

  • 生命周期运行脚本,使用码头运行可从该映像创建和启动容器。

    • 这些区域有:-e参数设置所需的环境变量Amazon IoT GreengrassCore 在 Docker 容器。

    • 这些区域有:-v参数挂载/绿草/v2文件夹作为卷。Replace/绿草/v2与您用于安装Amazon IoT GreengrassCore 软件。

    • 这些区域有:--rm选项会在容器退出时清除容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyIPCDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container and uses interprocess communication.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" }, "aws.greengrass.TokenExchangeService": { "VersionRequirement": "~2.0.0" } }, "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": "{\"aws.greengrass.ipc.pubsub\":{\"com.example.MyDockerComponent:pubsub:1\":{\"policyDescription\":\"Allows access to publish and subscribe to all topics.\",\"operations\":[\"*\"],\"resources\":[\"*\"]}}}" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "Run": "docker run --rm -v /greengrass/v2:/greengrass/v2 -e AWS_REGION=$AWS_REGION -e SVCUID=$SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT=$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e AWS_CONTAINER_AUTHORIZATION_TOKEN=$AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI=$AWS_CONTAINER_CREDENTIALS_FULL_URI account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" }, "Artifacts": [ { "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" } ] } ] }
YAML
--- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyIPCDockerComponent ComponentVersion: 1.0.0 ComponentDescription: 'A component that runs a Docker container and uses interprocess communication.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 aws.greengrass.TokenExchangeService: VersionRequirement: ~2.0.0 ComponentConfiguration: DefaultConfiguration: accessControl: '{"aws.greengrass.ipc.pubsub":{"com.example.MyDockerComponent:pubsub:1":{"policyDescription":"Allows access to publish and subscribe to all topics.","operations":["*"],"resources":["*"]}}}' Manifests: - Platform: os: all Lifecycle: Run: 'docker run --rm -v /greengrass/v2:/greengrass/v2 -e AWS_REGION=$AWS_REGION -e SVCUID=$SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT=$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e AWS_CONTAINER_AUTHORIZATION_TOKEN=$AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI=$AWS_CONTAINER_CREDENTIALS_FULL_URI account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]' Artifacts: - URI: 'docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]'