

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 執行 Docker 容器
<a name="run-docker-container"></a>

您可以將 AWS IoT Greengrass 元件設定為從存放在下列位置的映像執行 [Docker](https://www.docker.com/) 容器：
+ Amazon Elastic Container Registry (Amazon ECR) 中的公有和私有映像儲存庫
+ 公有 Docker Hub 儲存庫
+ 公有 Docker 信任的登錄檔
+ S3 bucket (S3 儲存貯體)

在您的自訂元件中，包含 Docker 映像 URI 做為擷取映像並在核心裝置上執行的成品。對於 Amazon ECR 和 Docker Hub 映像，您可以使用 [Docker 應用程式管理員](docker-application-manager-component.md)元件來下載映像並管理私有 Amazon ECR 儲存庫的登入資料。

**Topics**
+ [要求](#run-docker-container-requirements)
+ [從 Amazon ECR 或 Docker Hub 中的公有映像執行 Docker 容器](#run-docker-container-public-ecr-dockerhub)
+ [從 Amazon ECR 中的私有映像執行 Docker 容器](#run-docker-container-private-ecr)
+ [從 Amazon S3 中的映像執行 Docker 容器](#run-docker-container-s3)
+ [在 Docker 容器元件中使用程序間通訊](#docker-container-ipc)
+ [在 Docker 容器元件 (Linux) 中使用 AWS 登入資料](#docker-container-token-exchange-service)
+ [在 Docker 容器元件 (Linux) 中使用串流管理員](#docker-container-stream-manager)

## 要求
<a name="run-docker-container-requirements"></a>

若要在元件中執行 Docker 容器，您需要下列項目：
+ Greengrass 核心裝置。如果您沒有帳戶，請參閱 [教學課程：入門 AWS IoT Greengrass V2](getting-started.md)。
+ <a name="docker-engine-requirement"></a>[Docker 引擎](https://docs.docker.com/engine/) 1.9.1 或更新版本安裝在 Greengrass 核心裝置上。20.10 版是經過驗證可與 AWS IoT Greengrass Core 軟體搭配使用的最新版本。您必須先直接在核心裝置上安裝 Docker，才能部署執行 Docker 容器的元件。
**提示**  
您也可以設定核心裝置，以在元件安裝時安裝 Docker Engine。例如，下列安裝指令碼會在載入 Docker 映像之前安裝 Docker 引擎。此安裝指令碼適用於 Debian 型 Linux 發行版本，例如 Ubuntu。如果您設定 元件使用此命令安裝 Docker Engine，您可能需要在生命週期指令碼`true`中`RequiresPrivilege`將 設定為 ，才能執行安裝和`docker`命令。如需詳細資訊，請參閱[AWS IoT Greengrass 元件配方參考](component-recipe-reference.md)。  

  ```
  apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
  ```
+ <a name="docker-user-permissions-requirement"></a>執行 Docker 容器元件的系統使用者必須具有根或管理員許可，或者您必須將 Docker 設定為以非根或非註冊使用者身分執行。
  + 在 Linux 裝置上，您可以將使用者新增至 `docker`群組，在沒有 的情況下呼叫`docker`命令`sudo`。
  + 在 Windows 裝置上，您可以將使用者新增至 `docker-users`群組，以呼叫沒有管理員權限的`docker`命令。

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

  若要將 `ggc_user`或您用來執行 Docker 容器元件的非根使用者新增至 `docker`群組，請執行下列命令。

  ```
  sudo usermod -aG docker ggc_user
  ```

  如需詳細資訊，請參閱[以非根使用者的身分管理 Docker](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)。

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

  若要將 `ggc_user`或您用來執行 Docker 容器元件的使用者新增至 `docker-users`群組，請以管理員身分執行下列命令。

  ```
  net localgroup docker-users ggc_user /add
  ```

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

  若要將 `ggc_user`或您用來執行 Docker 容器元件的使用者新增至 `docker-users`群組，請以管理員身分執行下列命令。

  ```
  Add-LocalGroupMember -Group docker-users -Member ggc_user
  ```

------
+ Docker 容器元件存取的檔案會[掛載為 Docker 容器中的磁碟](https://docs.docker.com/storage/volumes/)區。
+ <a name="docker-proxy-requirement"></a>如果您[將 AWS IoT Greengrass Core 軟體設定為使用網路代理](configure-greengrass-core-v2.md#configure-alpn-network-proxy)，則必須[將 Docker 設定為使用相同的代理伺服器](https://docs.docker.com/network/proxy/)。

除了這些要求之外，如果適用於您的環境，您還必須符合下列要求：
+ 若要使用 [Docker Compose](https://docs.docker.com/compose/) 建立和啟動 Docker 容器，請在 Greengrass 核心裝置上安裝 Docker Compose，並將 Docker Compose 檔案上傳至 S3 儲存貯體。您必須將 Compose 檔案存放在與 元件相同的 S3 AWS 帳戶 AWS 區域 儲存貯體中。如需在自訂元件中使用 `docker-compose up`命令的範例，請參閱 [從 Amazon ECR 或 Docker Hub 中的公有映像執行 Docker 容器](#run-docker-container-public-ecr-dockerhub)。
+ 如果您在網路代理 AWS IoT Greengrass 後方執行 ，請將 Docker 協助程式設定為使用[代理伺服器](https://docs.docker.com/network/proxy/)。
+ 如果您的 Docker 映像存放在 Amazon ECR 或 Docker Hub 中，請在 [Docker 容器元件中包含 Docker 元件管理員](docker-application-manager-component.md)元件做為相依性。您必須先在核心裝置上啟動 Docker 協助程式，才能部署元件。

  此外，請包含影像 URIs做為元件成品。映像 URIs 的格式必須`docker:registry/image[:tag|@digest]`如下列範例所示：<a name="docker-image-artifact-uri"></a>
  + 私有 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 容器的詳細資訊，請參閱 [從 Amazon ECR 或 Docker Hub 中的公有映像執行 Docker 容器](#run-docker-container-public-ecr-dockerhub)。
+ 如果您的 Docker 映像存放在 Amazon ECR 私有儲存庫中，則必須在 Docker 容器元件中包含字符交換服務元件做為相依性。此外，[Greengrass 裝置角色](device-service-role.md)必須允許 `ecr:GetAuthorizationToken`、 `ecr:BatchGetImage`和 `ecr:GetDownloadUrlForLayer`動作，如下列範例 IAM 政策所示。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": [
          "ecr:GetAuthorizationToken",
          "ecr:BatchGetImage",
          "ecr:GetDownloadUrlForLayer"
        ],
        "Resource": [
          "*"
        ],
        "Effect": "Allow"
      }
    ]
  }
  ```

------

  如需有關從存放在 Amazon ECR 私有儲存庫中的映像執行 Docker 容器的資訊，請參閱 [從 Amazon ECR 中的私有映像執行 Docker 容器](#run-docker-container-private-ecr)。
+ 若要使用存放在 Amazon ECR 私有儲存庫中的 Docker 映像，私有儲存庫必須與核心裝置 AWS 區域 位於相同的 中。
+ 如果您的 Docker 映像或 Compose 檔案存放在 S3 儲存貯體中，[Greengrass 裝置角色](device-service-role.md)必須允許 `s3:GetObject`許可，以允許核心裝置將映像下載為元件成品，如下列範例 IAM 政策所示。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": [
          "s3:GetObject"
        ],
        "Resource": [
          "*"
        ],
        "Effect": "Allow"
      }
    ]
  }
  ```

------

  如需有關從存放在 Amazon S3 中的映像執行 Docker 容器的資訊，請參閱 [從 Amazon S3 中的映像執行 Docker 容器](#run-docker-container-s3)。
+ <a name="docker-greengrass-features-requirements"></a>若要在 Docker 容器元件中使用程序間通訊 (IPC) AWS 、登入資料或串流管理員，您必須在執行 Docker 容器時指定其他選項。如需詳細資訊，請參閱下列內容：<a name="docker-greengrass-features-requirements-links"></a>
  + [在 Docker 容器元件中使用程序間通訊](#docker-container-ipc)
  + [在 Docker 容器元件 (Linux) 中使用 AWS 登入資料](#docker-container-token-exchange-service)
  + [在 Docker 容器元件 (Linux) 中使用串流管理員](#docker-container-stream-manager)

## 從 Amazon ECR 或 Docker Hub 中的公有映像執行 Docker 容器
<a name="run-docker-container-public-ecr-dockerhub"></a>

本節說明如何建立使用 Docker Compose 從 Amazon ECR 和 Docker Hub 存放的 Docker 映像檔執行 Docker 容器的自訂元件。

**使用 Docker Compose 執行 Docker 容器**

1. 建立 Docker Compose 檔案並將其上傳至 Amazon S3 儲存貯體。確定 [Greengrass 裝置角色](device-service-role.md)允許 `s3:GetObject` 許可，讓裝置存取 Compose 檔案。以下範例中顯示的 Compose 檔案範例包括來自 Amazon ECR 的 Amazon CloudWatch Agent 映像和來自 Docker Hub 的 MySQL 映像。

   ```
   version: "3"
   services:
     cloudwatchagent:
       image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
     mysql:
       image: "mysql:8.0"
   ```

1. 在 AWS IoT Greengrass 核心裝置上[建立自訂元件](create-components.md)。下列範例中顯示的範例配方具有下列屬性：
   + Docker 應用程式管理員元件做為相依性。此元件可讓 從公 AWS IoT Greengrass 有 Amazon ECR 和 Docker Hub 儲存庫下載映像。
   + 元件成品，指定公有 Amazon ECR 儲存庫中的 Docker 映像。
   + 元件成品，指定公有 Docker Hub 儲存庫中的 Docker 映像。
   + 元件成品，指定 Docker Compose 檔案，其中包含您要執行之 Docker 映像的容器。
   + 生命週期執行指令碼，使用 [docker-compose up](https://docs.docker.com/compose/reference/up/) 從指定的映像建立和啟動容器。

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyDockerComposeComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.",
     "ComponentPublisher": "Amazon",
     "ComponentDependencies": {
       "aws.greengrass.DockerApplicationManager": {
         "VersionRequirement": "~2.0.0"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "all"
         },
         "Lifecycle": {
           "Run": "docker-compose -f {artifacts:path}/docker-compose.yaml up"
         },
         "Artifacts": [
           {
             "URI": "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
           },
           {
             "URI": "docker:mysql:8.0"
           },
           {
             "URI": "s3://amzn-s3-demo-bucket/folder/docker-compose.yaml"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyDockerComposeComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.'
   ComponentPublisher: Amazon
   ComponentDependencies:
     aws.greengrass.DockerApplicationManager:
       VersionRequirement: ~2.0.0
   Manifests:
     - Platform:
         os: all
       Lifecycle:
           Run: docker-compose -f {artifacts:path}/docker-compose.yaml up
       Artifacts:
         - URI: "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"
         - URI: "docker:mysql:8.0"
         - URI: "s3://amzn-s3-demo-bucket/folder/docker-compose.yaml"
   ```

------
**注意**  
<a name="docker-greengrass-features-requirements"></a>若要在 Docker 容器元件中使用程序間通訊 (IPC) AWS 、登入資料或串流管理員，您必須在執行 Docker 容器時指定其他選項。如需詳細資訊，請參閱下列內容：  
[在 Docker 容器元件中使用程序間通訊](#docker-container-ipc)
[在 Docker 容器元件 (Linux) 中使用 AWS 登入資料](#docker-container-token-exchange-service)
[在 Docker 容器元件 (Linux) 中使用串流管理員](#docker-container-stream-manager)

1. [測試元件](test-components.md)以驗證其是否如預期般運作。
**重要**  
您必須先安裝和啟動 Docker 協助程式，才能部署元件。

   在本機部署元件之後，您可以執行 [Docker 容器 ls](https://docs.docker.com/engine/reference/commandline/container_ls/) 命令，以驗證您的容器是否執行。

   ```
   docker container ls
   ```

1. 當元件就緒時，將元件上傳至 AWS IoT Greengrass 以部署至其他核心裝置。如需詳細資訊，請參閱[發佈元件以部署到您的核心裝置](publish-components.md)。

## 從 Amazon ECR 中的私有映像執行 Docker 容器
<a name="run-docker-container-private-ecr"></a>

本節說明如何建立自訂元件，從存放在 Amazon ECR 中私有儲存庫中的 Docker 映像執行 Docker 容器。

**執行 Docker 容器**

1. 在 AWS IoT Greengrass 核心裝置上[建立自訂元件](create-components.md)。使用下列範例配方，其具有下列屬性：
   + Docker 應用程式管理員元件做為相依性。此元件 AWS IoT Greengrass 可讓 管理登入資料，以從私有儲存庫下載映像。
   + 做為相依性的字符交換服務元件。此元件可讓 AWS IoT Greengrass 擷取 AWS 登入資料以與 Amazon ECR 互動。
   + 元件成品，指定私有 Amazon ECR 儲存庫中的 Docker 映像。
   + 生命週期執行指令碼，使用 [docker run](https://docs.docker.com/engine/reference/commandline/run/) 從映像建立和啟動容器。

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyPrivateDockerComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that runs a Docker container from a private Amazon ECR image.",
     "ComponentPublisher": "Amazon",
     "ComponentDependencies": {
       "aws.greengrass.DockerApplicationManager": {
         "VersionRequirement": "~2.0.0"
       },
       "aws.greengrass.TokenExchangeService": {
         "VersionRequirement": "~2.0.0"
       }
     },
     "Manifests": [
       {
         "Platform": {
           "os": "all"
         },
         "Lifecycle": {
           "Run": "docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
         },
         "Artifacts": [
           {
             "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyPrivateDockerComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that runs a Docker container from a private Amazon ECR image.'
   ComponentPublisher: Amazon
   ComponentDependencies:
     aws.greengrass.DockerApplicationManager:
       VersionRequirement: ~2.0.0
     aws.greengrass.TokenExchangeService:
       VersionRequirement: ~2.0.0
   Manifests:
     - Platform:
         os: all
       Lifecycle:
           Run: docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]
       Artifacts:
         - URI: "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
   ```

------
**注意**  
<a name="docker-greengrass-features-requirements"></a>若要在 Docker 容器元件中使用程序間通訊 (IPC) AWS 、登入資料或串流管理員，您必須在執行 Docker 容器時指定其他選項。如需詳細資訊，請參閱下列內容：  
[在 Docker 容器元件中使用程序間通訊](#docker-container-ipc)
[在 Docker 容器元件 (Linux) 中使用 AWS 登入資料](#docker-container-token-exchange-service)
[在 Docker 容器元件 (Linux) 中使用串流管理員](#docker-container-stream-manager)

1. [測試元件](test-components.md)以驗證其是否如預期般運作。
**重要**  
您必須先安裝和啟動 Docker 協助程式，才能部署元件。

   在本機部署元件之後，您可以執行 [Docker 容器 ls](https://docs.docker.com/engine/reference/commandline/container_ls/) 命令，以驗證您的容器是否執行。

   ```
   docker container ls
   ```

1. 將元件上傳至 AWS IoT Greengrass 以部署至其他核心裝置。如需詳細資訊，請參閱[發佈元件以部署到您的核心裝置](publish-components.md)。

## 從 Amazon S3 中的映像執行 Docker 容器
<a name="run-docker-container-s3"></a>

本節說明如何從存放在 Amazon S3 的 Docker 映像在元件中執行 Docker 容器。

**從 Amazon S3 中的映像在元件中執行 Docker 容器**

1. 執行 [docker save](https://docs.docker.com/engine/reference/commandline/save/) 命令來建立 Docker 容器的備份。您提供此備份做為執行容器的元件成品 AWS IoT Greengrass。將 *hello-world* 取代為映像名稱，並將 *hello-world.tar* 取代為要建立的封存檔案名稱。

   ```
   docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
   ```

1. 在 AWS IoT Greengrass 核心裝置上[建立自訂元件](create-components.md)。使用下列範例配方，其具有下列屬性：
   + 使用 [Docker 載入](https://docs.docker.com/engine/reference/commandline/load/)從封存載入 Docker 映像的生命週期安裝指令碼。
   + 生命週期執行指令碼，使用 [docker run](https://docs.docker.com/engine/reference/commandline/run/) 從映像建立和啟動容器。`--rm` 選項會在容器結束時清除容器。

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyS3DockerComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.",
     "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.MyS3DockerComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.'
   ComponentPublisher: Amazon
   Manifests:
     - Platform:
         os: linux
       Lifecycle:
         install:
           Script: docker load -i {artifacts:path}/hello-world.tar
         Run:
           Script: docker run --rm hello-world
   ```

------
**注意**  
<a name="docker-greengrass-features-requirements"></a>若要在 Docker 容器元件中使用程序間通訊 (IPC) AWS 、登入資料或串流管理員，您必須在執行 Docker 容器時指定其他選項。如需詳細資訊，請參閱下列內容：  
[在 Docker 容器元件中使用程序間通訊](#docker-container-ipc)
[在 Docker 容器元件 (Linux) 中使用 AWS 登入資料](#docker-container-token-exchange-service)
[在 Docker 容器元件 (Linux) 中使用串流管理員](#docker-container-stream-manager)

1. [測試元件](test-components.md)以驗證其是否如預期般運作。

   在本機部署元件之後，您可以執行 [Docker 容器 ls](https://docs.docker.com/engine/reference/commandline/container_ls/) 命令，以驗證您的容器是否執行。

   ```
   docker container ls
   ```

1. 當元件就緒時，將 Docker 映像封存上傳至 S3 儲存貯體，並將其 URI 新增至元件配方。然後，您可以將元件上傳到 AWS IoT Greengrass 以部署到其他核心裝置。如需詳細資訊，請參閱[發佈元件以部署到您的核心裝置](publish-components.md)。

   完成後，元件配方應如下所示。

------
#### [ JSON ]

   ```
   {
     "RecipeFormatVersion": "2020-01-25",
     "ComponentName": "com.example.MyS3DockerComponent",
     "ComponentVersion": "1.0.0",
     "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.",
     "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://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar"
           }
         ]
       }
     ]
   }
   ```

------
#### [ YAML ]

   ```
   ---
   RecipeFormatVersion: '2020-01-25'
   ComponentName: com.example.MyS3DockerComponent
   ComponentVersion: '1.0.0'
   ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.'
   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://amzn-s3-demo-bucket/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
   ```

------

## 在 Docker 容器元件中使用程序間通訊
<a name="docker-container-ipc"></a>

您可以使用 中的 Greengrass 處理程序間通訊 (IPC) 程式庫 AWS IoT Device SDK 或 AWS IoT Greengrass 元件 SDK 來與 Greengrass 核、其他 Greengrass 元件和 進行通訊 AWS IoT Core。如需詳細資訊，請參閱[使用 AWS IoT Device SDK 與 Greengrass 核、其他元件和 通訊 AWS IoT Core與 Greengrass 核、其他元件和 通訊 AWS IoT Core](interprocess-communication.md)。

若要在 Docker 容器元件中使用 IPC，您必須使用下列參數執行 Docker 容器：
+ 在容器中掛載 IPC 通訊端。Greengrass 核提供`AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT`環境變數中的 IPC 通訊端檔案路徑。
+ 將 `SVCUID`和 `AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT`環境變數設定為 Greengrass 核提供給元件的值。您的元件使用這些環境變數來驗證與 Greengrass 核的連線。

**Example 範例配方：發佈 MQTT 訊息至 AWS IoT Core (Python)**  
下列配方定義發佈 MQTT 訊息的 Docker 容器元件範例 AWS IoT Core。此配方具有下列屬性：  
+ 允許元件在所有主題 AWS IoT Core 上發佈 MQTT 訊息至 的授權政策 (`accessControl`)。如需詳細資訊，請參閱 [授權元件執行 IPC 操作](interprocess-communication.md#ipc-authorization-policies)和 [AWS IoT Core MQTT IPC 授權](ipc-iot-core-mqtt.md#ipc-iot-core-mqtt-authorization)。
+ 元件成品，指定 Docker 影像做為 Amazon S3 中的 TAR 封存。
+ 生命週期安裝指令碼，可從 TAR 封存檔載入 Docker 映像。
+ 從映像執行 Docker 容器的生命週期執行指令碼。[Docker run](https://docs.docker.com/engine/reference/run/) 命令具有下列引數：
  + `-v` 引數會將 Greengrass IPC 通訊端掛載在容器中。
  + 前兩個`-e`引數會在 Docker 容器中設定所需的環境變數。
  + 其他`-e`引數會設定此範例所使用的環境變數。
  + `--rm` 引數會在容器結束時清除容器。

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.python.docker.PublishToIoTCore",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Uses interprocess communication to publish an MQTT message to IoT Core.",
  "ComponentPublisher": "Amazon",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "topic": "test/topic/java",
      "message": "Hello, World!",
      "qos": "1",
      "accessControl": {
        "aws.greengrass.ipc.mqttproxy": {
          "com.example.python.docker.PublishToIoTCore:pubsub:1": {
            "policyDescription": "Allows access to publish to IoT Core on all topics.",
            "operations": [
              "aws.greengrass#PublishToIoTCore"
            ],
            "resources": [
              "*"
            ]
          }
        }
      }
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "all"
      },
      "Lifecycle": {
        "install": "docker load -i {artifacts:path}/publish-to-iot-core.tar",
        "Run": "docker run -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e MQTT_TOPIC=\"{configuration:/topic}\" -e MQTT_MESSAGE=\"{configuration:/message}\" -e MQTT_QOS=\"{configuration:/qos}\" --rm publish-to-iot-core"
      },
      "Artifacts": [
        {
          "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar"
        }
      ]
    }
  ]
}
```

```
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.python.docker.PublishToIoTCore
ComponentVersion: 1.0.0
ComponentDescription: Uses interprocess communication to publish an MQTT message to IoT Core.
ComponentPublisher: Amazon
ComponentConfiguration:
  DefaultConfiguration:
    topic: 'test/topic/java'
    message: 'Hello, World!'
    qos: '1'
    accessControl:
      aws.greengrass.ipc.mqttproxy:
        'com.example.python.docker.PublishToIoTCore:pubsub:1':
          policyDescription: Allows access to publish to IoT Core on all topics.
          operations:
            - 'aws.greengrass#PublishToIoTCore'
          resources:
            - '*'
Manifests:
  - Platform:
      os: all
    Lifecycle:
      install: 'docker load -i {artifacts:path}/publish-to-iot-core.tar'
      Run: |
        docker run \
          -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \
          -e SVCUID \
          -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \
          -e MQTT_TOPIC="{configuration:/topic}" \
          -e MQTT_MESSAGE="{configuration:/message}" \
          -e MQTT_QOS="{configuration:/qos}" \
          --rm publish-to-iot-core
    Artifacts:
      - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar
```

## 在 Docker 容器元件 (Linux) 中使用 AWS 登入資料
<a name="docker-container-token-exchange-service"></a>

您可以使用[字符交換服務元件](token-exchange-service-component.md)與 Greengrass 元件中的 AWS 服務互動。此元件會使用本機容器伺服器，從核心裝置的[字符交換角色](device-service-role.md)提供 AWS 登入資料。如需詳細資訊，請參閱[與 AWS 服務互動](interact-with-aws-services.md)。

**注意**  
本節中的範例僅適用於 Linux 核心裝置。

若要在 Docker 容器元件中使用字符交換服務的 AWS 憑證，您必須使用下列參數執行 Docker 容器：
+ 使用 `--network=host`引數提供主機網路的存取權。此選項可讓 Docker 容器連線至本機字符交換服務，以擷取 AWS 憑證。此引數僅適用於 Docker for Linux。
**警告**  <a name="docker-network-host-security-warning"></a>
此選項可讓容器存取主機上的所有本機網路介面，因此此選項比沒有主機網路存取權的情況下執行 Docker 容器更不安全。當您開發和執行使用此選項的 Docker 容器元件時，請考慮這一點。如需詳細資訊，請參閱 *Docker 文件*中的[網路：主機](https://docs.docker.com/engine/reference/run/#network-host)。
+ 將 `AWS_CONTAINER_CREDENTIALS_FULL_URI`和 `AWS_CONTAINER_AUTHORIZATION_TOKEN`環境變數設定為 Greengrass 核提供給 components 的值。 AWS SDKs使用這些環境變數來擷取 AWS 登入資料。

**Example 範例配方：列出 Docker 容器元件中的 S3 儲存貯體 (Python)**  
下列配方會定義範例 Docker 容器元件，列出 中的 S3 儲存貯體 AWS 帳戶。此配方具有下列屬性：  
+ 做為相依性的字符交換服務元件。此相依性可讓 元件擷取 AWS 登入資料，以與其他 AWS 服務互動。
+ 元件成品，指定 Docker 影像做為 Amazon S3 中的 tar 封存。
+ 生命週期安裝指令碼，可從 TAR 封存檔載入 Docker 映像。
+ 從映像執行 Docker 容器的生命週期執行指令碼。[Docker run](https://docs.docker.com/engine/reference/run/) 命令具有下列引數：
  + `--network=host` 引數提供容器對主機網路的存取權，讓容器可以連線至字符交換服務。
  + `-e` 引數會在 Docker 容器中設定所需的環境變數。
  + `--rm` 引數會在容器結束時清除容器。

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.python.docker.ListS3Buckets",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Uses the token exchange service to lists your S3 buckets.",
  "ComponentPublisher": "Amazon",
  "ComponentDependencies": {
    "aws.greengrass.TokenExchangeService": {
      "VersionRequirement": "^2.0.0",
      "DependencyType": "HARD"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "docker load -i {artifacts:path}/list-s3-buckets.tar",
        "Run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI --rm list-s3-buckets"
      },
      "Artifacts": [
        {
          "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar"
        }
      ]
    }
  ]
}
```

```
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.python.docker.ListS3Buckets
ComponentVersion: 1.0.0
ComponentDescription: Uses the token exchange service to lists your S3 buckets.
ComponentPublisher: Amazon
ComponentDependencies:
  aws.greengrass.TokenExchangeService:
    VersionRequirement: ^2.0.0
    DependencyType: HARD
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      install: 'docker load -i {artifacts:path}/list-s3-buckets.tar'
      Run: |
        docker run \
          --network=host \
          -e AWS_CONTAINER_AUTHORIZATION_TOKEN \
          -e AWS_CONTAINER_CREDENTIALS_FULL_URI \
          --rm list-s3-buckets
    Artifacts:
      - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar
```

## 在 Docker 容器元件 (Linux) 中使用串流管理員
<a name="docker-container-stream-manager"></a>

您可以使用[串流管理員元件](stream-manager-component.md)來管理 Greengrass 元件中的資料串流。此元件可讓您處理資料串流並將大量 IoT 資料傳輸到 AWS 雲端。 AWS IoT Greengrass 提供串流管理員 SDK，讓您用來與串流管理員元件互動。如需詳細資訊，請參閱[管理 Greengrass 核心裝置上的資料串流](manage-data-streams.md)。

**注意**  
本節中的範例僅適用於 Linux 核心裝置。

若要在 Docker 容器元件中使用串流管理員 SDK，您必須使用下列參數執行 Docker 容器：
+ 使用 `--network=host`引數提供主機網路的存取權。此選項可讓 Docker 容器透過本機 TLS 連線與串流管理員元件互動。此引數僅適用於適用於 Linux 的 Docker
**警告**  <a name="docker-network-host-security-warning"></a>
此選項可讓容器存取主機上的所有本機網路介面，因此此選項比沒有主機網路存取權的情況下執行 Docker 容器更不安全。當您開發和執行使用此選項的 Docker 容器元件時，請考慮這一點。如需詳細資訊，請參閱 *Docker 文件*中的[網路：主機](https://docs.docker.com/engine/reference/run/#network-host)。
+ 如果您將串流管理員元件設定為需要身分驗證，這是預設行為，請將`AWS_CONTAINER_CREDENTIALS_FULL_URI`環境變數設定為 Greengrass 核提供給元件的值。如需詳細資訊，請參閱[串流管理員組態](stream-manager-component.md#stream-manager-component-configuration)。
+ 如果您將串流管理員元件設定為使用非預設連接埠，請使用[程序間通訊 (IPC)](interprocess-communication.md) 從串流管理員元件組態取得連接埠。您必須使用其他選項來執行 Docker 容器，才能使用 IPC。如需詳細資訊，請參閱下列內容：
  + [連線至應用程式程式碼中的串流管理員](use-stream-manager-in-custom-components.md#connect-to-stream-manager)
  + [在 Docker 容器元件中使用程序間通訊](#docker-container-ipc)

**Example 範例配方：將檔案串流到 Docker 容器元件 (Python) 中的 S3 儲存貯體**  
下列配方定義範例 Docker 容器元件，可建立檔案並將其串流至 S3 儲存貯體。此配方具有下列屬性：  
+ 串流管理員元件做為相依性。此相依性可讓元件使用串流管理員 SDK 與串流管理員元件互動。
+ 元件成品，指定 Docker 影像做為 Amazon S3 中的 TAR 封存。
+ 生命週期安裝指令碼，可從 TAR 封存檔載入 Docker 映像。
+ 從映像執行 Docker 容器的生命週期執行指令碼。[Docker run](https://docs.docker.com/engine/reference/run/) 命令具有下列引數：
  + `--network=host` 引數提供容器對主機網路的存取權，讓容器可以連線至串流管理員元件。
  + 第一個`-e`引數會在 Docker 容器中設定所需的`AWS_CONTAINER_AUTHORIZATION_TOKEN`環境變數。
  + 其他`-e`引數會設定此範例所使用的環境變數。
  + `-v` 引數會將元件[的工作資料夾](component-recipe-reference.md#component-recipe-work-path)掛載在容器中。此範例會在工作資料夾中建立 檔案，以使用串流管理員將該檔案上傳至 Amazon S3。
  + `--rm` 引數會在容器結束時清除容器。

```
{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.python.docker.StreamFileToS3",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "Creates a text file and uses stream manager to stream the file to S3.",
  "ComponentPublisher": "Amazon",
  "ComponentDependencies": {
    "aws.greengrass.StreamManager": {
      "VersionRequirement": "^2.0.0",
      "DependencyType": "HARD"
    }
  },
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "bucketName": ""
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "install": "docker load -i {artifacts:path}/stream-file-to-s3.tar",
        "Run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e BUCKET_NAME=\"{configuration:/bucketName}\" -e WORK_PATH=\"{work:path}\" -v {work:path}:{work:path} --rm stream-file-to-s3"
      },
      "Artifacts": [
        {
          "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar"
        }
      ]
    }
  ]
}
```

```
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.python.docker.StreamFileToS3
ComponentVersion: 1.0.0
ComponentDescription: Creates a text file and uses stream manager to stream the file to S3.
ComponentPublisher: Amazon
ComponentDependencies:
  aws.greengrass.StreamManager:
    VersionRequirement: ^2.0.0
    DependencyType: HARD
ComponentConfiguration:
  DefaultConfiguration:
    bucketName: ''
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      install: 'docker load -i {artifacts:path}/stream-file-to-s3.tar'
      Run: |
        docker run \
          --network=host \
          -e AWS_CONTAINER_AUTHORIZATION_TOKEN \
          -e BUCKET_NAME="{configuration:/bucketName}" \
          -e WORK_PATH="{work:path}" \
          -v {work:path}:{work:path} \
          --rm stream-file-to-s3
    Artifacts:
      - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar
```