

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

# AWS IoT Greengrass 在 Docker 容器中运行，手动配置资源
<a name="run-greengrass-docker-manual-provisioning"></a>

本教程向您展示如何使用手动配置的资源在 Docker 容器中安装和运行 C AWS IoT Greengrass ore 软件。 AWS 

**Topics**
+ [

## 先决条件
](#docker-manual-provisioning-prereqs)
+ [

## 检索 AWS IoT 端点
](#retrieve-iot-endpoints)
+ [

## 创建 AWS IoT 事物
](#create-iot-thing)
+ [

## 创建事物证书
](#create-thing-certificate-mp)
+ [

## 创建令牌交换角色
](#create-token-exchange-role)
+ [

## 将证书下载到设备
](#download-thing-certificates)
+ [

## 创建配置文件
](#create-docker-install-configuration-file)
+ [

## 创建环境文件
](#create-env-file-manual-provisioning)
+ [

## 在容器中运行 AWS IoT Greengrass Core 软件
](#run-greengrass-image-manual-provisioning)
+ [

## 后续步骤
](#run-greengrass-docker-next-steps)

## 先决条件
<a name="docker-manual-provisioning-prereqs"></a>

要完成本教程，您需要：
+ 一个 AWS 账户。如果没有，请参阅[设置一个 AWS 账户](setting-up.md#set-up-aws-account)。
+ 一张 AWS IoT Greengrass Docker 镜像。你可以[从 AWS IoT Greengrass Dockerfile 中生成镜像](build-greengrass-dockerfile.md)。
+ 运行 Docker 容器的主机必须满足以下要求：
  + <a name="docker-host-reqs"></a>支持互联网连接的基于 Linux 的操作系统。
  + <a name="docker-engine-reqs"></a>[Docker Engine](https://docs.docker.com/engine/install/) 18.09 版本或更高版本。
  + <a name="docker-compose-reqs"></a>（可选）[Docker Compose](https://docs.docker.com/compose/install/) 1.22 版本或更高版本。只有当您想使用 Docker Compose CLI 来运行 Docker 映像时，才需要 Docker Compose。

## 检索 AWS IoT 端点
<a name="retrieve-iot-endpoints"></a>

获取您的终 AWS IoT 端节点 AWS 账户，然后将其保存以备后用。您的设备使用这些端点来连接 AWS IoT。执行以下操作：

1. 获取您的 AWS IoT 数据端点 AWS 账户。

   ```
   aws iot describe-endpoint --endpoint-type iot:Data-ATS
   ```

   如果请求成功，响应类似如下示例。

   ```
   {
     "endpointAddress": "device-data-prefix-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. 获取您的 AWS IoT 凭证终端节点 AWS 账户。

   ```
   aws iot describe-endpoint --endpoint-type iot:CredentialProvider
   ```

   如果请求成功，响应类似如下示例。

   ```
   {
     "endpointAddress": "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com"
   }
   ```

## 创建 AWS IoT 事物
<a name="create-iot-thing"></a>

AWS IoT *事物*代表连接到的设备和逻辑实体 AWS IoT。Greengrass 的核心设备就是东西。 AWS IoT 当您将设备注册为 AWS IoT 事物时，该设备可以使用数字证书进行身份验证 AWS。

在本节中，您将创建一个代表您的设备的 AWS IoT 东西。

**创建 AWS IoT 事物**

1. 为你的设备创建 AWS IoT 一件东西。在开发计算机上运行以下命令。
   + *MyGreengrassCore*替换为要使用的事物名称。此名称也是您 Greengrass 核心设备的名称。
**注意**  <a name="install-argument-thing-name-constraint"></a>
事物名称不得包含英文冒号 (`:`) 字符。

   ```
   aws iot create-thing --thing-name MyGreengrassCore
   ```

   如果请求成功，响应类似如下示例。

   ```
   {
     "thingName": "MyGreengrassCore",
     "thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore",
     "thingId": "8cb4b6cd-268e-495d-b5b9-1713d71dbf42"
   }
   ```

1. （可选）将 AWS IoT 事物添加到新的或现有的事物组。您可以使用事物组来管理 Greengrass 核心设备实例集。将软件组件部署到设备时，可以以单个设备或设备组为目标。您可以将设备添加到有活动 Greengrass 部署的事物组，以将该事物组的软件组件部署到该设备。执行以下操作：

   1. （可选）创建 AWS IoT 事物组。
      + *MyGreengrassCoreGroup*替换为要创建的事物组的名称。
**注意**  <a name="install-argument-thing-group-name-constraint"></a>
事物组名称不得包含英文冒号 (`:`) 字符。

      ```
      aws iot create-thing-group --thing-group-name MyGreengrassCoreGroup
      ```

      如果请求成功，响应类似如下示例。

      ```
      {
        "thingGroupName": "MyGreengrassCoreGroup",
        "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/MyGreengrassCoreGroup",
        "thingGroupId": "4df721e1-ff9f-4f97-92dd-02db4e3f03aa"
      }
      ```

   1. 将 AWS IoT 事物添加到事物组。
      + *MyGreengrassCore*用你的 AWS IoT 东西的名字替换。
      + *MyGreengrassCoreGroup*替换为事物组的名称。

      ```
      aws iot add-thing-to-thing-group --thing-name MyGreengrassCore --thing-group-name MyGreengrassCoreGroup
      ```

      如果请求成功，则该命令没有任何输出。

## 创建事物证书
<a name="create-thing-certificate-mp"></a>

<a name="create-thing-certificate-intro-1"></a>当您将设备注册为 AWS IoT 事物时，该设备可以使用数字证书进行身份验证 AWS。此证书允许设备与 AWS IoT 和通信 AWS IoT Greengrass。

<a name="create-thing-certificate-intro-2"></a>在本节中，您将创建和下载可供您的设备连接 AWS的证书。<a name="create-thing-certificate-cloud-steps"></a>

**创建事物证书**

1. 创建一个文件夹，用于下载 AWS IoT 事物的证书。

   ```
   mkdir greengrass-v2-certs
   ```

1. 为该 AWS IoT 事物创建并下载证书。

   ```
   aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile greengrass-v2-certs/device.pem.crt --public-key-outfile greengrass-v2-certs/public.pem.key --private-key-outfile greengrass-v2-certs/private.pem.key
   ```

   如果请求成功，响应类似如下示例。

   ```
   {
     "certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4",
     "certificateId": "aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4",
     "certificatePem": "-----BEGIN CERTIFICATE-----
   MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w
    0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZ
    WF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIw
    EAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5
    jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBh
    MCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBb
    WF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMx
    HzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQE
    BBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVI
    k60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQ
    ITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nr
    AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auN
    KyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6Guo
    EDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw
    3rrszlaEXAMPLE=
   -----END CERTIFICATE-----",
     "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\
   MIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\
   MMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\
   59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\
   hJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\
   FQIDAQAB\
   -----END PUBLIC KEY-----\
   ",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\
   key omitted for security reasons\
   -----END RSA PRIVATE KEY-----\
   "
     }
   }
   ```

   保存证书的 Amazon 资源名称（ARN），以便稍后用于配置证书。

接下来，配置事物证书。有关更多信息，请参阅 [配置事物证书](manual-installation.md#configure-thing-certificate)。

## 创建令牌交换角色
<a name="create-token-exchange-role"></a>

<a name="installation-create-token-exchange-role-intro"></a>Greengrass 核心设备使用 IAM 服务角色（称为*令牌交换角色）来授权对*服务的调用。 AWS 设备使用 AWS IoT 证书提供程序来获取此角色的临时 AWS 证书，从而允许设备与 Amazon Logs 进行交互 AWS IoT、向 Amazon Logs 发送 CloudWatch 日志以及从 Amazon S3 下载自定义组件项目。有关更多信息，请参阅 [授权核心设备与 AWS 服务交互](device-service-role.md)。

<a name="installation-create-token-exchange-role-alias-intro"></a>您可以使用 AWS IoT *角色别名*为 Greengrass 核心设备配置令牌交换角色。角色别名允许您更改设备的令牌交换角色，但设备配置保持不变。有关更多信息，请参阅《AWS IoT Core 开发人员指南》**中的[授权直接调用 AWS 服务](https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html)。

在本节中，您将创建令牌交换 IAM 角色和指向该 AWS IoT 角色的角色别名。如果您已经设置了 Greengrass 核心设备，则可以使用其令牌交换角色和角色别名，而不必新建。然后，您将设备的 AWS IoT 事物配置为使用该角色和别名。

**创建令牌交换 IAM 角色**

1. <a name="create-token-exchange-role-create-iam-role"></a>创建设备可将其用作令牌交换角色的 IAM 角色。执行以下操作：

   1. 创建包含令牌交换角色所需的信任策略文档的文件。

      <a name="nano-command-intro"></a>例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 创建该文件。

      ```
      nano device-role-trust-policy.json
      ```

      将以下 JSON 复制到该文件中。

      ```
      {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "credentials.iot.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      ```

   1. 通过信任策略文档创建令牌交换角色。
      + *GreengrassV2TokenExchangeRole*替换为要创建的 IAM 角色的名称。

      ```
      aws iam create-role --role-name GreengrassV2TokenExchangeRole --assume-role-policy-document file://device-role-trust-policy.json
      ```

      如果请求成功，响应类似如下示例。

      ```
      {
        "Role": {
          "Path": "/",
          "RoleName": "GreengrassV2TokenExchangeRole",
          "RoleId": "AROAZ2YMUHYHK5OKM77FB",
          "Arn": "arn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole",
          "CreateDate": "2021-02-06T00:13:29+00:00",
          "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",		 	 	 
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Service": "credentials.iot.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
              }
            ]
          }
        }
      ```

   1. 创建一个包含令牌交换角色所需的访问策略文档的文件。

      <a name="nano-command-intro"></a>例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 创建该文件。

      ```
      nano device-role-access-policy.json
      ```

      将以下 JSON 复制到该文件中。

      ```
      {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents",
              "logs:DescribeLogStreams",
              "s3:GetBucketLocation"
            ],
            "Resource": "*"
          }
        ]
      }
      ```
**注意**  
此访问策略不允许访问 S3 存储桶中的组件构件。要在 Amazon S3 中部署可定义构件的自定义组件，您必须为该角色添加权限以允许核心设备检索组件构件。有关更多信息，请参阅 [允许访问 S3 存储桶中的组件构件](device-service-role.md#device-service-role-access-s3-bucket)。  
如果您还没有适用于组件构件的 S3 存储桶，则可以在创建存储桶后添加这些权限。

   1. 通过策略文档创建 IAM 策略
      + *GreengrassV2TokenExchangeRoleAccess*替换为要创建的 IAM 策略的名称。

      ```
      aws iam create-policy --policy-name GreengrassV2TokenExchangeRoleAccess --policy-document file://device-role-access-policy.json
      ```

      如果请求成功，响应类似如下示例。

      ```
      {
        "Policy": {
          "PolicyName": "GreengrassV2TokenExchangeRoleAccess",
          "PolicyId": "ANPAZ2YMUHYHACI7C5Z66",
          "Arn": "arn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess",
          "Path": "/",
          "DefaultVersionId": "v1",
          "AttachmentCount": 0,
          "PermissionsBoundaryUsageCount": 0,
          "IsAttachable": true,
          "CreateDate": "2021-02-06T00:37:17+00:00",
          "UpdateDate": "2021-02-06T00:37:17+00:00"
        }
      }
      ```

   1. 将 IAM 策略附加到令牌交换角色。
      + 将 *GreengrassV2TokenExchangeRole* 替换为 IAM 角色的名称。
      + 将策略 ARN 替换为您在上一步中创建的 IAM 策略的 ARN。

      ```
      aws iam attach-role-policy --role-name GreengrassV2TokenExchangeRole --policy-arn arn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess
      ```

      如果请求成功，则该命令没有任何输出。

1. <a name="create-token-exchange-role-create-iot-role-alias"></a>创建 AWS IoT 指向代币交换角色的角色别名。
   + *GreengrassCoreTokenExchangeRoleAlias*替换为要创建的角色别名的名称。
   + 将角色 ARN 替换为您在上一步中创建的 IAM 角色的 ARN。

   ```
   aws iot create-role-alias --role-alias GreengrassCoreTokenExchangeRoleAlias --role-arn arn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole
   ```

   如果请求成功，响应类似如下示例。

   ```
   {
     "roleAlias": "GreengrassCoreTokenExchangeRoleAlias",
     "roleAliasArn": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias"
   }
   ```
**注意**  
要创建角色别名，您必须有权将令牌交换 IAM 角色传递到 AWS IoT。如果您在尝试创建角色别名时收到错误消息，请检查您的 AWS 用户是否具有此权限。有关更多信息，请参阅[《用户*指南》中的授予AWS Identity and Access Management 用户*向 AWS 服务传递角色的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

1. 创建并附加 AWS IoT 允许您的 Greengrass 核心设备使用角色别名担任令牌交换角色的策略。如果您之前设置过 Greengrass 核心设备，则可以附加其角色 AWS IoT 别名策略，而不必创建新的角色别名策略。执行以下操作：

   1. （可选）创建一个包含角色别名所需的 AWS IoT 策略文档的文件。

      <a name="nano-command-intro"></a>例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 创建该文件。

      ```
      nano greengrass-v2-iot-role-alias-policy.json
      ```

      将以下 JSON 复制到该文件中。
      + 将资源 ARN 替换为您角色别名的 ARN。

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "iot:AssumeRoleWithCertificate",
            "Resource": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias"
          }
        ]
      }
      ```

   1. 根据 AWS IoT 策略文档创建策略。
      + *GreengrassCoreTokenExchangeRoleAliasPolicy*替换为要创建的 AWS IoT 策略的名称。

      ```
      aws iot create-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --policy-document file://greengrass-v2-iot-role-alias-policy.json
      ```

      如果请求成功，响应类似如下示例。

      ```
      {
        "policyName": "GreengrassCoreTokenExchangeRoleAliasPolicy",
        "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassCoreTokenExchangeRoleAliasPolicy",
        "policyDocument": "{
          \\"Version\\":\\"2012-10-17		 	 	 \\",
          \\"Statement\\": [
            {
              \\"Effect\\": \\"Allow\\",
              \\"Action\\": \\"iot:AssumeRoleWithCertificate\\",
              \\"Resource\\": \\"arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias\\"
            }
          ]
        }",
        "policyVersionId": "1"
      }
      ```

   1. 将 AWS IoT 策略附加到 AWS IoT 事物的证书上。
      + *GreengrassCoreTokenExchangeRoleAliasPolicy*替换为角色别名 AWS IoT 策略的名称。
      + 将目标 ARN 替换为您的 AWS IoT 事物证书的 ARN。

      ```
      aws iot attach-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --target arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4
      ```

      如果请求成功，则该命令没有任何输出。

## 将证书下载到设备
<a name="download-thing-certificates"></a>

之前，您已将设备的证书下载到开发计算机上。在本节中，您可以下载 Amazon 根证书颁发机构（CA）证书。然后，如果您计划在 Docker 中与开发计算机不同的计算机上运行 C AWS IoT Greengrass ore 软件，则可以将证书复制到该主机。C AWS IoT Greengrass ore 软件使用这些证书连接到 AWS IoT 云服务。

**将证书下载到设备**

1. 在您的开发计算机上，下载 Amazon 根证书颁发机构 (CA) 证书。 AWS IoT 默认情况下，证书与亚马逊的根 CA 证书相关联。

------
#### [ Linux or Unix ]

   ```
   sudo curl -o ./greengrass-v2-certs/AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

------
#### [ Windows Command Prompt (CMD) ]

   ```
   curl -o .\greengrass-v2-certs\AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

------
#### [ PowerShell ]

   ```
   iwr -Uri https://www.amazontrust.com/repository/AmazonRootCA1.pem -OutFile .\greengrass-v2-certs\AmazonRootCA1.pem
   ```

------

1. 如果您计划在 Docker 中与开发计算机不同的设备上运行 C AWS IoT Greengrass ore 软件，请将证书复制到主机。如果在开发计算机和主机上启用了 SSH 和 SCP，则可以在开发计算机上使用 `scp` 命令来传输证书。*device-ip-address*替换为主机的 IP 地址。

   ```
   scp -r greengrass-v2-certs/ device-ip-address:~
   ```

## 创建配置文件
<a name="create-docker-install-configuration-file"></a>

1. 在主机上，创建一个用于存放配置文件的文件夹。

   ```
   mkdir ./greengrass-v2-config
   ```

1. 使用文本编辑器在 `./greengrass-v2-config` 文件夹中创建名为 `config.yaml` 的配置文件。

   例如，您可以运行以下命令来使用 GNU nano 创建 `config.yaml`。

   ```
   nano ./greengrass-v2-config/config.yaml
   ```

1. 将以下 YAML 内容复制到该文件中。此部分配置文件会指定系统参数和 Greengrass Nucleus 参数。

   ```
   ---
   system:
     certificateFilePath: "/tmp/certs/device.pem.crt"
     privateKeyPath: "/tmp/certs/private.pem.key"
     rootCaPath: "/tmp/certs/AmazonRootCA1.pem"
     rootpath: "/greengrass/v2"
     thingName: "MyGreengrassCore"
   services:
     aws.greengrass.Nucleus:
       componentType: "NUCLEUS"
       version: "nucleus-version"
       configuration:
         awsRegion: "region"
         iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias"
         iotDataEndpoint: "device-data-prefix-ats.iot.region.amazonaws.com"
         iotCredEndpoint: "device-credentials-prefix.credentials.region.amazonaws.com"
   ```

   然后，替换以下值：
   + */tmp/certs*。 Docker 容器中的目录，您在启动容器时将下载的证书挂载到该目录。
   + `/greengrass/v2`。要用于安装的 Greengrass 根文件夹。您可以使用 `GGC_ROOT` 环境变量来设置此值。
   + *MyGreengrassCore*。 AWS IoT 事物的名字。
   + *nucleus-version*。 要安装的 AWS IoT Greengrass Core 软件的版本。此值必须与您下载的 Docker 映像或 Dockerfile 的版本匹配。如果您下载了带有 `latest` 标签的 Greengrass Docker 映像，请使用 ****docker inspect *image-id***** 查看映像版本。
   + *region*。 您创建 AWS IoT 资源 AWS 区域 的位置。您还必须在[环境文件](#create-env-file-manual-provisioning)中为 `AWS_REGION` 环境变量指定相同的值。
   + *GreengrassCoreTokenExchangeRoleAlias*。 代币交换角色别名。
   + *device-data-prefix*。 您的 AWS IoT 数据端点的前缀。
   + *device-credentials-prefix*。 您的 AWS IoT 凭证端点的前缀。

## 创建环境文件
<a name="create-env-file-manual-provisioning"></a>

本教程使用环境文件来设置环境变量，这些变量将传递给 Docker 容器内的 C AWS IoT Greengrass ore 软件安装程序。您还可以在 `docker run` 命令中使用 [`-e` 或 `--env` 参数](https://docs.docker.com/engine/reference/commandline/run/#env)在 Docker 容器中设置环境变量，或在 `docker-compose.yml` 文件中的 [`environment` 块](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment)中设置变量。

1. 使用文本编辑器创建名为 `.env` 的环境文件。

   例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 在当前目录中创建 `.env`。

   ```
   nano .env
   ```

1. 将以下内容复制到该文件中。

   ```
   GGC_ROOT_PATH=/greengrass/v2
   AWS_REGION=region
   PROVISION=false
   COMPONENT_DEFAULT_USER=ggc_user:ggc_group
   INIT_CONFIG=/tmp/config/config.yaml
   ```

   然后，替换以下值。
   + `/greengrass/v2`。 用于安装 C AWS IoT Greengrass ore 软件的根文件夹的路径。
   + *region*。 您创建 AWS IoT 资源 AWS 区域 的位置。您必须在[配置文件](#create-docker-install-configuration-file)中为 `awsRegion` 配置参数指定相同的值。
   + */tmp/config/*。 启动 Docker 容器时用于挂载配置文件的文件夹。
**注意**  <a name="docker-local-dev-tools-production-environment-warning"></a>
您可以将 `DEPLOY_DEV_TOOLS` 环境变量设置为 `true`，以部署 [Greengrass CLI 组件](greengrass-cli-component.md)，进而在 Docker 容器内开发自定义组件。<a name="local-dev-tools-production-environment-warning"></a>我们建议您仅在开发环境中使用此组件，不要在生产环境中使用。此组件允许访问您在生产环境中通常不需要的信息和操作。遵循最低权限原则，将此组件仅部署到有需求的核心设备。

## 在容器中运行 AWS IoT Greengrass Core 软件
<a name="run-greengrass-image-manual-provisioning"></a>

本教程向您展示了如何启动在 Docker 容器中构建的 Docker 映像。你可以使用 Docker CLI 或 Docker Compose CLI 在 Docker AWS IoT Greengrass 容器中运行核心软件镜像。

------
#### [ Docker ]
+ 本教程向您展示了如何启动在 Docker 容器中构建的 Docker 映像。

  ```
  docker run --rm --init -it --name docker-image \
   -v path/to/greengrass-v2-config:/tmp/config/:ro \
   -v path/to/greengrass-v2-certs:/tmp/certs:ro \ 
   --env-file .env \
   -p 8883 \
   your-container-image:version
  ```

  此示例命令为 [docker run](https://docs.docker.com/engine/reference/commandline/run/) 使用以下参数：
  + <a name="docker-run-rm"></a>[https://docs.docker.com/engine/reference/run/#clean-up---rm](https://docs.docker.com/engine/reference/run/#clean-up---rm)。当容器退出时，清理容器。
  + <a name="docker-run-init"></a>[https://docs.docker.com/engine/reference/run/#specify-an-init-process](https://docs.docker.com/engine/reference/run/#specify-an-init-process)。在容器中使用 init 进程。
**注意**  
当你停止 Docker 容器时，需要使用该`--init`参数才能关闭 C AWS IoT Greengrass ore 软件。
  + <a name="docker-run-it"></a>[https://docs.docker.com/engine/reference/run/#foreground](https://docs.docker.com/engine/reference/run/#foreground)。（可选）作为交互式进程在前台运行 Docker 容器。您可以将此项替换为 `-d` 参数，以在分离模式下运行 Docker 容器。有关更多信息，请参阅 Docker 文档中的[分离模式与前台模式](https://docs.docker.com/engine/reference/run/#detached-vs-foreground)。
  + <a name="docker-run-name"></a>[https://docs.docker.com/engine/reference/run/#name---name](https://docs.docker.com/engine/reference/run/#name---name)。运行名为 `aws-iot-greengrass` 的容器 
  + <a name="docker-run-v"></a>[https://docs.docker.com/storage/volumes/](https://docs.docker.com/storage/volumes/)。 将卷挂载到 Docker 容器中，使配置文件和证书文件可供在容器内 AWS IoT Greengrass 运行。
  + <a name="docker-run-env-file"></a>[https://docs.docker.com/engine/reference/commandline/run/#env](https://docs.docker.com/engine/reference/commandline/run/#env)。 （可选）指定环境文件以设置将传递给 Docker 容器内的 C AWS IoT Greengrass ore 软件安装程序的环境变量。只有在创建[环境文件](#create-env-file-manual-provisioning)来设置环境变量时，才需要此参数。如果您没有创建环境文件，则可以直接在 Docker run 命令中使用 `--env` 参数设置环境变量。
  + <a name="docker-run-p"></a>[https://docs.docker.com/engine/reference/commandline/run/#publish](https://docs.docker.com/engine/reference/commandline/run/#publish)。（可选）将 8883 容器端口发布到主机。如果您想通过 MQTT 进行连接和通信，需要使用此参数，因为 AWS IoT Greengrass 将端口 8883 用于 MQTT 流量。要打开其它端口，请使用其它 `-p` 参数。
**注意**  <a name="docker-run-cap-drop"></a>
要以更高的安全性运行 Docker 容器，您可以使用 `--cap-drop` 和 `--cap-add` 参数选择性地为容器启用 Linux 功能。有关更多信息，请参阅 Docker 文档中的[运行时权限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)。

------
#### [ Docker Compose ]

1. 使用文本编辑器创建名为 `docker-compose.yml` 的 Docker Compose 文件。

   例如，在基于 Linux 的系统上，您可以运行以下命令来使用 GNU nano 在当前目录中创建 `docker-compose.yml`。

   ```
   nano docker-compose.yml
   ```
**注意**  
您也可以从中下载和使用 AWS提供的 Compose 文件的最新版本。[GitHub](https://github.com/aws-greengrass/aws-greengrass-docker/releases/)

1. 将以下内容添加到 Compose 文件。您的文件应类似于以下示例。*your-container-name:version*替换为你的 Docker 镜像的名称。

   ```
   version: '3.7'
    
   services:
     greengrass:
       init: true
       build:
         context: .
       container_name: aws-iot-greengrass
       image: your-container-name:version
       volumes:
         - /path/to/greengrass-v2-config:/tmp/config/:ro
         - /path/to/greengrass-v2-certs:/tmp/certs:ro 
       env_file: .env
       ports:
         - "8883:8883"
   ```<a name="docker-compose-optional-params"></a>

   此示例 Compose 文件中的以下参数是可选的：
   + `ports` – 将 8883 容器端口发布到主机。如果您想通过 MQTT 进行连接和通信，则需要使用此参数，因为 MQTT 流量 AWS IoT Greengrass 使用端口 8883。
   + `env_file`— 指定环境文件以设置将传递给 Docker 容器内的 C AWS IoT Greengrass ore 软件安装程序的环境变量。只有在创建[环境文件](#create-env-file-manual-provisioning)来设置环境变量时，才需要该参数。如果您没有创建环境文件，则可以使用[环境](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment)参数直接在 Compose 文件中设置变量。
**注意**  <a name="docker-compose-cap-drop"></a>
要以更高的安全性运行 Docker 容器，您可以使用 Compose 文件中的 `cap_drop` 和 `cap_add` 选择性地为容器启用 Linux 功能。有关更多信息，请参阅 Docker 文档中的[运行时权限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)。

1. 运行以下命令来启动容器。

   ```
   docker-compose -f docker-compose.yml up
   ```

------

## 后续步骤
<a name="run-greengrass-docker-next-steps"></a>

<a name="run-greengrass-docker-success"></a>AWS IoT Greengrass 核心软件现在在 Docker 容器中运行。运行以下命令以检索当前运行容器的容器 ID。

```
docker ps
```

然后，您可以运行以下命令来访问容器并浏览容器内运行的 AWS IoT Greengrass Core 软件。

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

有关创建简单组件的信息，请参阅[教程：AWS IoT Greengrass V2 入门](getting-started.md)中的[第 4 步：在设备上开发和测试组件](create-first-component.md)。

**注意**  <a name="run-greengrass-commands-in-docker-note"></a>
当您使用 `docker exec` 在 Docker 容器内运行命令时，这些命令不会记录在 Docker 日志中。要将命令记录在 Docker 日志中，请将交互式 Shell 附加到 Docker 容器。有关更多信息，请参阅 [将交互式 Shell 附加到 Docker 容器](docker-troubleshooting.md#debugging-docker-attach-shell)。

C AWS IoT Greengrass ore 日志文件被调用`greengrass.log`，位于中`/greengrass/v2/logs`。组件日志文件也位于同一目录中。要将 Greengrass 日志复制到主机上的临时目录，请运行以下命令：

```
docker cp container-id:/greengrass/v2/logs /tmp/logs
```

如果您想在容器退出或移除后保留日志，我们建议您仅将 `/greengrass/v2/logs` 目录绑定挂载到主机上的临时日志目录，而不是挂载整个 Greengrass 目录。有关更多信息，请参阅 [在 Docker 容器之外保留 Greengrass 日志](docker-troubleshooting.md#debugging-docker-persist-logs)。

<a name="greengrass-docker-stop"></a>要停止正在运行的 AWS IoT Greengrass Docker 容器，请运行`docker stop`或`docker-compose -f docker-compose.yml stop`。此操作可将 `SIGTERM` 发送到 Greengrass 进程，并关闭容器中启动的所有关联进程。Docker 容器通过 `docker-init` 可执行文件初始化为进程 PID 1，这有助于移除任何剩余的僵尸进程。有关更多信息，请参阅 Docker 文档中的[指定 init 进程](https://docs.docker.com/engine/reference/run/#specify-an-init-process)。

<a name="see-docker-troubleshooting"></a>有关对在 Docker 容器中运行 AWS IoT Greengrass 的问题进行排查的信息，请参阅[在 Docker AWS IoT Greengrass 容器中进行故障排除](docker-troubleshooting.md)。