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

Amazon IoT Greengrass Version 1在 2023 年 6 月 30 日之前,将不再接收功能更新,并且将仅收到安全补丁和错误修复。有关更多信息,请参阅Amazon IoT Greengrass V1维护时段。我们强烈建议您迁移到Amazon IoT Greengrass Version 2,这增加了重要的新功能支持其他平台

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

在 Docker 容器中运行 Amazon IoT Greengrass

Amazon IoT Greengrass 可以配置为在 Docker 容器中运行。

你可以下载一个 Dockerfile通过亚马逊 CloudFront那有Amazon IoT Greengrass安装了核心软件和依赖项。要修改 Docker 镜像以便在不同平台架构上运行或减少 Docker 镜像的大小,请参阅 Docker 程序包下载中的 README 文件。

为了帮助您开始体验 Amazon IoT Greengrass,Amazon 还提供了预构建的 Docker 映像,其中安装了 Amazon IoT Greengrass Core 软件和依赖项。您可以从下载映像Docker Hub要么Amazon Elastic Container Registry(Amazon ECR)。这些预构建的映像使用 Amazon Linux 2 (x86_64) 和 Alpine Linux(x86_64、Armv7l 或 AArch64)基本映像。

重要

2022 年 6 月 30 日Amazon IoT Greengrass已结束的维护Amazon IoT Greengrass核心软件 v1.x Docker 映像发布到了 Amazon Elastic Container Registry (Amazon ECR) 和 Docker Hub。您可以继续从 Amazon ECR 和 Docker Hub 下载这些 Docker 映像,直到 2023 年 6 月 30 日,也就是维护结束一年后。但是,Amazon IoT Greengrass2022 年 6 月 30 日维护结束后,核心软件 v1.x Docker 映像不再收到安全补丁或错误修复。如果您运行的生产工作负载依赖于这些 Docker 映像,我们建议您使用 Dockerfiles 构建自己的 Docker 映像Amazon IoT Greengrass提供。有关更多信息,请参阅 Amazon IoT Greengrass Docker 软件

本主题介绍如何下载Amazon IoT Greengrass来自 Amazon ECR 的 Docker 映像并在 Windows、macOS 或 Linux (x86_64) 平台上运行它。本主题包含以下步骤:

在 Docker 容器中运行 Amazon IoT Greengrass 时,不支持以下功能:

  • 连接器在中运行Greengrass 容器模式。要在 Docker 容器中运行连接器,该连接器必须在无容器模式下运行。要查找支持无容器模式的连接器,请参阅Amazon-提供的 Greengrass 连接器。其中一些连接器具有隔离模式参数,您必须将此参数设为无容器

  • 本地设备和卷资源。在 Docker 容器中运行的用户定义的 Lambda 函数必须直接访问核心上的设备和卷。

当 Greengrass 组的 Lambda 运行时环境设置为无容器,这是运行所需的Amazon IoT Greengrass在 Docker 容器中。

先决条件

开始本教程之前,您必须执行以下操作。

  • 您必须在您的主机上安装以下软件和版本Amazon Command Line Interface(Amazon CLI) 您选择的版本。

    Amazon CLI version 2
    • 搬运工人版本 18.09 或更高版本。早期版本也可使用,但我们建议使用 18.09 或更高版本。

    • Amazon CLI2.0.0 或更高版本。

      注意

      要升级到更高版本Amazon CLIWindows 计算机上安装版本 2,您必须重复MSI 安装过程。

    Amazon CLI version 1
    • 搬运工人版本 18.09 或更高版本。早期版本也可使用,但我们建议使用 18.09 或更高版本。

    • Python版本 3.6 或更高版本。

    • pip 版本 18.1 或更高版本。

    • Amazon CLI版本 1.17.10 或更高版本

      • 安装Amazon CLI版本 1,请参阅安装Amazon CLI版本 1.

      • 配置Amazon CLI请参阅请参阅请参阅配置Amazon CLI.

      • 升级到最新版本的Amazon CLI版本 1,请运行以下命令。

        pip install awscli --upgrade --user
      注意

      如果您将MSI 安装的Amazon CLIWindows 上版本 1,请注意以下事项:

      • 如果Amazon CLI版本 1 安装过程中未能安装 botocore,请尝试使用Python 和 pip 安装.

      • 要升级到更高版本Amazon CLI版本 1,您必须重复 MSI 安装过程。

  • 要访问AmazElastic Container Registry (Amazon ECR) 资源,您必须授予以下权限。

    • Amazon ECR 要求用户授予ecr:GetAuthorizationToken通过许可Amazon Identity and Access Management(IAM) 策略,然后才能对注册表进行身份验证并从 Amazon ECR 存储库推送或提取镜像。有关更多信息,请参阅 。Amazon ECR 存储库策略示例访问一个 Amazon ECR 存储库中的Amazon Elastic Conta.

第 1 步:GetAmazon IoT Greengrass来自 Amazon ECR 的容器镜像

Amazon 提供安装了 Amazon IoT Greengrass Core 软件的 Docker 映像。

警告

从 v1.11.6 版开始Amazon IoT Greengrass核心软件,Greengrass Docker 映像不再包含 Python 2.7,因为 Python 2.7 已达到 end-of-life 在 2020 年,不再接收安全更新。如果您选择更新到这些 Docker 映像,我们建议您在将更新部署到生产设备之前验证您的应用程序是否可以使用新的 Docker 映像。如果使用 Greengrass Docker 镜像的应用程序需要 Python 2.7,则可以修改 Greengrass Dockerfile 以在应用程序中包含 Python 2.7。

有关演示如何拉取latest镜像来自 Amazon ECR,请选择您的操作系统:

在计算机终端中运行以下命令。

  1. 登录到Amazon IoT Greengrass在亚马逊 ECR 中注册。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com

    如果成功,输出将打印 Login Succeeded

  2. 检索 Amazon IoT Greengrass 容器镜像。

    docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
    注意

    latest 映像包含安装在 Amazon Linux 2 基本映像上的 Amazon IoT Greengrass Core 软件的最新稳定版本。您还可以从存储库中拉取其他版本。要查找所有可用映像,请查看标签页.Docker Hub或者使用aws ecr list-images命令。例如:

    aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
  3. 启用符号链接和硬链接保护。如果您尝试在容器中运行 Amazon IoT Greengrass,则只能启用当前引导的设置。

    注意

    您可能需要使用 sudo 才能运行这些命令。

    • 要仅启用当前引导的设置,请执行以下操作:

      echo 1 > /proc/sys/fs/protected_hardlinks echo 1 > /proc/sys/fs/protected_symlinks
    • 要使设置在重新启动后保持不变,请执行以下操作:

      echo '# Amazon IoT Greengrass' >> /etc/sysctl.conf echo 'fs.protected_hardlinks = 1' >> /etc/sysctl.conf echo 'fs.protected_symlinks = 1' >> /etc/sysctl.conf sysctl -p
  4. 启用 IPv4 网络转发,这是 Amazon IoT Greengrass 云部署和 MQTT 通信在 Linux 上运行所必需的。在 /etc/sysctl.conf 文件中,将 net.ipv4.ip_forward 设置为 1,然后重新加载 sysctls

    sudo nano /etc/sysctl.conf # set this net.ipv4.ip_forward = 1 sudo sysctl -p
    注意

    您可以使用您选择的编辑器而不是 nano。

在计算机终端中运行以下命令。

  1. 登录到Amazon IoT Greengrass在亚马逊 ECR 中注册。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com

    如果成功,输出将打印 Login Succeeded

  2. 检索 Amazon IoT Greengrass 容器镜像。

    docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
    注意

    latest 映像包含安装在 Amazon Linux 2 基本映像上的 Amazon IoT Greengrass Core 软件的最新稳定版本。您还可以从存储库中拉取其他版本。要查找所有可用映像,请查看标签页.Docker Hub或者使用aws ecr list-images命令。例如:

    aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass

在命令提示符中运行以下命令。Docker 桌面必须先处于运行状态,然后您才能在 Windows 上使用 Docker 命令。

  1. 登录到Amazon IoT Greengrass在亚马逊 ECR 中注册。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com

    如果成功,输出将打印 Login Succeeded

  2. 检索 Amazon IoT Greengrass 容器镜像。

    docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
    注意

    latest 映像包含安装在 Amazon Linux 2 基本映像上的 Amazon IoT Greengrass Core 软件的最新稳定版本。您还可以从存储库中拉取其他版本。要查找所有可用映像,请查看标签页.Docker Hub或者使用aws ecr list-images命令。例如:

    aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass

第 2 步:创建和配置 Greengrass 组和核心

虽然 Docker 镜像已安装 Amazon IoT Greengrass 核心软件,但您必须创建 Greengrass 组和核心。这包括下载证书和核心配置文件。

第 3 步:本地运行 Amazon IoT Greengrass

配置您的组后,便能配置和启动核心。有关演示如何执行此操作的步骤,请选择您的操作系统:

在计算机终端中运行以下命令。

  1. 为设备的安全资源创建一个文件夹,然后将证书和密钥移到该文件夹中。运行以下命令。Replacepath-to-security-files将安全资源的路径,并将certificateId文件名中包含证书 ID。

    mkdir /tmp/certs mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs mv path-to-security-files/certificateId-public.pem.key /tmp/certs mv path-to-security-files/certificateId-private.pem.key /tmp/certs mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
  2. 为设备的配置创建一个文件夹,然后将Amazon IoT Greengrass核心配置文件夹存放到该文件夹。运行以下命令。Replacepath-to-config-file使用配置文件的路径。

    mkdir /tmp/config mv path-to-config-file/config.json /tmp/config
  3. 启动 Amazon IoT Greengrass 并将证书和配置文件绑定挂载到 Docker 容器中。

    /tmp 替换为您解压证书和配置文件的路径。

    docker run --rm --init -it --name aws-iot-greengrass \ --entrypoint /greengrass-entrypoint.sh \ -v /tmp/certs:/greengrass/certs \ -v /tmp/config:/greengrass/config \ -p 8883:8883 \ 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest

    输出应类似于此示例:

    Setting up greengrass daemon Validating hardlink/softlink protection Waiting for up to 30s for Daemon to start Greengrass successfully started with PID: 10

在计算机终端中运行以下命令。

  1. 为设备的安全资源创建一个文件夹,然后将证书和密钥移到该文件夹中。运行以下命令。Replacepath-to-security-files将安全资源的路径,并将certificateId文件名中包含证书 ID。

    mkdir /tmp/certs mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs mv path-to-security-files/certificateId-public.pem.key /tmp/certs mv path-to-security-files/certificateId-private.pem.key /tmp/certs mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
  2. 为设备的配置创建一个文件夹,然后将Amazon IoT Greengrass核心配置文件夹存放到该文件夹。运行以下命令。Replacepath-to-config-file使用配置文件的路径。

    mkdir /tmp/config mv path-to-config-file/config.json /tmp/config
  3. 启动 Amazon IoT Greengrass 并将证书和配置文件绑定挂载到 Docker 容器中。

    /tmp 替换为您解压证书和配置文件的路径。

    docker run --rm --init -it --name aws-iot-greengrass \ --entrypoint /greengrass-entrypoint.sh \ -v /tmp/certs:/greengrass/certs \ -v /tmp/config:/greengrass/config \ -p 8883:8883 \ 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest

    输出应类似于此示例:

    Setting up greengrass daemon Validating hardlink/softlink protection Waiting for up to 30s for Daemon to start Greengrass successfully started with PID: 10
  1. 为设备的安全资源创建一个文件夹,然后将证书和密钥移到该文件夹中。在命令提示符中运行以下命令。Replacepath-to-security-files将安全资源的路径,并将certificateId文件名中包含证书 ID。

    mkdir C:\Users\%USERNAME%\Downloads\certs move path-to-security-files\certificateId-certificate.pem.crt C:\Users\%USERNAME%\Downloads\certs move path-to-security-files\certificateId-public.pem.key C:\Users\%USERNAME%\Downloads\certs move path-to-security-files\certificateId-private.pem.key C:\Users\%USERNAME%\Downloads\certs move path-to-security-files\AmazonRootCA1.pem C:\Users\%USERNAME%\Downloads\certs
  2. 为设备的配置创建一个文件夹,然后将Amazon IoT Greengrass核心配置文件夹存放到该文件夹。在命令提示符中运行以下命令。Replacepath-to-config-file使用配置文件的路径。

    mkdir C:\Users\%USERNAME%\Downloads\config move path-to-config-file\config.json C:\Users\%USERNAME%\Downloads\config
  3. 启动 Amazon IoT Greengrass 并将证书和配置文件绑定挂载到 Docker 容器中。在命令提示符处运行以下命令。

    docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest

    当 Docker 提示您与 Docker 守护程序共享 C:\ 驱动器时,允许它在 Docker 容器内绑定挂载 C:\ 目录。有关更多信息,请参阅 Docker 文档中的共享驱动器

    输出应类似于此示例:

    Setting up greengrass daemon Validating hardlink/softlink protection Waiting for up to 30s for Daemon to start Greengrass successfully started with PID: 10
注意

如果容器不打开 shell 并立即退出,则可以在启动映像时通过绑定挂载 Greengrass 运行时日志来调试问题。有关更多信息,请参阅 在 Docker 容器之外保留 Greengrass 运行时日志

第 4 步:为 Greengrass 组配置 “No container (无容器)” 容器

当你跑步时Amazon IoT Greengrass在 Docker 容器中,所有 Lambda 函数都必须在不进行容器化的情况下运行。在此步骤中,将组的默认容器化设置为 No container (无容器)。在首次部署组之前,您必须执行此操作。

  1. 在Amazon IoT控制台导航窗格,在Manage,展开Greengrass,然后选择组 (V1).

  2. 选择要更改其设置的组。

  3. 选择Lamba 函数选项卡

  4. UNDER默认 Lambda 函数运行时环境,选择编辑.

  5. 编辑默认 Lambda 函数运行时环境,在Lambda 函数容器化,请更改容器化设置。

  6. 选择Save(保存)。

这些更改将在部署组时生效。

有关更多信息,请参阅 在组中设置Lambda函数的默认容器化

注意

默认情况下,Lambda 函数使用组容器化设置。如果你覆盖无容器在以下情况下为任何 Lambda 函数设置Amazon IoT Greengrass在 Docker 容器中运行,则部署失败。

第 5 步:将 Lambda 函数部署到Amazon IoT GreengrassDocker 容器

您可以将长期存在的 Lambda 函数部署到 Greengrass Docker 容器。

第 6 步:(可选)部署与 Docker 容器中运行的 Greengrass 交互的客户端设备

您还可以部署与... 交互的客户端设备Amazon IoT Greengrass当它在 Docker 容器中运行时。

停止 Amazon IoT Greengrass Docker 容器

要停止 Amazon IoT Greengrass Docker 容器,请在您的终端或命令提示符处按 Ctrl+C。此操作发送SIGTERMGreengrass 守护程序发送 Greengrass 守护程序发送 Greengrass 守护程序启动的所有 Lambda 进程。Docker 容器通过 /dev/init 进程初始化为 PID 1,这有助于删除任何剩余的僵尸进程。有关更多信息,请参阅 Docker 运行参考

对 Docker 容器中的 Amazon IoT Greengrass 执行问题排查

使用以下信息可帮助解决与在 Docker 容器中运行 Amazon IoT Greengrass 相关的问题。

Error: 无法从非 TTY 设备执行交互式登录。

解决方案:运行时,可能会出现此错误aws ecr get-login-password命令。确保您安装了最新的Amazon CLI版本 2 或版本 1。建议使用Amazon CLI版本 2. 有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的安装 Amazon CLI

Error: 未知选项:-no-include-email.

解决方案:运行时,可能会出现此错误aws ecr get-login命令。确保您有最新的Amazon CLI已安装版本(例如,运行:pip install awscli --upgrade --user)。 如果您使用的是 Windows,并且您已使用 MSI 安装程序安装 CLI,则必须重复安装过程。有关更多信息,请参阅 。安装Amazon Command Line Interface在Microsof中的Amazon Command Line Interface用户指南.

警告:IPv4 处于禁用状态。网络将不起作用。

解决方案:在运行时,您可能会收到此警告或类似的消息Amazon IoT Greengrass在 Linux 计算机上。按照此步骤中所述进行操作来启用 IPv4 网络转发。Amazon IoT Greengrass 云部署和 MQTT 通信在未启用 IPv4 转发时将不运行。有关更多信息,请参阅 Docker 文档中的在运行时配置具有命名空间的内核参数 (sysctls)

Error: 防火墙阻止 Windows 和容器之间的文件共享。

解决方案:您可能会收到此错误或Firewall Detected在 Windows 计算机上运行 Docker 时,将出现消息。如果您登录虚拟私有网络 (VPN) 并且网络设置阻止挂载共享驱动器,也会出现此错误。在这种情况下,请关闭 VPN 并重新运行 Docker 容器。

Error: 出现错误 (出现错误AccessDeniedException) 在调用 GetAuthorizationToken operation: User: arn: aws: iam:::: user/ <account-id>is not auth <user-name>orized to perform: ecr:GetAuthorizationToken 在资源上:*

在运行 Nambda 时,您可能会收到此错误aws ecr get-login-password命令,如果您没有足够的权限访问 Amazon ECR 存储库。有关更多信息,请参阅 。Amazon ECR 存储库策略示例访问一个 Amazon ECR 存储库中的Amazon ECR 用户指南.

对于一般 Amazon IoT Greengrass 问题排查帮助,请参阅 排除 Amazon IoT Greengrass 的故障

在 Docker 容器中调试 Amazon IoT Greengrass

要调试 Docker 容器的问题,您可以保留 Greengrass 运行时日志或将交互式 shell 附加到 Docker 容器。

在 Docker 容器之外保留 Greengrass 运行时日志

绑定挂载 /greengrass/ggc/var/log 目录后,您可以运行 Amazon IoT Greengrass Docker 容器。即使容器退出或被删除,日志仍然存在。

在 Linux 或 macOS 上

停止任何在主机上运行的 Greengrass Docker 容器,然后在终端中运行以下命令。这会绑定挂载 Greengrass log 目录并启动 Docker 镜像。

/tmp 替换为您解压证书和配置文件的路径。

docker run --rm --init -it --name aws-iot-greengrass \ --entrypoint /greengrass-entrypoint.sh \ -v /tmp/certs:/greengrass/certs \ -v /tmp/config:/greengrass/config \ -v /tmp/log:/greengrass/ggc/var/log \ -p 8883:8883 \ 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest

然后,您可以在主机上的 /tmp/log 中检查日志,以查看 Greengrass 在 Docker 容器内运行时发生的情况。

在 Windows 上

停止任何在主机上运行的 Greengrass Docker 容器,然后在命令提示符中运行以下命令。这会绑定挂载 Greengrass log 目录并启动 Docker 镜像。

cd C:\Users\%USERNAME%\Downloads mkdir log docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -v c:/Users/%USERNAME%/Downloads/log:/greengrass/ggc/var/log -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest

然后,您可以在主机上的 C:/Users/%USERNAME%/Downloads/log 中检查日志,以查看 Greengrass 在 Docker 容器内运行时发生的情况。

将交互式 Shell 附加到 Docker 容器

您可以将交互式 shell 附加到正在运行的 Amazon IoT Greengrass Docker 容器。这可以帮助您调查 Greengrass Docker 容器的状态。

在 Linux 或 macOS 上

当 Greengrass Docker 容器正在运行时,在单独的终端中运行以下命令。

docker exec -it $(docker ps -a -q -f "name=aws-iot-greengrass") /bin/bash
在 Windows 上

当 Greengrass Docker 容器正在运行时,在单独的命令提示符中运行以下命令。

docker ps -a -q -f "name=aws-iot-greengrass"

Replacegg-container-idcontainer_id来自上一个命令的结果。

docker exec -it gg-container-id /bin/bash