將 Amazon ECR 與 AWS CLI 搭配使用 - Amazon ECR

將 Amazon ECR 與 AWS CLI 搭配使用

下列步驟會引導您在第一次使用 Docker CLI 和 AWS CLI 時完成將容器映像推送到私有 Amazon ECR 儲存庫。

如需其他 AWS 資源管理工具的詳細資訊,包括不同的 AWS 開發套件、IDE 工具組和 Windows PowerShell 命令列工具,請參閱 http://aws.amazon.com/tools/

先決條件

開始之前,請務必先完成「使用 Amazon ECR 進行設定」中的步驟。

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

安裝 AWS CLI

您可以使用 AWS 命令列工具在系統的命令列發出命令,以執行 Amazon ECR 和其他 AWS 任務。與使用主控台相較,此方法更快速也更便利。命令列工具對建立執行 AWS 任務的指令碼也非常實用。

若要與 AWS CLI 搭配使用 Amazon ECR,請安裝最新 AWS CLI 版本 (Amazon ECR 功能可於 AWS CLI 中使用,以 1.9.15 版本開始)。您可以使用 aws --version 命令來檢查您的 AWS CLI 版本。如需安裝 AWS CLI 或將其升級至最新版本的資訊,請參閱《AWS Command Line Interface 使用者指南》中的安裝 AWS Command Line Interface

安裝 Docker

Docker 可在多個不同的作業系統上使用,包括大部分的現代 Linux 發行版本,例如 Ubuntu,甚至是 macOS 和 Windows。如需如何在特定作業系統上安裝 Docker 的詳細資訊,請前往「Docker 安裝指南」。

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

如果您已經安裝 Docker,請跳到「步驟 1:建立 Docker 映像」。

在 Amazon EC2 執行個體上安裝 Docker

  1. 使用 Amazon Linux 2 AMI 啟動執行個體。如需詳細資訊,請參閱《Amazon EC2 Linux 執行個體使用者指南》中的啟動執行個體

  2. 連線到您的執行個體。如需詳細資訊,請參閱《Amazon EC2 Linux 執行個體使用者指南》中的連線至您的 Linux 執行個體

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

    sudo yum update -y
  4. 安裝最新的 Docker Community Edition 套裝服務。

    sudo amazon-linux-extras install docker
  5. 啟動 Docker 服務。

    sudo service docker start
  6. ec2-user 新增至 docker 群組,讓您可以在不使用 sudo 的情況下執行 Docker 命令。

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

  8. 驗證 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 映像

在本節中,您將建立簡單 Web 應用程式的 Docker 映像,並在本機系統或 EC2 執行個體上進行測試,然後將映像推送至容器登錄檔 (例如 Amazon ECR 或 Docker Hub),讓您可以在 ECS 任務定義中使用。

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

  1. 建立稱為 Dockerfile 的檔案。Dockerfile 是一種資訊清單,說明用於您 Docker 映像的基本映像,以及您要安裝並在其上執行的項目。如需 Dockerfile 的詳細資訊,請前往「Dockerfile 參考」。

    touch Dockerfile
  2. 編輯您剛建立的 Dockerfile,並新增下列內容。

    FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh

    此 Dockerfile 使用 Ubuntu 18.04 映像。RUN 指令會更新套件服務快取,並安裝 Web 伺服器的一些軟體套件服務,然後寫入 "Hello World!" 內容至 Web 伺服器的文件根目錄。EXPOSE 指令會公開容器上的連接埠 80,而 CMD 指令會啟動 Web 伺服器。

  3. 從 Dockerfile 建置 Docker 映像。

    注意

    在下列命令中,有些 Docker 版本可能需要 Dockerfile 的完整路徑,而不是下面所示的相對路徑。

    docker build -t hello-world .
  4. 執行 docker images,驗證映像已正確建立。

    docker images --filter reference=hello-world

    輸出:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    hello-world         latest              e9ffedc8c286        4 minutes ago       241MB
  5. 執行新建置的映像。-p 80:80 選項會將容器上的公開連接埠 80 映射至主機系統上的連接埠 80。如需 docker run 的詳細資訊,請前往「Docker run 參考」。

    docker run -t -i -p 80:80 hello-world
    注意

    Apache Web 伺服器中的輸出會顯示在終端機視窗中。您可以忽略 "Could not reliably determine the server's fully qualified domain name" 訊息。

  6. 開啟瀏覽器,然後指向執行 Docker 並託管容器的伺服器。

    • 如果您使用的是 EC2 執行個體,則這是伺服器的「公有 DNS」值,這是您使用 SSH 來連線至執行個體的同個地址。請確定您執行個體的安全群組允許連接埠 80 上的入站流量。

    • 如果您在本機執行 Docker,請將瀏覽器指向 http://localhost/

    • 如果您在 Windows 或 macOS 電腦上使用 docker-machine,則請使用 docker-machine ip 指令找到託管 Docker 之 VirtualBox VM 的 IP 地址,其中將 machine-name 替代為您所使用之 Docker 機器的名稱。

      docker-machine ip machine-name

    您應該會看到網頁,內含您的 "Hello World!" 陳述式。

  7. 輸入 Ctrl + c,以停止 Docker 容器。

步驟 2:驗證至您的預設登錄檔

在您安裝並設定好 AWS CLI 後,您可驗證 Docker CLI 對您的預設登錄檔的存取。docker 命令可以透過該方法使用 Amazon ECR 來推送和提取映像。AWS CLI 提供一個 get-login-password 命令以簡化身分驗證程序。

使用 AWS CLI 時,get-login-password 是驗證 Amazon ECR 私有登錄的首選方式。確定您已將 AWS CLI 設定為與 AWS 互動。如需詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的 AWS CLI組態基礎概念

將 Amazon ECR 授權字符傳遞給 docker login 命令時,使用 AWS 的值做為使用者名稱並指定您要驗證的 Amazon ECR 登錄 URI。如果是向多個登錄進行驗證,您必須針對每個登錄重複此命令。

重要

如果收到錯誤或無法使用 get-login-password 命令,請確認您已使用最新版本的 AWS CLI。如需安裝或升級至最新版本 AWS CLI 的詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的安裝 AWS Command Line Interface

  • get-login-password (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 (AWS Tools for Windows PowerShell)

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

步驟 3:建立一個儲存庫

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

aws ecr create-repository \ --repository-name hello-world \ --image-scanning-configuration scanOnPush=true \ --region region

步驟 4:將映像推送至 Amazon ECR

現在您可推送映像至您在前一節建立的 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
  2. 標記映像以推送至您的儲存庫。

    docker tag hello-world:latest aws_account_id.dkr.ecr.region.amazonaws.com/hello-world:latest
  3. 推送映像。

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

    輸出:

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

步驟 5:從 Amazon ECR 提取映像

在您的映像推送至 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-world:latest

輸出:

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

步驟 6:刪除映像

如果您決定不再需要其中一個儲存庫中的映像,您可以使用 batch-delete-image 命令將它刪除。若要刪除映像,您必須指定其所在的儲存庫,以及該映像的 imageTagimageDigest 值。以下範例透過映像標籤 latest 中的 hello-world 儲存庫刪除映像。

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

輸出:

{
    "failures": [],
    "imageIds": [
        {
            "imageTag": "latest",
            "imageDigest": "sha256:215d7e4121b30157d8839e81c4e0912606fca105775bb0636b95aed25f52c89b"
        }
    ]
}

步驟 7:刪除儲存庫

如果您決定不再需要儲存庫中的全部映像,您可以刪除該儲存庫。依預設,您不能刪除包含映像的儲存庫;然而,--force 旗標則容許其發生。若要刪除包含映像的儲存庫 (以及其中所有的映像),您可執行以下命令。

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