

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

# 在 Amazon ECR 中移動映像的生命週期
<a name="getting-started-cli"></a>

如果您是第一次使用 Amazon ECR，請使用下列步驟搭配 Docker CLI 和 AWS CLI 來建立範例映像、向預設登錄檔進行身分驗證，以及建立私有儲存庫。然後將映像推送至 ，並從私有儲存庫提取映像。完成範例映像後，請刪除範例映像和儲存庫。

若要使用 AWS 管理主控台 而非 AWS CLI，請參閱 [建立 Amazon ECR 私有儲存庫以存放映像](repository-create.md)。

如需可用於管理 AWS 資源的其他工具的詳細資訊，包括 AWS SDKs、IDE 工具組和 Windows PowerShell 命令列工具，請參閱 https：//[http://aws.amazon.com/tools/](https://aws.amazon.com/tools/)。

## 先決條件
<a name="getting-started-cli-prereqs"></a>

如果您尚未安裝最新的 AWS CLI 和 Docker 並準備好使用，請使用下列步驟來安裝這兩個工具。

### 安裝 AWS CLI
<a name="cli-install"></a>

若要 AWS CLI 搭配 Amazon ECR 使用 ，請安裝 AWS CLI 最新版本。如需詳細資訊，請參閱*《AWS Command Line Interface 使用者指南》*中的[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。

### 安裝 Docker
<a name="cli-install-docker"></a>

Docker 可在多個不同的作業系統上使用，包括大部分的現代 Linux 發行版本，例如 Ubuntu，甚至是 macOS 和 Windows。如需如何在特定作業系統上安裝 Docker 的詳細資訊，請前往「[Docker 安裝指南](https://docs.docker.com/engine/installation/#installation)」。

您不需要本機開發系統，就能使用 Docker。如果您已在使用 Amazon EC2，則可以啟動 Amazon Linux 2023 執行個體，並安裝 Docker 以開始使用。

如果您已經安裝 Docker，請跳到「[步驟 1：建立 Docker 映像](#cli-create-image)」。

**使用 Amazon Linux 2023 AMI 在 Amazon EC2 執行個體上 安裝 Docker**

1. 使用最新版 Amazon Linux 2023 AMI 啟動執行個體。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/launching-instance.html)。

1. 連線到您的執行個體。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[連線至您的 Linux 執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)。

1. 更新已安裝的套裝服務，並在執行個體上封裝快取。

   ```
   sudo yum update -y
   ```

1. 安裝最新的 Docker Community Edition 套裝服務。

   ```
   sudo yum install docker
   ```

1. 啟動 Docker 服務。

   ```
   sudo service docker start
   ```

1. 將 `ec2-user` 新增至 `docker` 群組，讓您可以在不使用 `sudo` 的情況下執行 Docker 命令。

   ```
   sudo usermod -a -G docker ec2-user
   ```

1. 登出並重新登入，以取得新的 `docker` 群組許可。關閉目前的 SSH 終端機視窗，即可完成此操作，並在新的 SSH 終端機視窗中重新連接至執行個體。新的 SSH 工作階段將會有適當的 `docker` 群組許可。

1. 驗證 `ec2-user` 可以在不使用 `sudo` 的情況下執行 Docker 命令。

   ```
   docker info
   ```
**注意**  
在某些情況下，您可能需要重新啟動執行個體，才能提供 `ec2-user` 存取 Docker 常駐程式的許可。如果您看到下列錯誤，請嘗試重新啟動執行個體：  

   ```
   Cannot connect to the Docker daemon. Is the docker daemon running on this host?
   ```

## 步驟 1：建立 Docker 映像
<a name="cli-create-image"></a>

在此步驟中，您將建立簡易 Web 應用程式的 Docker 映像檔，並在本機系統或 Amazon EC2 執行個體上進行測試。

**建立簡單 Web 應用程式的 Docker 映像**

1. 建立稱為 `Dockerfile` 的檔案。Dockerfile 是一種資訊清單，說明用於您 Docker 映像的基本映像，以及您要安裝並在其上執行的項目。如需 Dockerfile 的詳細資訊，請前往「[Dockerfile 參考](https://docs.docker.com/engine/reference/builder/)」。

   ```
   touch Dockerfile
   ```

1. 編輯您剛建立的 `Dockerfile`，並新增下列內容。

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:latest
   
   # Install dependencies
   RUN yum update -y && \
    yum install -y httpd
   
   # Install apache and write hello world message
   RUN echo 'Hello World!' > /var/www/html/index.html
   
   # Configure apache
   RUN echo 'mkdir -p /var/run/httpd' >> /root/run_apache.sh && \
    echo 'mkdir -p /var/lock/httpd' >> /root/run_apache.sh && \
    echo '/usr/sbin/httpd -D FOREGROUND' >> /root/run_apache.sh && \
    chmod 755 /root/run_apache.sh
   
   EXPOSE 80
   
   CMD /root/run_apache.sh
   ```

   該 Dockerfile 使用在 Amazon ECR 公共上託管的 Amazon Linux 2 映像。`RUN` 指令會更新套件快取，並安裝 Web 伺服器的一些軟體套件服務，然後寫入 "Hello World\$1" 內容至 Web 伺服器文件根目錄。`EXPOSE` 指令會公開容器上的連接埠 80，而 `CMD` 指令會啟動 Web 伺服器。

1. <a name="sample-docker-build-step"></a>從 Dockerfile 建置 Docker 映像。
**注意**  
在下列命令中，有些 Docker 版本可能需要 Dockerfile 的完整路徑，而不是下面所示的相對路徑。

   ```
   docker build -t hello-world .
   ```

1. 列出您的容器映像。

   ```
   docker images --filter reference=hello-world
   ```

   輸出：

   ```
   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
   hello-world         latest              e9ffedc8c286        4 minutes ago       194MB
   ```

1. 執行新建置的映像。`-p 80:80` 選項會將容器上的公開連接埠 80 映射至主機系統上的連接埠 80。如需 **docker run** 的詳細資訊，請前往「[Docker run 參考](https://docs.docker.com/engine/reference/run/)」。

   ```
   docker run -t -i -p 80:80 hello-world
   ```
**注意**  
Apache Web 伺服器中的輸出會顯示在終端機視窗中。您可以忽略 "`Could not reliably determine the fully qualified domain name`" 訊息。

1. 開啟瀏覽器，然後指向執行 Docker 並託管容器的伺服器。
   + 如果您使用的是 EC2 執行個體，則這是伺服器的「公有 DNS」****值，這是您使用 SSH 來連線至執行個體的同個地址。請確定您執行個體的安全群組允許連接埠 80 上的入站流量。
   + 如果您在本機執行 Docker，請將瀏覽器指向 [http://localhost/](http://localhost/)。
   + 如果您在 Windows 或 Mac 電腦上使用 **docker-machine**，則請使用 **docker-machine ip** 指令找到託管 Docker 之 VirtualBox VM 的 IP 地址，其中將 *machine-name* 替代為您所使用之 Docker 機器的名稱。

     ```
     docker-machine ip machine-name
     ```

   您應該會看到網頁，內含您的 "Hello World\$1" 陳述式。

1. 輸入 **Ctrl \$1 c**，以停止 Docker 容器。

## 步驟 2：建立儲存庫
<a name="cli-create-repository"></a>

現在您已擁有可推送至 Amazon ECR 的映像，您必須建立儲存庫以存放它。在此範例中，您建立一個稱為 `hello-repository` 的儲存庫，以在稍後推送 `hello-world:latest` 映像。若要建立一個儲存庫，請執行下列命令：

```
aws ecr create-repository \
    --repository-name hello-repository \
    --region region
```

## 步驟 3：向您的預設登錄檔進行身分驗證
<a name="cli-authenticate-registry"></a>

安裝並設定 之後 AWS CLI，請將 Docker CLI 驗證為您的預設登錄檔。**docker** 命令可以透過該方法使用 Amazon ECR 來推送和提取映像。 AWS CLI 提供**get-login-password**命令來簡化身分驗證程序。

若要使用 get-login-password 向 Amazon ECR 登錄檔驗證 Docker，請執行 **aws ecr get-login-password** 命令。將身分驗證字符傳遞給 **docker login** 命令時，使用 `AWS` 的值作為使用者名稱並指定您要驗證的 Amazon ECR 登錄檔 URI。如果是向多個登錄進行驗證，您必須針對每個登錄重複此命令。
**重要**  
若您收到錯誤，請安裝或升級至最新版本的 AWS CLI。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。
+ [get-login-password](https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html) (AWS CLI)

  ```
  aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  ```
+ [Get-ECRLoginCommand](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-ECRLoginCommand.html) (AWS Tools for Windows PowerShell)

  ```
  (Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
  ```

## 步驟 4：將映像推送至 Amazon ECR
<a name="cli-push-image"></a>

現在您可推送映像至您在前一節建立的 Amazon ECR 儲存庫。在符合下列先決條件之後，使用 **docker** CLI 推送映像：
+ **docker** 已安裝 的最低版本：1.7。
+ Amazon ECR 授權字符已使用 設定**docker login**。
+ Amazon ECR 儲存庫存在，且使用者可存取並推送至儲存庫。

在那些必要條件滿足後，您可推送映像至您帳戶預設登錄檔中新建立的儲存庫。

**標記映像並推送映像至 Amazon ECR**

1. 列出您在本機儲存的映像以識別欲標記與推送的映像。

   ```
   docker images
   ```

   輸出：

   ```
   REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
   hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
   ```

1. 標記映像以推送至您的儲存庫。

   ```
   docker tag hello-world:latest aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository
   ```

1. 推送映像。

   ```
   docker push aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:latest
   ```

   輸出：

   ```
   The push refers to a repository [aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository] (len: 1)
   e9ae3c220b23: Pushed
   a6785352b25c: Pushed
   0998bf8fb9e9: Pushed
   0a85502c06c9: Pushed
   latest: digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE size: 6774
   ```

## 步驟 5：從 Amazon ECR 提取映像
<a name="cli-pull-image"></a>

將映像推送至 Amazon ECR 儲存庫後，您可以從其他位置提取映像。在符合下列先決條件之後，使用 **docker** CLI 提取映像：
+ **docker** 已安裝 的最低版本：1.7。
+ Amazon ECR 授權字符已使用 設定**docker login**。
+ Amazon ECR 儲存庫存在，且使用者擁有從儲存庫提取的存取權。

在滿足那些必要條件後，您可提取您的映像。若要從 Amazon ECR 提取您的範例映像，請執行下列命令：

```
docker pull aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository:latest
```

輸出：

```
latest: Pulling from hello-repository
0a85502c06c9: Pull complete
0998bf8fb9e9: Pull complete
a6785352b25c: Pull complete
e9ae3c220b23: Pull complete
Digest: sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636EXAMPLE
Status: Downloaded newer image for aws_account_id.dkr.region.amazonaws.com/hello-repository:latest
```

## 步驟 6：刪除映像
<a name="cli-delete-image"></a>

如果您不再需要其中一個儲存庫中的映像，則可以刪除映像。若要刪除映像，請指定其所在的儲存庫，以及映像的 `imageTag`或 `imageDigest`值。下列範例會刪除儲存`hello-repository`庫中具有映像標籤 的映像`latest`。若要從儲存庫刪除您的範例映像，請執行下列命令：

```
aws ecr batch-delete-image \
      --repository-name hello-repository \
      --image-ids imageTag=latest \
      --region region
```

## 步驟 7：刪除儲存庫
<a name="cli-delete-repository"></a>

如果您不再需要整個映像儲存庫，您可以刪除儲存庫。下列範例使用 `--force`旗標來刪除包含映像的儲存庫。若要刪除包含映像的儲存庫 (以及其中所有的映像)，您可執行以下命令：

```
aws ecr delete-repository \
      --repository-name hello-repository \
      --force \
      --region region
```