完成了 Docker 容器映像 (Container Image) 的制作,接着我们必须要这个影像布署到各个容器,所以我们要考虑的是如何储存这个影像。 Amazon Elastic Container Registry (ECR) 是一个全受管的 Docker 容器登录档,可让开发人员存放、管理以及部署 Docker 容器映像,可以让开发人员不必操作自己的容器储存库,也不必担心如何扩展基础设施,更重要的是使用 Amazon ECR 没有预付费用或长期合约,只需为储存库中存放的数据量以及传输到因特网的数据支付费用。
在将 Docker 容器映像放入 Amaon ECR 中时,先确认一下容器映像的大小以及执行时所占用的内存
# 查看 Container 的 CPU、内存及网络使用 docker stats # 列出本机映像档 docker images 1234
由图中可以看出来整个映像档占了 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 12
因为我们需要透过 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`) 1234
图 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 1234
成功后会产出储存库的说明,以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 } } 12345678910111213141516
图 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 123
图 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 12345678910
图 09. 映像档下载
图 10. 映像文件标签并执行
图 11. 检视执行结果
References