本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
运行 Docker 容器
您可以将Amazon IoT Greengrass组件配置为从存储在以下位置的映像运行 Docker
-
Amazon ECR 中的公有和私有镜像存储库
-
Docker Hub 公共存储库
-
公共 Docker 可信注册表
-
S3 存储桶
在您的自定义组件中,将 Docker 镜像 URI 作为工件包括在内,以检索图像并在核心设备上运行它。对于亚马逊 ECR 和 Docker Hub 镜像,您可以使用 Docker 应用程序管理器组件下载镜像并管理私有 Amazon ECR 存储库的证书。
主题
要求
要在组件中运行 Docker 容器,您需要以下内容:
-
一台 Greengrass 的核心设备。如果没有,请参阅教程:Amazon IoT Greengrass V2 入门。
-
Docker Engin
e 1.9.1 或更高版本已安装在 Greengrass 核心设备上。版本 20.10 是经验证可与 Amazon IoT Greengrass Core 软件一起使用的最新版本。在部署运行 Docker 容器的组件之前,必须直接在核心设备上安装 Docker。 提示
你也可以将核心设备配置为在安装组件时安装 Docker Engine。例如,以下安装脚本在加载 Docker 镜像之前安装 Docker Engine。此安装脚本适用于基于 Debian 的 Linux 发行版,例如 Ubuntu。如果您使用此命令将组件配置为安装 Docker Engine,则可能需要在生命周期脚本
true
中将设置RequiresPrivilege
为才能运行安装和docker
命令。有关更多信息,请参阅Amazon IoT Greengrass组件配方参考:apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/
hello-world.tar
-
运行 Docker 容器组件的系统用户必须具有 root 权限或管理员权限,或者您必须将 Docker 配置为以非根用户或非管理员用户身份运行该组件。
-
在 Linux 设备上,您可以将用户添加到
docker
群组中,无需调用docker
命令sudo
。 -
在 Windows 设备上,您可以将用户添加到
docker-users
群组,以便在没有管理员权限的情况下调用docker
命令。
-
-
由 Docker 容器组件访问的文件作为卷装载
在 Docker 容器中。 -
如果您将 Amazon IoT Greengrass Core 软件配置为使用网络代理,则必须将 Docker 配置为使用相同的代理服务器
。
除了这些要求外,如果以下要求适用于您的环境,则还必须满足这些要求:
-
要使用 Docker Compose
创建和启动 Docker 容器,请在您的 Greengrass 核心设备上安装 Docker Compose,然后将您的 Docker Compose 文件上传到 S3 存储桶。您必须将 Compose 文件存储在与组件Amazon Web Services 区域相同Amazon Web Services 账户和的 S3 存储桶中。有关在自定义组件中使用 docker-compose up
命令的示例,请参见在亚马逊 ECR 或 Docker Hub 中使用公共映像运行 Docker 容器。 -
如果您在网络代理Amazon IoT Greengrass后面运行,请将 Docker 守护程序配置为使用代理服务器
。 -
如果您的 Docker 镜像存储在亚马逊 ECR 或 Docker Hub 中,请将 Dock er 组件管理器组件作为依赖项包含在您的 D ocker 容器组件中。在部署组件之前,必须先在核心设备上启动 Docker 守护程序。
此外,将图像 URI 作为组件伪像包括在内。图像 URI 必须采用以下示例
docker:
中显示的格式:registry
/image
[:tag|@digest
]-
Amazon ECR 私人图片:
docker:
account-id
.dkr.ecr.region
.amazonaws.com/repository
/image
[:tag|@digest
] -
Amazon ECR 公开图片:
docker:public.ecr.aws/
repository
/image
[:tag|@digest
] -
公共 Docker Hub 图片:
docker:
name
[:tag|@digest
]
有关使用存储在公共存储库中的图像运行 Docker 容器的更多信息,请参阅在亚马逊 ECR 或 Docker Hub 中使用公共映像运行 Docker 容器。
-
-
如果您的 Docker 映像存储在 Amazon ECR 私有存储库中,则必须将代币交换服务组件作为依赖项包含在 Docker 容器组件中。此外,Greengrass 设备角色必须允许
ecr:GetAuthorizationToken
ecr:BatchGetImage
、和ecr:GetDownloadUrlForLayer
操作,如以下 IAM 策略示例所示。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
有关使用存储在 Amazon ECR 私有存储库中的图像运行 Docker 容器的信息,请参阅。在亚马逊 ECR 中使用私有映像运行 Docker 容器
-
要使用存储在 Amazon ECR 私有存储库中的 Docker 镜像,私有存储库必须与核心设备Amazon Web Services 区域相同。
-
如果您的 Docker 映像或 Compose 文件存储在 S3 存储桶中,则 Greengrass 设备角色必须允许核心设备将图像下载为组件构件的
s3:GetObject
权限,如以下 IAM 策略示例所示。{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Resource": [ "*" ], "Effect": "Allow" } ] }
有关使用存储在 Amazon S3 中的图像运行 Docker 容器的信息,请参阅在Amazon S3 中使用镜像运行 Docker 容器。
-
要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭证或流管理器,在运行 Docker 容器时必须指定其他选项。有关更多信息,请参阅下列内容:
在亚马逊 ECR 或 Docker Hub 中使用公共映像运行 Docker 容器
本节介绍如何创建一个自定义组件,该组件使用 Docker Compose 从存储在亚马逊 ECR 和 Docker Hub 的 Docker 镜像中运行 Docker 容器。
使用 Docker Compose 运行 Docker 容器
-
创建 Docker Compe 文件并将其上载到 Amazon S3 存储桶。确保 Greengrass 设备角色允许设备访问 Compose 文件。
s3:GetObject
以下示例中显示的示例撰写文件包括来自亚马逊 ECR 的亚马逊CloudWatch代理镜像和来自 Docker Hub 的 MySQL 镜像。version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
-
在您的Amazon IoT Greengrass核心设备上@@ 创建自定义组件。以下示例中显示的示例配方具有以下属性:
-
作为依赖项的 Docker 应用程序管理器组件。此组件Amazon IoT Greengrass允许从公共 Amazon ECR 和 Docker Hub 存储库下载镜像。
-
一个组件构件,用于在公共 Amazon ECR 存储库中指定 Docker 镜像。
-
一个组件构件,用于在公共 Docker Hub 存储库中指定 Docker 镜像。
-
一个组件构件,用于指定 Docker Compose 文件,该文件包含要运行的 Docker 镜像的容器。
-
生命周期运行脚本,使用 docker-compose up
从指定映像创建和启动容器。
注意
要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭证或流管理器,在运行 Docker 容器时必须指定其他选项。有关更多信息,请参阅下列内容:
-
-
测试组件以验证其是否按预期工作。
重要
在部署组件之前,必须安装并启动 Docker 守护程序。
在本地部署组件后,您可以运行 docker 容器 ls
命令来验证您的容器是否在运行。 docker container ls
-
组件准备就绪后,将组件上传到Amazon IoT Greengrass以部署到其他核心设备。有关更多信息,请参阅发布要部署到核心设备的组件:
在亚马逊 ECR 中使用私有映像运行 Docker 容器
本节介绍如何通过存储在 Amazon ECR 私有存储库中的 Docker 镜像创建运行 Docker 容器的自定义组件。
运行 Docker 容器
-
在您的Amazon IoT Greengrass核心设备上@@ 创建自定义组件。使用以下示例配方,该配方具有以下属性:
-
作为依赖项的 Docker 应用程序管理器组件。此组件Amazon IoT Greengrass允许管理从私有存储库下载映像的凭据。
-
作为依赖项的代币交换服务组件。此组件允许检索Amazon凭证Amazon IoT Greengrass以与 Amazon ECR 进行交互。
-
一个组件构件,用于在私有 Amazon ECR 存储库中指定 Docker 镜像。
-
生命周期运行脚本,使用 docker run
从镜像创建和启动容器。
注意
要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭证或流管理器,在运行 Docker 容器时必须指定其他选项。有关更多信息,请参阅下列内容:
-
-
测试组件以验证其是否按预期工作。
重要
在部署组件之前,必须安装并启动 Docker 守护程序。
在本地部署组件后,您可以运行 docker 容器 ls
命令来验证您的容器是否在运行。 docker container ls
-
将组件上载到Amazon IoT Greengrass,以部署到其他核心设备。有关更多信息,请参阅发布要部署到核心设备的组件:
在Amazon S3 中使用镜像运行 Docker 容器
本节介绍如何在存储在 Amazon S3 中的 Docker 镜像的组件中运行 Docker 容器。
在 Amazon S3 中的映像中的组件中运行 Docker 容器
-
运行 docker save
命令创建 Docker 容器的备份。您可以将此备份作为组件工件提供,以便在其上运行容器Amazon IoT Greengrass。将 hello-wor
ld 替换为图像的名称,并将hello-world.tar
替换为要创建的存档文件的名称。docker save
hello-world
>artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
-
在您的Amazon IoT Greengrass核心设备上@@ 创建自定义组件。使用以下示例配方,该配方具有以下属性:
-
生命周期安装脚本,使用 docker 加载
从档案中加载 Docker 镜像。 -
生命周期运行脚本,使用 docker run
从镜像创建和启动容器。该 --rm
选项会在容器退出时清理容器。
注意
要在 Docker 容器组件中使用进程间通信 (IPC)、Amazon凭证或流管理器,在运行 Docker 容器时必须指定其他选项。有关更多信息,请参阅下列内容:
-
-
测试组件以验证其是否按预期工作。
在本地部署组件后,您可以运行 docker 容器 ls
命令来验证您的容器是否在运行。 docker container ls
-
组件准备就绪后,将 Docker 映像存档上传到 S3 存储桶,并将其的 URI 添加到组件配方中。然后,可以将组件上载到,Amazon IoT Greengrass以部署到其他核心设备。有关更多信息,请参阅发布要部署到核心设备的组件:
完成后,组件配方应类似于以下示例。
在 Docker 容器组件中使用进程间通信
您可以使用中的 Greengrass 进程间通信 (IPC) 库与 Greengrass 核、其他 Greengrass 组件和进行通信。Amazon IoT Device SDK Amazon IoT Core有关更多信息,请参阅使用Amazon IoT Device SDK与 Greengrass 核、其他组件进行通信,以及 Amazon IoT Core:
要在 Docker 容器组件中使用 IPC,必须使用以下参数运行 Docker 容器:
-
在容器中安装 IPC 插槽。Greengrass 核在环境变量中提供 IPC 套接字文件路径。
AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT
-
将
SVCUID
和AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT
环境变量设置为 Greengrass 核提供给组件的值。您的组件使用这些环境变量来验证与 Greengrass 核的连接。
例 配方示例:将 MQTT 消息发布到 Amazon IoT Core (Python)
以下配方定义了将 MQTT 消息发布到的示例 Docker 容器组件。Amazon IoT Core该配方具有以下属性:
-
授权策略 (
accessControl
) 允许组件向所有主题发布 MQTT 消息。Amazon IoT Core有关更多信息,请参阅授权组件执行 IPC 操作和 Amazon IoT CoreMQTT IPC 授权。 -
在 Amazon S3 中将 Docker 映像指定为 TAR 存档的组件构件。
-
从 TAR 存档中加载 Docker 镜像的生命周期安装脚本。
-
一个生命周期运行脚本,用于从该映像运行 Docker 容器。D ocker 运行
命令具有以下参数: -
该
-v
参数将 Greengrass IPC 插槽安装在容器中。 -
前两个
-e
参数在 Docker 容器中设置所需的环境变量。 -
附加
-e
参数设置了本示例使用的环境变量。 -
--rm
参数在容器退出时会清理容器。
-
在 Docker 容器组件中使用Amazon证书 (Linux)
您可以使用令牌交换服务组件与 Greengrass 组件中的Amazon服务进行交互。该组件使用本地容器服务器提供来自核心设备的代币交换角色的Amazon凭证。有关更多信息,请参阅与Amazon服务互动:
注意
本节中的示例仅适用于 Linux 核心设备。
要在 Docker 容器组件中使用来自令牌交换服务的Amazon证书,必须使用以下参数运行 Docker 容器:
-
使用
--network=host
参数提供对主机网络的访问权限。此选项允许 Docker 容器连接到本地令牌交换服务以检索Amazon凭证。这个论点只适用于 Linux 版的 Docker。警告
此选项允许容器访问主机上的所有本地网络接口,因此此选项不如在没有主机网络访问权限的情况下运行 Docker 容器时安全。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机
。 -
将
AWS_CONTAINER_CREDENTIALS_FULL_URI
和AWS_CONTAINER_AUTHORIZATION_TOKEN
环境变量设置为 Greengrass 核提供给组件的值。 AmazonSDK 使用这些环境变量来检索Amazon证书。
例 配方示例:列出 Docker 容器组件中的 S3 存储桶 (Python)
以下配方定义了一个示例 Docker 容器组件,该组件列出了您Amazon Web Services 账户的 S3 存储桶。该配方具有以下属性:
-
作为依赖项的代币交换服务组件。这种依赖关系使组件能够检索Amazon凭证以与其他Amazon服务进行交互。
-
在 Amazon S3 中将 Docker 映像指定为 tar 存档的组件构件。
-
从 TAR 存档中加载 Docker 镜像的生命周期安装脚本。
-
一个生命周期运行脚本,用于从该映像运行 Docker 容器。D ocker 运行
命令具有以下参数: -
--network=host
参数提供容器访问主机网络的权限,因此容器可以连接到令牌交换服务。 -
-e
参数在 Docker 容器中设置所需的环境变量。 -
--rm
参数在容器退出时会清理容器。
-
在 Docker 容器组件 (Linux) 中使用流管理器
您可以使用流管理器组件来管理 Greengrass 组件中的数据流。此组件使您能够处理数据流并将大量IoT 数据传输到。Amazon Web Services 云 Amazon IoT Greengrass提供用于与流管理器组件交互的流管理器 SDK。有关更多信息,请参阅管理 Greengrass 核心设备上的数据流:
注意
本节中的示例仅适用于 Linux 核心设备。
要在 Docker 容器组件中使用流管理器 SDK,必须使用以下参数运行 Docker 容器:
-
使用
--network=host
参数提供对主机网络的访问权限。此选项允许 Docker 容器通过本地 TLS 连接与流管理器组件进行交互。这个论点只适用于 Linux 版的 Docker警告
此选项允许容器访问主机上的所有本地网络接口,因此此选项不如在没有主机网络访问权限的情况下运行 Docker 容器时安全。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机
。 -
如果您将流管理器组件配置为需要身份验证(这是默认行为),请将
AWS_CONTAINER_CREDENTIALS_FULL_URI
环境变量设置为 Greengrass nucleus 提供给组件的值。有关更多信息,请参阅流管理器配置。 -
如果您将流管理器组件配置为使用非默认端口,请使用进程间通信 (IPC) 从流管理器组件配置中获取端口。你必须运行带有其他选项的 Docker 容器才能使用 IPC。有关更多信息,请参阅下列内容:
例 示例配方:将文件流式传输到 Docker 容器组件 (Python) 中的 S3 存储桶
以下配方定义了一个示例 Docker 容器组件,该组件创建文件并将其流式传输到 S3 存储桶。该配方具有以下属性:
-
作为依赖项的流管理器组件。这种依赖关系使组件能够使用流管理器 SDK 与流管理器组件进行交互。
-
在 Amazon S3 中将 Docker 映像指定为 TAR 存档的组件构件。
-
从 TAR 存档中加载 Docker 镜像的生命周期安装脚本。
-
一个生命周期运行脚本,用于从该映像运行 Docker 容器。D ocker 运行
命令具有以下参数: -
--network=host
参数提供容器访问主机网络的权限,因此容器可以连接到流管理器组件。 -
第一个
-e
参数在 Docker 容器中设置所需的AWS_CONTAINER_AUTHORIZATION_TOKEN
环境变量。 -
附加
-e
参数设置了本示例使用的环境变量。 -
-v
参数将组件的工作文件夹装载到容器中。此示例在工作文件夹中创建了一个文件,使用流管理器将该文件上传到 Amazon S3。 -
--rm
参数在容器退出时会清理容器。
-