制作Java镜像

Spring Cloud、Dubbo、HSF框架下开发并编译的应用WAR包或JAR包,如果需要在Serverless 应用引擎 SAE(Serverless App Engine)上以镜像方式部署,需要将WAR包或JAR包制作为应用镜像,以便部署时使用。本文介绍镜像制作的使用规范、以不同代码包编译的Java应用的镜像制作过程、以及将镜像上传至镜像仓库的操作步骤。

使用规范

通过Dockerfile制作自定义镜像时,SAE在运行时会自动注入以下环境变量信息。

重要
  • 为保证应用正常运行,请勿覆盖以下配置。

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

  • 请勿使用VOLUMESUSER root字段,否则应用运行时可能会导致文件丢失。

环境变量Key

描述

POD_IP

POD的IP地址。

EDAS_APP_ID

部署在SAE上应用的ID。

EDAS_ECC_ID

导入集群的ECS在应用中部署后的ID。

EDAS_PROJECT_NAME

EDAS_ECC_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应用中可见。

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

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安装打包必备软件。
RUN yum -y install wget unzip telnet

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

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

# 下载部署SAE演示JAR包。
RUN mkdir -p /home/admin/app/ && \
         wget http://sae-demo-cn-shenzhen.oss-cn-shenzhen.aliyuncs.com/demo/1.0/hello-edas-0.0.1-SNAPSHOT.jar -O /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar

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

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

# 将启动命令写入启动脚本start.sh。
RUN mkdir -p /home/admin
RUN echo 'eval execjava -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
WORKDIR $ADMIN_HOME
CMD ["/bin/bash", "/home/admin/start.sh"]            
说明
  • 如果您需要使用微服务能力,则在设置启动命令时,需添加$CATALINA_OPTS启动参数。具体操作,请参见设置启动命令

  • 如果您需要使用自建的注册中心或MSE的注册中心,则需配置启动参数-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false参数需要放在-jar之前,否则可能会导致无法使用非SAE自带的注册中心。其他具体详情,请参见使用自建Nacos服务注册中心使用MSE的Nacos注册中心

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

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安装打包必备软件。
RUN yum -y install wget unzip telnet

# 准备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 $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
RUN mkdir -p /home/admin

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

# 下载安装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 /home/admin && \
    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

# 下载部署SAE演示WAR包。
RUN wget http://sae-demo-cn-shenzhen.oss-cn-shenzhen.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"]            

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

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安装打包必备软件。
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-Container以及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

# 下载部署SAE演示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 'eval execjava -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
WORKDIR $CATALINA_HOME
CMD ["/bin/bash", "/home/admin/start.sh"]            
说明
  • 如果您需要使用微服务能力,则在设置启动命令时,需添加$CATALINA_OPTS启动参数。具体操作,请参见设置启动命令

  • 如果您需要使用自建的注册中心或MSE的注册中心,则需配置启动参数-Dnacos.use.endpoint.parsing.rule=false-Dnacos.use.cloud.namespace.parsing=false参数需要放在-jar之前,否则可能会导致无法使用非SAE自带的注册中心。其他具体详情,请参见使用自建Nacos服务注册中心使用MSE的Nacos注册中心

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

FROM centos:7
LABEL maintainer="SAE R&D team"

# 安装打包必备软件。
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-Container以及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

# 下载部署SAE演示WAR包。
RUN wget http://sae-demo-cn-shenzhen.oss-cn-shenzhen.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"]

自定义设置Dockerfile

通过编辑Dockerfile文件修改运行环境配置,如更换JDK版本、Tomcat修改配置和更改运行时环境等操作。

  • 更换JDK版本

    在标准Dockerfile中,请参见以下示例更换其他版本的JDK。

    # 下载安装JDK 8。
    RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/agent/prod/files/jdk-8u65-linux-x64.rpm -O /tmp/jdk-8u65-linux-x64.rpm && \
        yum -y install /tmp/jdk-8u65-linux-x64.rpm && \
        rm -rf /tmp/jdk-8u65-linux-x64.rpm                            
  • 在Tomcat启动参数中添加SAE运行环境

    SAE提供了JVM环境变量EDAS_CATALINA_OPTS,包含了运行所需的基本参数。此外Ali-Tomcat提供了自定义JVM参数配置选项JAVA_OPTS,可以设置Xmx、Xms等参数。

    # 设置SAE应用JVM参数。
    ENV CATALINA_OPTS ${EDAS_CATALINA_OPTS}
    # 设置JVM参数。
    ENV JAVA_OPTS="\
         -Xmx3550m \
         -Xms3550m \
         -Xmn2g"                            
  • 使用独立注册中心

    如果您希望在微服务应用中使用独立的注册中心,请在Java命令后增加以下两个参数。

    • -Dnacos.use.endpoint.parsing.rule=false
    • -Dnacos.use.cloud.namespace.parsing=false

    示例代码如下:

    RUN echo 'eval exec java -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh

构建镜像

从本地命令行进入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 <镜像标签名称>命令查看本地编译完成的镜像。

上传镜像到镜像仓库

您可以将本地生成的应用镜像上传到阿里云提供的容器镜像仓库。详细步骤,请参见管理镜像

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

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

例如:

docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
docker tag <ImageId> registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0
docker push registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0            

阿里云镜像仓库v2

更多信息

镜像制作完成后,您可以将其以镜像的方式部署在SAE。具体操作,请参见以下文档: