本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
运行 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: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 容器.
-
如果您的 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 容器的步骤
-
创建 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"
-
创建自定义组件在您的Amazon IoT Greengrass核心设备。以下示例中显示的配方示例具有以下属性:
-
Docker 应用程序管理器组件作为依赖项。此组件启用Amazon IoT Greengrass从亚马逊 ECR 和 Docker 中心公共存储库下载图像。
-
在公共 Amazon ECR 存储库中指定 Docker 映像的组件工件。
-
在公共 Docker Hub 存储库中指定 Docker 映像的组件工件。
-
一个组件工件,它指定 Docker Compose 文件,其中包含要运行的 Docker 映像的容器。
-
生命周期运行脚本,使用码头组成
从指定的图像创建和启动容器。
注意 若要在 Docker 容器组件中使用进程间通信 (IPC),必须将Amazon IoT GreengrassDocker 容器中的核心环境变量。有关更多信息,请参阅 在 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 IoT Greengrass检索Amazon凭证以与亚马逊 ECR 进行交互。
-
在私有 Amazon ECR 存储库中指定 Docker 映像的组件工件。
-
生命周期运行脚本,使用码头运行
从映像创建和启动容器。
注意 若要在 Docker 容器组件中使用进程间通信 (IPC),必须将Amazon IoT GreengrassDocker 容器中的核心环境变量。有关更多信息,请参阅 在 Docker 容器组件中使用进程间通信。
-
-
测试组件验证它可以按预期运行。
重要 在部署组件之前,您必须安装并启动 Docker 守护进程。
在本地部署组件后,您可以运行Docker 容器 ls
命令来验证容器是否运行。 docker container ls
-
将组件上载到Amazon IoT Greengrass部署到其他核心设备。有关更多信息,请参阅 上传要部署到核心设备的组件。
从 Amazon S3 中的映像运行 Docker 容器
本节介绍如何通过存储在 Amazon S3 中的 Docker 映像在组件中运行 Docker 容器。
从 Amazon S3 中的映像运行组件中的 Docker 容器
-
运行Docker 保存
命令创建 Docker 容器的备份。您可以将此备份作为组件对象提供,以便在Amazon IoT Greengrass. Replace hello-world
替换为映像名称,然后将hello-world.tar
替换为要创建的存档文件的名称。docker save
hello-world
>artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
-
创建自定义组件在您的Amazon IoT Greengrass核心设备。使用以下配方示例,具有以下属性:
注意 若要在 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
-
测试组件验证它可以按预期运行。
在本地部署组件后,您可以运行Docker 容器 ls
命令来验证容器是否运行。 docker container ls
-
组件就绪后,将 Docker 映像存档上传到 S3 存储桶,然后将其 URI 添加到组件配方。然后,您可以将组件上传到Amazon IoT Greengrass部署到其他核心设备。有关更多信息,请参阅 上传要部署到核心设备的组件。
完后,组件配方应与以下示例类似。
在 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-file
Parameter Parameter在 Docker 容器中设置环境变量
启动 Docker 容器时,还必须将 Docker 容器组件需要访问的任何文件作为卷装载。要使用进程间通信,请挂载Amazon IoT GreengrassCore 软件。您可以使用-v
、--volume
,或者--mount
Parameter 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
选项会在容器退出时清除容器。
-