发布Docker镜像到AWS ECR Docker Repository并更新版本

文本使用一台Amazon Linux EC2云服务器,在Linux环境上,创建一个hello world的docker程序,并且发布到AWS ECR镜像仓库。在开发者本地的Mac或者Linux创建docker的过程大同小异,仅供参考。

1、配置docker准备环境

创建一台EC2节点,使用Amazon Linux 2操作系统,选择较小规格如t2.small即可。

2、安装docker,以root身份执行如下命令:

yum update -y
amazon-linux-extras install docker
service docker start
usermod -a -G docker ec2-user

3、下载docker源

首先安装git程序,并下载docker对应的代码文件。下载后进入目录,可以看到里边包含一系列源文件。

yum install -y git
git clone https://github.com/awslabs/ecs-demo-php-simple-app

下文中的docker配置有一个暴露端口的配置。为了适应在AWS中国区域没有ICP备案的环境无法暴露80端口的要求,以及 443,8080,5900等一系列端口也是被屏蔽的, 因此在测试场景的话,建议docker内还是发布80端口。中转办法是通过ALB负载均衡器映射为非80端口。例如ALB负载均衡器的Listener监听在公网上的50001端口,然后转发规则转发到后端的target group,group内的容器都暴露内网IP地址80端口。测试即可通过。

FROM amazonlinux:2

# Install dependencies
RUN yum install -y \
    curl \
    httpd \
    php \
 && ln -s /usr/sbin/httpd /usr/sbin/apache2

# Install app
RUN rm -rf /var/www/html/* && mkdir -p /var/www/html
ADD src /var/www/html

# Configure apache
RUN chown -R apache:apache /var/www
ENV APACHE_RUN_USER apache
ENV APACHE_RUN_GROUP apache
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D",  "FOREGROUND"]

4、配置AWS CLI认证

这里需要在本机上安装AWS CLI并配置好access key,同时具有操作ECR的权限。

5、在ECS的图形界面上创建ECR仓库

这一步可以通过CLI操作,也可以通过Console图形界面操作。

操作完成后,复制下来仓库地址,即上图中红色部分。

6、通过AWS CLI完成对ECR镜像仓库的身份验证。

在刚才编辑Dockerfile的机器上,执行如下命令。

$(aws ecr get-login --no-include-email --region cn-northwest-1)

操作成功后应显示登陆成功,如下图。

7、在本地创建并编译docker生成image

上传到AWS的ECR之前,需要在本地先创建并编译docker生成image。执行如下命令。

docker build -t phpdocker .

操作完成后,执行docker images可以看到刚才创建的image。

8、对要上传的镜像打tag

执行如下命令。其中的的URI需要替换为前文的ECR镜像仓库的地址。

docker tag phpdocker:latest 420029960748.dkr.ecr.cn-northwest-1.amazonaws.com.cn/phpdocker:latest

9、将image push到ECR上

执行如下命令。 其中的的URI需要替换为前文的ECR镜像仓库的地址。

docker push 420029960748.dkr.ecr.cn-northwest-1.amazonaws.com.cn/phpdocker:latest

上传成功可以看到提示。

在Console界面上,查看ECR就已经可以看到image了。

10、检查镜像的安全隐患

在上传镜像完成后,可以在容器镜像仓库里边看到,镜像存在安全缺陷。如下图。

点击详情进入后,发现安全漏洞是因为组件不是最新版本造成的。如下截图。

为此需要更新镜像到最新版本。

11、修改镜像Dockerfile进行升级

登录到刚才build docker的EC2上,编辑上文用到的Dockerfile文件,找到“Install dependencies”一段,在开头加入如下一行:

RUN yum update -y

保存退出。

执行如下命令重新build镜像。

docker build -t phpdocker:2 .

这里的命令比第一次build时候增加了 :2 ,表示第二个版本tag。build成功后如下图。

执行docker images命令,可以看到当前EC2环境上,镜像已经新版本已经编译完成。

12、上传新版本到AWS ECR 容器镜像仓库

与前文介绍过的顺序一样,分别执行登录、打tag的操作,最后是push。执行如下命令:

$(aws ecr get-login --no-include-email --region cn-northwest-1)
docker tag phpdocker:2 420029960748.dkr.ecr.cn-northwest-1.amazonaws.com.cn/phpdocker:2
docker push 420029960748.dkr.ecr.cn-northwest-1.amazonaws.com.cn/phpdocker:2

注意以上命令的版本tag需要替换为 :2 。执行后效果如下。

此时从控制台上,访问ECR,查看镜像仓库,可以看到新上传的版本已经被识别出来,且通过了安全扫描,没有漏洞。

全文完。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.