在Dockerfile中使用构建打包镜像并运行

通过使用多阶段构建应用以及结合阿里云容器镜像服务(ACR)的镜像构建服务,可以使Java应用具有构建安全、构建速度快、镜像文件体积小等优点。

前提条件

背景信息

镜像构建的通用问题

镜像构建服务使用Dockerfile来帮助用户构建最终镜像,但在具体实践中,存在一些问题:

  • Dockerfile编写有门槛

    开发者(尤其是Java)习惯了语言框架的编译便利性,不知道如何使用Dockerfile构建应用镜像。

  • 镜像容易臃肿

    构建镜像时,开发者会将项目的编译、测试、打包构建流程编写在一个Dockerfile中。每条Dockerfile指令都会为镜像添加一个新的镜像层,从而导致镜像层次深,镜像文件体积特别大。

  • 存在源码泄露风险

    打包镜像时,源代码容易被打包到镜像中,从而产生源代码泄漏的风险。

多阶段构建优势

针对Java这类的编译型语言,使用Dockerfile多阶段构建,具有以下优势:

  • 保证构建镜像的安全性

    当您使用Dockerfile多阶段构建镜像时,需要在第一阶段选择合适的编译时基础镜像,进行代码拷贝、项目依赖下载、编译、测试、打包流程。在第二阶段选择合适的运行时基础镜像,拷贝基础阶段生成的运行时依赖文件。最终构建的镜像将不包含任何源代码信息。

  • 优化镜像的层数和体积

    构建的镜像仅包含基础镜像和编译制品,镜像层数少,镜像文件体积小。

  • 提升构建速度

    使用构建工具(Docker、Buildkit等),可以并发执行多个构建流程,缩短构建耗时。

步骤一:创建Dockerfile

本文拷贝并托管位于Github上的一个简单的Dockerfile,带您来体验整个流程。请确保您的仓库中拷贝该Dockerfile成功。

步骤二:绑定源代码仓库

在容器镜像服务控制台,绑定您托管的代码仓库,以下内容以GitHub为例。

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 实例列表页面单击个人版实例。

  4. 在个人版实例管理页面左侧导航栏中选择仓库管理 > 代码源

  5. 在GitHub对应的操作列,单击绑定账号。在弹出的对话框中单击点击前往源代码仓库登录,跳转到GitHub。

  6. 在授权界面,单击Authorize AliyunDeveloper。绑定成功后,会弹出您已成功绑定GitHub账号的提示信息。返回至代码源界面,GitHub栏中显示已绑定,表示绑定成功。image

步骤三:新建镜像仓库

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 实例列表页面单击个人版实例。

  4. 在个人版实例管理页面左侧导航栏中选择仓库管理 > 镜像仓库,然后单击创建镜像仓库

  5. 设置镜像仓库信息。

    配置项

    描述

    示例

    地域

    镜像仓库所在区域。

    华东1(杭州)

    命名空间

    仓库所属命名空间。一个镜像仓库必须且仅属于一个命名空间。一个命名空间下可以包含多个镜像仓库。

    test23432

    仓库名称

    请输入仓库名称。

    test

    仓库类型

    仓库类型分为公开私有。无论公开还是私有类型仓库,推送镜像都需要先进行登录。公开仓库所有人均可使用,为了避免您的数据受到损失,建议您使用私有仓库。

    • 公开:拉取镜像时可以免登录,直接通过网络拉取。

    • 私有:必须要通过Docker客户端进行登录,才能拉取镜像。

    私有

    摘要

    简要描述信息。

    -

    描述信息

    完整描述信息,支持Markdown格式。

    使用创建Dockerfile中的Dockerfile,结合ACR的镜像构建服务,进行构建打包以及运行镜像。

  6. 单击下一步,设置代码源。

    参数

    描述

    代码源

    将代码源设为GitHub,选择绑定源代码仓库中绑定的源代码仓库。

    构建设置

    本示例使用代码变更时自动构建镜像海外机器构建

    • 代码变更时自动构建镜像:当分支有代码提交后会自动触发构建规则。

    • 海外机器构建:构建时会在海外机房构建,构建成功后推送到指定地域。

    • 不使用缓存:每次构建时会强制重新拉取基础依赖镜像,可能会增加构建时间。

  7. 单击创建镜像仓库

    创建完成后,会跳转至镜像仓库详情页面,您可以在仓库详情页面查看仓库的基本信息。

  8. 在左侧导航栏,单击仓库名称左侧的23030201图标。在镜像仓库页面,您可以查看您刚才创建的镜像仓库,仓库状态显示正常,即表示仓库创建成功。

步骤四:执行构建

  1. 在左侧导航栏中选择仓库管理 > 镜像仓库,单击仓库名称或目标仓库操作列的管理,进入仓库详情页面。

  2. 单击左侧导航栏中的构建,在构建规则设置区域的单击添加规则

  3. 设置构建规则。

    配置项

    描述

    示例

    类型

    定义了推送代码到托管仓库,触发构建规则的事件。目前有Branch和Tag两种类型的推送。

    Branch

    Branch/Tag

    设置构建的代码分支。

    master

    构建上下文目录

    设置Dockerfile文件所在的目录。这里的目录指的是相对目录,以代码分支的根目录为父目录。本教程中Dockerfile完整路径是/Dockerfile,此处填写/

    /

    Dockerfile文件名

    设置Dockerfile文件名,默认为Dockerfile。例如:Dockerfile完整路径是/Dockerfile,此处填写Dockerfile。

    Dockerfile

    镜像版本

    设置镜像版本。

    V1.0.0

  4. 单击确认,返回至构建页面。

  5. 构建规则设置区域中,找到创建的规则,单击目标规则对应操作列的立即构建

    构建日志区域中找到构建记录,当构建状态显示成功,表示构建成功。

步骤五:在ECS中安装Docker

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像>实例

  3. 实例列表页面,找到需要连接的实例,单击该实例对应操作列下的远程连接

  4. 在弹出的连接与命令对话框中,单击通过Workbench远程连接对应的立即登录

  5. 在弹出的登录实例对话框中,输入信息。一般情况下按精简选项输入信息即可,如下表所示。单击确定

    配置项

    说明

    实例

    自动填充当前实例的信息。

    网络连接

    本文选择专有网络。

    • 专有网络实例支持选择公网IP或私网IP连接。

    • 经典网络实例支持选择公网IP或内网IP连接。

    认证方式

    选择认证方式,本文选择密码认证。支持的认证方式如下:

    • 密码认证:输入用户名(例如root或ecs-user),需要继续输入登录密码。

    • 证书认证:输入用户名(例如root或ecs-user),需要继续输入或上传证书。如果证书已加密,还需要输入密钥口令。

    • 凭据认证:选择已定义好的凭据或者新增凭据。

      凭据用于存储实例的用户名、密码和密钥等信息,您无需每次登录都输入用户名、密码,直接选择凭据即可安全登录实例。

  6. 执行如下命令,在ECS中安装Docker。

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

步骤六:在Docker中配置镜像加速器

由于当前运营商网络问题,可能会导致您拉取Docker Hub镜像变慢。建议您手动拉取镜像到本地节点,然后重启Pod。执行如下命令,在Docker中配置镜像加速器。

  1. 登录容器镜像服务控制台。在顶部菜单栏,选择创建的容器实例所在地域。

  2. 在左侧导航栏,选择镜像工具>镜像加速器。在加速器区域,复制加速器地址。

  3. 执行如下命令,在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中运行镜像

  1. 在Docker执行如下命令,登录阿里云Docker Registry。请将命令中的acr_e2******@test.aliyunid.com替换为您的阿里云账号全名,密码为您在准备环境和资源中设置的密码;cn-hangzhou替换为您个人版实例所在的地域。

    docker login --username=acr_e2******@test.aliyunid.com registry.cn-hangzhou.aliyuncs.com
  2. 执行如下命令,拉取镜像。请将命令中的cn-hangzhou替换为您个人版实例所在的地域;test23432替换为您实际使用的命名空间;test:V1.0.0替换为实际使用的仓库名称以及镜像版本。

    docker pull registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0
  3. 执行如下命令,查看Docker镜像。

    docker images
  4. 执行如下命令,运行镜像。请将命令中的cn-hangzhou替换为您个人版实例所在的地域;test23432替换为您实际使用的命名空间;test:V1.0.0替换为实际使用的仓库名称以及镜像版本。

    docker run -ti registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0
    Hello World!