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

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

运行 Docker 容器

您可以配置 AWS AWS IoT Greengrass 组件以运行 Docker 容器。

您可以将 Docker 映像存储在 Amazon S3 中,以将其作为组件构件提供。

Requirements

要在组件中运行 Docker 容器,您需要:

要在 Docker 容器组件中使用进程间通信 (IPC),您还必须在 Docker 容器中设置 AWS AWS IoT Greengrass 核心环境变量,并将 AWS AWS IoT Greengrass 核心根文件夹装载为 Docker 容器中的卷。有关更多信息,请参阅在 Docker 容器组件中使用进程间通信

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

本节介绍如何在 Amazon S3 中存储 Docker 映像以在组件中运行 Docker 容器。在此过程中,您将执行以下操作:

  • 使用组件生命周期命令加载 Docker 映像并在容器中运行该映像。

  • 将图像存储在 S3 存储桶中,以将其作为您的组件使用的构件提供。

在组件中运行 Docker 容器

  1. 运行 docker save 命令以创建 Docker 容器的备份。您可以将此备份作为组件构件提供,以在 AWS AWS IoT Greengrass 上运行容器。Replace hello-world 替换为映像的名称,并替换 hello-world.tar 替换为要创建的存档文件的名称。

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

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

    • 使用 docker run 从映像创建和启动容器的生命周期运行脚本。--rm 选项将在容器退出时对其进行清理。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container.", "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.MyDockerComponent ComponentVersion: '1.0.0' ComponentDescription: A component that runs a Docker container. 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),您必须在 Docker 容器中设置 AWS AWS IoT Greengrass 核心环境变量。有关更多信息,请参阅在 Docker 容器组件中使用进程间通信

    您还可以将 AWS IoT IoT Greengrass 配置为在组件安装时安装 Docker Engine。例如,以下安装脚本会在加载 Docker 映像之前安装 Docker Engine。此安装脚本适用于基于 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 添加到组件配方。然后,您可以将该组件上传到 AWS AWS IoT Greengrass 以部署到其他核心设备。有关更多信息,请参阅上传组件以部署到您的核心设备

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

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container.", "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.MyDockerComponent ComponentVersion: '1.0.0' ComponentDescription: A component that runs a Docker container. 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 容器组件中使用进程间通信

利用进程间通信,您可以开发可以与 AWS AWS IoT Greengrass 核心和其他组件通信的组件。要在 Docker 容器组件中使用进程间通信,您必须设置 AWS AWS 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-file 参数在您运行的 Docker 容器中https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file设置环境变量。

启动 Docker 容器时,您还必须以卷形式挂载 Docker 容器组件需要访问的任何文件。要使用进程间通信,请装载 AWS AWS IoT Greengrass 核心软件的根文件夹。您可以使用 -v 参数在您运行的 Docker 容器中https://docs.docker.com/engine/reference/commandline/run/#mount-volume--v---read-only挂载卷。

以下示例组件配方使用 -e 参数在 Docker 容器中从 AWS AWS IoT Greengrass 核心设置所需的环境变量,并挂载 /greengrass/v2 文件夹作为卷。Replace /greengrass/v2 替换为您用于安装 AWS AWS IoT Greengrass 核心软件的根文件夹的路径。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container.", "ComponentPublisher": "Amazon", "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": "linux" }, "Lifecycle": { "Install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "Run": { "Script": "docker run -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 --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.MyDockerComponent ComponentVersion: '1.0.0' ComponentDescription: A component that runs a Docker container. ComponentPublisher: Amazon 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: linux Lifecycle: Install: Script: docker load -i {artifacts:path}/hello-world.tar Run: Script: docker run -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 --rm hello-world Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar