完成了 Docker 容器映像 (Container Image) 的製作,接著我們必須要這個影像布署到各個容器,所以我們要考慮的是如何儲存這個影像。 Amazon Elastic Container Registry (ECR) 是一個全受管的 Docker 容器登錄檔,可讓開發人員存放、管理以及部署 Docker 容器映像,可以讓開發人員不必操作自己的容器儲存庫,也不必擔心如何擴展基礎設施,更重要的是使用 Amazon ECR 沒有預付費用或長期合約,只需為儲存庫中存放的資料量以及傳輸到網際網路的資料支付費用。
在將 Docker 容器映像放入 Amaon ECR 中時,先確認一下容器映像的大小以及執行時所佔用的記憶體
# 查看Container的CPU、記憶體及網路使用
docker stats
# 列出本機映像檔
docker images
由圖中可以看出來整個映像檔佔了 464MB ,這主要的原因是 Dockerfile 裡指定底層的 Bins/Libs 為 amazonlinux:2 以及安裝了 wget/httpd/php 這三個套件,可以選擇用busybox可以讓整個映像檔小一點,另外要考慮的是執行時暫用多少的記憶體,因為底層的 EC2 只有 1G 的記憶體。
圖 01、檢查容器映像的狀態
安裝並設定妥 AWS CLI
因為我們使用的 Amazon EC2 是 Amazon Linux 2 的 AMI ,所以不需再安裝 AWS CLI ,先檢查一下 CLI的版本
[ec2-user@ip-172-16-0-23 ~]$ aws --version
aws-cli/1.18.107 Python/2.7.18 Linux/4.14.193-149.317.amzn2.x86_64 botocore/1.17.31
因為我們需要透過 AWS CLI 將 EC2 內的映像檔上傳到 Amazon ECR ,所以必須讓AWS CLI有權限可以存取 Amazon ECR,這時候必須先讓目前的 AWS 使用者擁有使用AWS CLI的權限,這個權限必須在 Identity and Access Management (IAM)中得到授權。在 IAM 主控台中選擇登入管理主控台的帳號,在安全登入資料頁簽中,確認是否有建立存取金鑰,若有應該就會有一個檔案,通常檔名是 accessKeys.csv ,裡面會有兩個欄位,分別是 Access key ID, Secret access key。
圖 02、透過 AMI 來取得存取金鑰
# 設定 AWS CLI 的存取憑證,需要指定 Access key ID, Secret access key, 所在區域,輸入格式,後面兩項是可選的
aws configure
# 取得Amazon ECR的授權,如果成功會出現 Login Succeeded
(`aws ecr get-login --no-include-email --region ap-southeast-1`)
圖 03、設定 AWS CLI
據說如果是 AWS CLI 2 使用以下語法,有興趣的可以參閱Amazon ECR 登記
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
建立 Amazon ECR 儲存庫
輸入建立 Amazon ECR 儲存庫的語法,標明了儲存庫的名稱以及所在的區域
aws ecr create-repository \
--repository-name ithome-repo \
--image-scanning-configuration scanOnPush=true \
--region ap-southeast-1
成功後會產出儲存庫的說明,以JSON方式輸出, repositoryUri 這個欄位就是下一步要上傳用的目標
{
"repository": {
"repositoryUri": "950646218716.dkr.ecr.ap-southeast-1.amazonaws.com/ithome-repo",
"imageScanningConfiguration": {
"scanOnPush": true
},
"encryptionConfiguration": {
"encryptionType": "AES256"
},
"registryId": "950646218716",
"imageTagMutability": "MUTABLE",
"repositoryArn": "arn:aws:ecr:ap-southeast-1:950646218716:repository/ithome-repo",
"repositoryName": "ithome-repo",
"createdAt": 1600778554.0
}
}
圖 04、使用 AWS CLI 建立儲存庫
其實直接用管理主控台來操作也是可以的,進入 ECS 主控台,特別注意是進入 ECS 主控台, ECR 只是 ECS 的部分功能而已,選擇左邊選單中的 Amazon ECR 下的 Repositories,選擇 Create repository
圖 05、ECS 主控台
你會發現剛剛使用 AWS CLI 的設定都有,的確,有經驗的開發者其時會比較喜歡用 AWS CLI 的方式來操作,因為可以直接存成文件
圖 06、使用主控台建立儲存庫
標記映像並上傳
為 ithome-container 映像標記上一步中的 repositoryUri 值。
docker tag ithome-container 950646218716.dkr.ecr.ap-southeast-1.amazonaws.com/ithome-repo
# 使用先前步驟中的 repositoryUri 值,將映像推送至 Amazon ECR。
docker push 950646218716.dkr.ecr.ap-southeast-1.amazonaws.com/ithome-repo
圖 07、使用AWS CLI 上傳映像至儲存庫
圖 08、ECS 主控台確認映像
確認映像可以正常運作
登入另一台電腦使用的是 Ubuntu 16.04.6 LTS,而非 Amazon Linux 2
# 關閉伺服器的網頁伺服器
sudo /etc/init.d/apache2 stop
# 取得 Amazon ECR 存取權限,可能沒那麼簡單,還得重新設定一次
(`aws ecr get-login --no-include-email --region ap-southeast-1`)
# 下載映像檔
docker pull 950646218716.dkr.ecr.ap-southeast-1.amazonaws.com/ithome-repo:latest
# 標籤映像檔
docker tag 950646218716.dkr.ecr.ap-southeast-1.amazonaws.com/ithome-repo:latest simple-php:latest
# 執行映像檔
docker run -t -i -p 80:80 simple-php:latest
圖 09、映像檔下載
圖 10、映像檔標籤並執行
圖 11、檢視執行結果
References