您可以在本地的开发工具中使用命令将应用程序打成 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 配置修改、改变运行时环境等操作。详情请参见自定义镜像:使用新版本的 OpenJDK

HSF 应用的 Dockerfile 示例

# Using the centos7 + openjdk8 + ali tomcat7 + pandora 3.5.9 for the base 
FROM apaas/edas-centos-openjdk8-alitomcat7:latest
MAINTAINER Alibaba Cloud EDAS Team<edas-dev@list.alibaba-inc.com>

ENV TZ="Asia/Shanghai"

# Default put your application package into /home/admin/app/
ENV APP_HOME /home/admin/app/

#####----> First case: deploy a fat-jar file 
ARG APP_LOCATION=https://edas-hz.oss-cn-hangzhou.aliyuncs.com/prod/demo/HSF_PROVIDER.jar

#####----> Second case: deploy a war file, simply change the file name your wanted.
#ARG APP_LOCATION=https://edas-hz.oss-cn-hangzhou.aliyuncs.com/prod/demo/HSF_PROVIDER.war

#####----> Third case: deploy a local storage file.
#ARG APP_LOCATION=/Users/yanliang.lyl/workspace/java/demo/HSF_PROVIDER.war

# Then download to package into /home/admin/app/
ADD ${APP_LOCATION} ${APP_HOME}/

# Default working dir is set to /home/admin
# WORKDIR /home/admin

# Entry point set to /home/admin/bin/start.sh, 
# which including inside basic image (apaas/edas-centos-openjdk8-alitomcat8)
# CMD ["/home/admin/bin/start.sh"]             

Spring Cloud 或 Dubbo 应用的 Dockerfile 示例

# Using centos7 + openjdk8 + tomcat8 for the base
FROM apaas/edas:latest

# Default put your application package into /home/admin/app/
ENV APP_HOME /home/admin/app/

##### SIMPLE REPLACE YOUR PACKAGE FILE
#####----> First case: deploy a fat-jar file 
ARG APP_LOCATION=https://edas-hz.oss-cn-hangzhou.aliyuncs.com/prod/demo/DUBBO_PROVIDER.jar

#####----> Second case: deploy a war file, simply change the file name your wanted.
#ARG APP_LOCATION=https://edas-hz.oss-cn-hangzhou.aliyuncs.com/prod/demo/DUBBO_PROVIDER.war

#####----> Third case: deploy a local storage file.
#ARG APP_LOCATION=/Users/yanliang.lyl/workspace/java/demo/SPRINT_CLOUD_PROVIDER.war

# Then download to package into /home/admin/app/
ADD ${APP_LOCATION} ${APP_HOME}/
			

EDAS 基础镜像说明

您可以根据您应用的运行环境,自由选择以下的基础镜像:

镜像名称 OS版本 Java 版本 Tomcat 版本 Pandora 版本 备注
apaas/edas CentOS 7 OpenJDK 1.8 8.5.42 N/A 与 apaas/edas-centos-openjdk8-tomcat8 相同,最新版本号为:latest
apaas/edas-centos-openjdk8-tomcat8 CentOS 7 OpenJDK 1.8 8.5.42 N/A 普通 SpringCloud / Dubbo 应用推荐使用此版本,最新版本号为:latest
apaas/edas-centos-openjdk8-tomcat7 CentOS 7 OpenJDK 1.8 7.0.93 N/A 基于 Tomcat 7.x 的普通 SpringCloud / Dubbo 应用推荐使用此版本,最新版本号为:latest
apaas/edas-centos-openjdk8-alitomcat8 CentOS 7 OpenJDK 1.8 8.5.37 3.5.9 基于 Tomcat8.x 的 HSF 应用推荐使用此版本,最新版本号为:latest
apaas/edas-centos-openjdk8-alitomcat7 CentOS 7 OpenJDK 1.8 7.0.92 3.5.9 基于 Tomcat7.x 的 HSF 应用推荐使用此版本,最新版本号为:latest

更多镜像请访问 aPaaS Docker Hub 官方镜像仓库;同时,如果您需要额外的基础镜像,请提交工单给我们 ;如果您对我们的基础镜像有任何疑问,请参考基础镜像 Dockerfile 的 GIT HUB 地址。

自定义镜像:使用新版本的 OpenJDK

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

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

# 先卸载之前的 JDK,然后再下载安装 OpenJDK 9
RUN yum erase -y java; yum -y install java-1.9.0-openjdk-devel            

自定义镜像:升级 EDAS Container 版本(HSF 应用)

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

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

自定义镜像:在镜像中调整 JVM 启动参数

基于基础镜像中的 JVM 参数,我们将通过JAVA_OPTS环境变量进行传递,下例中说明了如何修改 JVM 启动参数的方式:

FROM apaas/edas:latest
# 设置 JVM 参数
ENV JAVA_OPTS="\
     -Xmx3550m \
     -Xms3550m \
     -Xmn2g \
     -Xss128k" 

自定义镜像:SpringBoot 类型的应用修改应用配置

基于 EDAS 基础镜像中的部署 FatJar 类型的应用,如果需要修改 Tomcat 的启动配置如:Context Path、启动端口、参数等,将借助APP_ARGS 环境变量进行传递,举例如下

FROM apaas/edas:latest

# 基础镜像中的默认配置为:
#    - context path 为 "/" ,
#    - uri 编码为 ISO-8859-1
#    - 应用启动端口为 8080,
#    - tomcat 处理线程池数量为 400

# 您也可以通过复写 APP_ARGS 这个环境变量来修改默认配置,如下:
ENV APP_ARGS="--server.context-path=/  \
              --server.tomcat.uri-encoding=ISO-8859-1 \
              --server.port=8080 \
              --server.tomcat.max-threads=400"

在本地构建镜像

从本地命令行进入 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 在运行时会自动注入的环境信息,这些信息如下表:

环境变量 Key 描述
POD_IP POD IP
EDAS_APP_ID EDAS 应用 ID
EDAS_ECC_ID EDAS ECC ID
EDAS_PROJECT_NAME 同 EDAS_APP_ID,用于调用链解析
EDAS_JM_CONTAINER_ID 同 EDAS_ECC_ID,用于调用链解析
EDAS_CATALINA_OPTS 中间件运行时所需 CATALINA_OPTS 参数
CATALINA_OPTS 同 EDAS_CATALINA_OPTS,默认 TOMCAT 启动参数
CATALINA_HOME 所安装的 TOMCAT 路径
PANDORA_LOCATION 所安装的 Pandora 路径,HSF 应用中可见

同时,请勿使用 /home/admin/.spas_key/default 文件,此文件会在 POD 运行时被覆盖。