通过使用多阶段构建应用以及结合阿里云容器镜像服务(ACR)的镜像构建服务,可以使Java应用具有构建安全、构建速度快、镜像文件体积小等优点。
前提条件
开通阿里云容器镜像服务。
请准备一个托管在Github、Gitlab或者Bitbucket平台上的Java源代码仓库。
说明您可以拷贝并托管位于Github上的一个简单的Java Maven项目来体验整个流程。
背景信息
镜像构建的通用问题
镜像构建服务使用Dockerfile来帮助用户构建最终镜像,但在具体实践中,存在一些问题:
Dockerfile编写有门槛
开发者(尤其是Java)习惯了语言框架的编译便利性,不知道如何使用Dockerfile构建应用镜像。
镜像容易臃肿
构建镜像时,开发者会将项目的编译、测试、打包构建流程编写在一个Dockerfile中。每条Dockerfile指令都会为镜像添加一个新的镜像层,从而导致镜像层次深,镜像文件体积特别大。
存在源码泄露风险
打包镜像时,源代码容易被打包到镜像中,从而产生源代码泄漏的风险。
多阶段构建优势
针对Java这类的编译型语言,使用Dockerfile多阶段构建,具有以下优势:
保证构建镜像的安全性
当您使用Dockerfile多阶段构建镜像时,需要在第一阶段选择合适的编译时基础镜像,进行代码拷贝、项目依赖下载、编译、测试、打包流程。在第二阶段选择合适的运行时基础镜像,拷贝基础阶段生成的运行时依赖文件。最终构建的镜像将不包含任何源代码信息。
优化镜像的层数和体积
构建的镜像仅包含基础镜像和编译制品,镜像层数少,镜像文件体积小。
提升构建速度
使用构建工具(Docker、Buildkit等),可以并发执行多个构建流程,缩短构建耗时。
步骤一:创建Dockerfile
本文拷贝并托管位于Github上的一个简单的Dockerfile,带您来体验整个流程。请确保您的仓库中拷贝该Dockerfile成功。
步骤二:绑定源代码仓库
在容器镜像服务控制台,绑定您托管的代码仓库,以下内容以GitHub为例。
登录容器镜像服务控制台。
在顶部菜单栏,选择所需地域。
在实例列表页面单击个人版实例。
在个人版实例管理页面左侧导航栏中选择 。
在GitHub对应的操作列,单击绑定账号。在弹出的对话框中单击点击前往源代码仓库登录,跳转到GitHub。
在授权界面,单击Authorize AliyunDeveloper。绑定成功后,会弹出您已成功绑定GitHub账号的提示信息。返回至代码源界面,GitHub栏中显示已绑定,表示绑定成功。
步骤三:新建镜像仓库
登录容器镜像服务控制台。
在顶部菜单栏,选择所需地域。
在实例列表页面单击个人版实例。
在个人版实例管理页面左侧导航栏中选择 ,然后单击创建镜像仓库。
设置镜像仓库信息。
配置项
描述
示例
地域
镜像仓库所在区域。
华东1(杭州)
命名空间
仓库所属命名空间。一个镜像仓库必须且仅属于一个命名空间。一个命名空间下可以包含多个镜像仓库。
test23432
仓库名称
请输入仓库名称。
test
仓库类型
仓库类型分为公开和私有。无论公开还是私有类型仓库,推送镜像都需要先进行登录。公开仓库所有人均可使用,为了避免您的数据受到损失,建议您使用私有仓库。
公开:拉取镜像时可以免登录,直接通过网络拉取。
私有:必须要通过Docker客户端进行登录,才能拉取镜像。
私有
摘要
简要描述信息。
-
描述信息
完整描述信息,支持Markdown格式。
使用创建Dockerfile中的Dockerfile,结合ACR的镜像构建服务,进行构建打包以及运行镜像。
单击下一步,设置代码源。
参数
描述
代码源
将代码源设为GitHub,选择绑定源代码仓库中绑定的源代码仓库。
构建设置
本示例使用代码变更时自动构建镜像和海外机器构建。
代码变更时自动构建镜像:当分支有代码提交后会自动触发构建规则。
海外机器构建:构建时会在海外机房构建,构建成功后推送到指定地域。
不使用缓存:每次构建时会强制重新拉取基础依赖镜像,可能会增加构建时间。
单击创建镜像仓库。
创建完成后,会跳转至镜像仓库详情页面,您可以在仓库详情页面查看仓库的基本信息。
在左侧导航栏,单击仓库名称左侧的图标。在镜像仓库页面,您可以查看您刚才创建的镜像仓库,仓库状态显示正常,即表示仓库创建成功。
步骤四:执行构建
在左侧导航栏中选择 ,单击仓库名称或目标仓库操作列的管理,进入仓库详情页面。
单击左侧导航栏中的构建,在构建规则设置区域的单击添加规则。
设置构建规则。
配置项
描述
示例
类型
定义了推送代码到托管仓库,触发构建规则的事件。目前有Branch和Tag两种类型的推送。
Branch
Branch/Tag
设置构建的代码分支。
master
构建上下文目录
设置Dockerfile文件所在的目录。这里的目录指的是相对目录,以代码分支的根目录为父目录。本教程中Dockerfile完整路径是/Dockerfile,此处填写/。
/
Dockerfile文件名
设置Dockerfile文件名,默认为Dockerfile。例如:Dockerfile完整路径是/Dockerfile,此处填写Dockerfile。
Dockerfile
镜像版本
设置镜像版本。
V1.0.0
单击确认,返回至构建页面。
在构建规则设置区域中,找到创建的规则,单击目标规则对应操作列的立即构建。
在构建日志区域中找到构建记录,当构建状态显示成功,表示构建成功。
步骤五:在ECS中安装Docker
登录ECS管理控制台。
在左侧导航栏,选择实例与镜像>实例。
在实例列表页面,找到需要连接的实例,单击该实例对应操作列下的远程连接。
在弹出的连接与命令对话框中,单击通过Workbench远程连接对应的立即登录。
在弹出的登录实例对话框中,输入信息。一般情况下按精简选项输入信息即可,如下表所示。单击确定。
配置项
说明
实例
自动填充当前实例的信息。
网络连接
本文选择专有网络。
专有网络实例支持选择公网IP或私网IP连接。
经典网络实例支持选择公网IP或内网IP连接。
认证方式
选择认证方式,本文选择密码认证。支持的认证方式如下:
密码认证:输入用户名(例如root或ecs-user),需要继续输入登录密码。
证书认证:输入用户名(例如root或ecs-user),需要继续输入或上传证书。如果证书已加密,还需要输入密钥口令。
凭据认证:选择已定义好的凭据或者新增凭据。
凭据用于存储实例的用户名、密码和密钥等信息,您无需每次登录都输入用户名、密码,直接选择凭据即可安全登录实例。
执行如下命令,在ECS中安装Docker。
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
步骤六:在Docker中配置镜像加速器
由于当前运营商网络问题,可能会导致您拉取Docker Hub镜像变慢。建议您手动拉取镜像到本地节点,然后重启Pod。执行如下命令,在Docker中配置镜像加速器。
登录容器镜像服务控制台。在顶部菜单栏,选择创建的容器实例所在地域。
在左侧导航栏,选择镜像工具>镜像加速器。在加速器区域,复制加速器地址。
执行如下命令,在Docker中配置镜像加速器。请将
https://gwsg6nw9.mirror.aliyuncs.com
替换为您在上一步骤中复制的加速器地址。mkdir -p /etc/docker #创建配置文件目录。 tee /etc/docker/daemon.json <<-'EOF' #写入加速配置。 { "registry-mirrors": ["https://gwsg6nw9.mirror.aliyuncs.com"] } EOF systemctl daemon-reload #重新加载配置文件。 systemctl restart docker #重启Docker服务。
执行结果
查看构建的镜像
在个人版实例管理页面左侧导航栏中选择仓库管理>镜像仓库,单击仓库名称或目标仓库操作列的管理,单击左侧导航栏的镜像版本,查看构建的镜像。
在Docker中运行镜像
在Docker执行如下命令,登录阿里云Docker Registry。请将命令中的
acr_e2******@test.aliyunid.com
替换为您的阿里云账号全名,密码为您在准备环境和资源中设置的密码;cn-hangzhou
替换为您个人版实例所在的地域。docker login --username=acr_e2******@test.aliyunid.com registry.cn-hangzhou.aliyuncs.com
执行如下命令,拉取镜像。请将命令中的
cn-hangzhou
替换为您个人版实例所在的地域;test23432
替换为您实际使用的命名空间;test:V1.0.0
替换为实际使用的仓库名称以及镜像版本。docker pull registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0
执行如下命令,查看Docker镜像。
docker images
执行如下命令,运行镜像。请将命令中的
cn-hangzhou
替换为您个人版实例所在的地域;test23432
替换为您实际使用的命名空间;test:V1.0.0
替换为实际使用的仓库名称以及镜像版本。docker run -ti registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0 Hello World!