您可以在本地的开发工具中使用命令将应用程序打成 WAR 包或 JAR 包,直接部署;也可以基于 WAR 包或 JAR 包制作镜像,再将镜像上传到阿里云镜像仓库来部署。本文介绍如何制作不同框架应用镜像的 Dockfile 以及如何将镜像上传到阿里云镜像仓库。

前提条件

在制作应用镜像前,请查阅镜像创建规约并按照规约,同时参考下面的内容制作 EDAS 应用镜像。

创建标准 Dockerfile

Dockerfile 是一个文本格式的配置文件,您可以使用 Dockerfile 快速创建镜像。

您可以根据实际应用框架,通过 Dockerfile 分别制作 HSF、Spring Cloud 或 Dubbo 应用镜像。下面将通过示例分别介绍如何创建这些不同框架应用的 Dockerfile。

一个 EDAS 标准 Dockerfile 描述了 EDAS 创建应用运行环境的所有指令,包括下载、安装和启动 OpenJDK、Tomcat、WAR 包和 JAR 包等。 您还可以通过改变 Dockerfile 内容,完成如 OpenJDK 版本替换、Tomcat 配置修改、改变运行时环境等操作。详情请参见自定义设置 Dockerfile

下面通过示例介绍如何制作不同框架应用镜像的 Dockerfile(尤其注意 JAR 包应用的 Dockerfile 中,执行的脚本不要丢失 CATALINA_OPTS 参数,否则将会导致应用服务注册、配置管理读取发生异常)。

HSF 应用的 Dockerfile 示例(基于 WAR 包)

FROM centos:7
MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>

# 安装打包必备软件
RUN yum install -y wget unzip telnet lsof net-tools bind-utils

# 准备 JDK/Tomcat 系统变量与路径
ENV JAVA_HOME /usr/java/latest
ENV CATALINA_HOME /home/admin/taobao-tomcat
ENV PATH ${JAVA_HOME}/bin:${CATALINA_HOME}/bin:${PATH}

# 设置 EDAS-Container/Pandora 应用容器版本
ENV EDAS_CONTAINER_VERSION V3.5.4
LABEL pandora V3.5.4

# 下载安装 OpenJDK
RUN yum -y install java-1.8.0-openjdk-devel

# 创建 JAVA_HOME 软链接
RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi

# 下载安装 Ali-Tomcat 7.0.92 到 /home/admin/taobao-tomcat 目录
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/edas-container/7.0.92/taobao-tomcat-production-7.0.92.tar.gz -O /tmp/taobao-tomcat.tar.gz && \
    mkdir -p ${CATALINA_HOME} && \
    tar -xvf /tmp/taobao-tomcat.tar.gz -C ${CATALINA_HOME} && \
    mv ${CATALINA_HOME}/taobao-tomcat-production-7.0.59.3/* ${CATALINA_HOME}/ && \
    rm -rf /tmp/taobao-tomcat.tar.gz ${CATALINA_HOME}/taobao-tomcat-production-7.0.59.3 && \
    chmod +x ${CATALINA_HOME}/bin/*sh

# 根据环境变量,下载安装 EDAS Contaienr/Pandora 应用容器版本
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/edas-plugins/edas.sar.${EDAS_CONTAINER_VERSION}/taobao-hsf.tgz -O /tmp/taobao-hsf.tgz && \
    tar -xvf /tmp/taobao-hsf.tgz -C ${CATALINA_HOME}/deploy && \
    rm -rf /tmp/taobao-hsf.tgz

# 下载部署 EDAS 演示 WAR 包
RUN wget http://edas.oss-cn-hangzhou.aliyuncs.com/demo/hello-edas.war -O /tmp/ROOT.war && \
    unzip /tmp/ROOT.war -d ${CATALINA_HOME}/deploy/ROOT && \
    rm -rf /tmp/ROOT.war

# 设定 Tomcat 安装目录为容器启动目录,并采用 run 方式启动 Tomcat,在标准命令行输出 catalina 日志。
WORKDIR ${CATALINA_HOME}
CMD ["catalina.sh", "run"]                

HSF 应用的 Dockerfile 示例(基于 JAR 包)

FROM centos:7
MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>

# 安装打包必备软件
RUN yum install -y wget unzip telnet lsof net-tools bind-utils

# 准备 JDK/Tomcat 系统变量与路径
ENV JAVA_HOME /usr/java/latest
ENV CATALINA_HOME /home/admin/taobao-tomcat
ENV PATH ${JAVA_HOME}/bin:${PATH}
ENV ADMIN_HOME /home/admin

# 设置 EDAS-Container/Pandora 应用容器版本
ENV EDAS_CONTAINER_VERSION V3.5.4
LABEL pandora V3.5.4

# 下载安装 OpenJDK
RUN yum -y install java-1.8.0-openjdk-devel

# 创建 JAVA_HOME 软链接
RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi

# 根据环境变量,下载安装 EDAS Contaienr/Pandora 应用容器版本
RUN mkdir -p ${CATALINA_HOME}/deploy
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/edas-plugins/edas.sar.${EDAS_CONTAINER_VERSION}/taobao-hsf.tgz -O /tmp/taobao-hsf.tgz && \
    tar -xvf /tmp/taobao-hsf.tgz -C ${CATALINA_HOME}/deploy/ && \
    rm -rf /tmp/taobao-hsf.tgz

# 下载部署 EDAS 演示 JAR 包
RUN mkdir -p ${ADMIN_HOME}/app && wget http://edas.oss-cn-hangzhou.aliyuncs.com/demoapp/fatjar-test-case-provider-0.0.1-SNAPSHOT.jar -O ${ADMIN_HOME}/app/provider.jar

# 将启动命令写入启动脚本 start.sh
RUN echo '${JAVA_HOME}/bin/java -jar ${CATALINA_OPTS} -Djava.security.egd=file:/dev/./urandom -Dcatalina.logs=${CATALINA_HOME}/logs -Dpandora.location=${CATALINA_HOME}/deploy/taobao-hsf.sar   "${ADMIN_HOME}/app/provider.jar" --server.context-path=/ --server.port=8080 --server.tomcat.uri-encoding=ISO-8859-1 --server.tomcat.max-threads=400' > ${ADMIN_HOME}/start.sh && chmod +x ${ADMIN_HOME}/start.sh

WORKDIR $CATALINA_HOME
CMD ["/bin/bash", "/home/admin/start.sh"]                

Spring Cloud 或 Dubbo 应用的 Dockerfile 示例(基于 WAR 包)

FROM centos:7
MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>

# 安装打包必备软件
RUN yum install -y wget unzip telnet lsof net-tools bind-utils

# 准备 JDK/Tomcat 系统变量
ENV JAVA_HOME /usr/java/latest
ENV CATALINA_HOME /home/admin/apache-tomcat-7.0.91
ENV ADMIN_HOME /home/admin
ENV PATH ${JAVA_HOME}/bin:${CATALINA_HOME}/bin:${PATH}

RUN mkdir -p ${ADMIN_HOME}

# 下载安装 OpenJDK 
RUN yum -y install java-1.8.0-openjdk-devel

# 创建 JAVA_HOME 软链接
RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi

# 下载安装 Tomcat
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/apache-tomcat-7.0.91.tar.gz -O /tmp/apache-tomcat-7.0.91.tar.gz && \
    tar -xvf /tmp/apache-tomcat-7.0.91.tar.gz -C ${ADMIN_HOME} && \
    rm /tmp/apache-tomcat-7.0.91.tar.gz && \
    chmod +x ${CATALINA_HOME}/bin/*sh

RUN mkdir -p ${CATALINA_HOME}/deploy

# 增加容器内中文支持
ENV LANG="en_US.UTF-8"

# 增强 Webshell 使⽤体验
ENV TERM=xterm

# 下载部署 EDAS 演示 WAR 包
RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/demo/1.0/hello-edas.war -O /tmp/ROOT.war && \
    rm -rf ${CATALINA_HOME}/webapps/ROOT &&\
    unzip /tmp/ROOT.war -d ${CATALINA_HOME}/deploy/ROOT/ && \
    rm -rf /tmp/ROOT.war

# 设定 Tomcat 安装目录为容器启动目录,并采用 run 方式启动 Tomcat,在标准命令行输出 catalina 日志
WORKDIR ${ADMIN_HOME}
CMD ["catalina.sh", "run"]               

Spring Cloud 或 Dubbo 应用的 Dockerfile 示例(基于 JAR 包)

FROM centos:7
MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>

# 安装打包必备软件
RUN yum install -y wget unzip telnet lsof net-tools bind-utils

# 准备 JDK/Tomcat 系统变量
ENV JAVA_HOME /usr/java/latest
ENV PATH ${JAVA_HOME}/bin:$PATH
ENV ADMIN_HOME /home/admin

# 下载安装 OpenJDK
RUN yum -y install java-1.8.0-openjdk-devel

# 创建 JAVA_HOME 软链接
RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi

# 下载部署 EDAS 演示 JAR 包
RUN mkdir -p ${ADMIN_HOME}/app && \
         wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/demo/1.0/hello-edas-0.0.1-SNAPSHOT.jar -O ${ADMIN_HOME}/app/hello-edas-0.0.1-SNAPSHOT.jar

# 增加容器内中⽂支持
ENV LANG="en_US.UTF-8"

# 增强 Webshell 使⽤体验
ENV TERM=xterm

# 将启动命令写入启动脚本 start.sh
RUN mkdir -p ${ADMIN_HOME}
RUN echo '${JAVA_HOME}/bin/java -jar ${CATALINA_OPTS} ${ADMIN_HOME}/app/hello-edas-0.0.1-SNAPSHOT.jar'> ${ADMIN_HOME}/start.sh && chmod +x ${ADMIN_HOME}/start.sh

WORKDIR ${ADMIN_HOME}

CMD ["/bin/bash", "/home/admin/start.sh"]                

自定义设置 Dockerfile

您可以在创建的标准 Dockerfile 上根据实际需求进行自定义设置。

升级 OpenJDK:在 Dockerfile 中,可下载和安装新版本的 OpenJDK,以下示例为下载安装 OpenJDK 9。

# 下载安装 OpenJDK 9
RUN yum -y install java-1.9.0-openjdk-devel            

升级 EDAS Java 应用容器版本(适用于 HSF 应用)

对于部署到容器服务 Kubernetes 集群中的 HSF 应用,为使用中间件的新特性或修复原有版本的问题,可以升级应用容器版本。升级步骤如下。

  1. 登录 EDAS 控制台。在左侧导航栏选择应用管理 > 应用列表 ,在应用列表页面右上角单击创建应用,在应用基本信息页面查看应用运行环境,查看最新的 EDAS-Container 版本号(3.X.X)。
  2. 参考容器版本说明,获取 Pandora 容器版本。
  3. 替换 Dockerfile 中的版本号信息,如 3.5.4。
    # 设置 EDAS-Container/Pandora 应用容器版本
    ENV EDAS_CONTAINER_VERSION V3.5.4                    
  4. 重新制作并发布应用镜像。

在 Tomcat 启动参数中添加 EDAS 运行时环境

EDAS 提供了 JVM 环境变量EDAS_CATALINA_OPTS,包含运行所需的最小参数。同时 Ali-Tomcat 提供了自定义 JVM 参数配置选项JAVA_OPS,可以设置XmxXms等参数。

# 设置 EDAS 应用 JVM 参数
ENV CATALINA_OPTS ${EDAS_CATALINA_OPTS}
# 设置 JVM 参数
ENV JAVA_OPTS="\
     -Xmx3550m \
     -Xms3550m \
     -Xmn2g \
     -Xss128k"       

在本地构建镜像

从本地命令行进入 Dockerfile 所在的目录,执行 docker build 命令构建镜像:

docker build -t [标签名称,最好取应用名]:[版本号] .
或
docker build -t [标签名称,最好取应用名]:[版本号] -f /path/to/custom_dockerfile_name .  #假如您创建好的 Dockerfile 在其他位置或名称不为 Dockerfile 时适用。            

例如:

docker build -t hsf-provider:1.0.0 .            

然后使用 docker images | grep <镜像标签名称> 命令查看本地打包好的镜像。

上传镜像到镜像仓库

您在本地生成构建好的应用镜像就可以上传到阿里云提供的容器镜像仓库(需要您提前访问阿里云镜像仓库控制台,并根据您 EDAS 中已经创建或尚未创建的应用所在的 Region,在阿里云镜像仓库控制台切换到对应的 Region,查看镜像仓库列表,选择一个已经存在或者新创建的镜像仓库来存放您打包好的应用镜像,仓库名称最好是应用名称,便于识别)。

执行指定镜像仓库基本信息页面提供的 “ 将镜像推送到 Registry ” 相关命令,将本地镜像上传到该镜像仓库。

docker login --username=[当前登录的账号名] registry.[region_id].aliyuncs.com     #这一步输入的密码为阿里云容器镜像服务默认实例 -> 访问凭证页面设置的固定或者临时密码,并非阿里云账号密码。
docker tag [本地应用镜像ID] registry.[region_id].aliyuncs.com/[命令空间名称]/[镜像仓库名称]:[镜像版本号]
docker push registry.[region_id].aliyuncs.com/[命令空间名称]/[镜像仓库名称]:[镜像版本号]            

例如:

docker login --username=tdy218@gmail.com registry.cn-hangzhou.aliyuncs.com
docker tag 2b64f63601a7 registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0
docker push registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0            
阿里云镜像仓库

阿里云镜像仓库网络加速:https://cr.console.aliyun.com/#/accelerator

镜像创建规约

通过 Dockerfile 制作自定义镜像时,需要遵循以下规范及限制。

  • 租户/加密信息

    EDAS 应用用户鉴权与加密凭证的信息。

    • 资源
      资源类型 资源名称 描述
      Secret edas-certs 加密字典,保存 EDAS 租户信息
    • 环境变量
      环境变量 Key 资源名称 描述
      tenantId String EDAS 租户 ID
      accessKey String 鉴权 Access Key ID
      secretKey String 鉴权 Access Key Secret
    • 本地文件
      路径 类型 描述
      /home/admin/.spas_key/default File EDAS 租户鉴权信息,包含上述 ENV 信息。
  • 服务信息

    包含运行时所需连接的 EDAS 域名、端口等信息。

    • 资源
      资源类型 资源名称 描述
      ConfigMap edas-envs EDAS 服务信息
    • 环境变量
      环境变量 Key 类型 描述
      EDAS_ADDRESS_SERVER_DOMAIN String 配置中心服务域名或 IP
      EDAS_ADDRESS_SERVER_PORT String 配置中心服务端口
      EDAS_CONFIGSERVER_CLIENT_PORT String CS 服务端口
    • 应用运行时环境变量(强制)

      EDAS 部署时会提供以下环境变量 Env,保证应用运行正常,请勿覆盖配置。

      环境变量 Key 类型 描述
      POD_IP String POD IP
      EDAS_APP_ID String EDAS 应用 ID
      EDAS_ECC_ID String EDAS ECC ID
      EDAS_PROJECT_NAME String 同 EDAS_APP_ID,用于调用链解析
      EDAS_JM_CONTAINER_ID String 同 EDAS_ECC_ID,用于调用链解析
      EDAS_CATALINA_OPTS String 中间件运行时所需 CATALINA_OPTS 参数
      CATALINA_OPTS String 同 EDAS_CATALINA_OPTS,默认 TOMCAT 启动参数