全部产品
云市场

制作应用容器 Docker 镜像

更新时间:2019-08-16 16:09:54

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

注意:在制作应用镜像前,请查阅镜像创建规约并按照规约制作镜像。

创建标准 Dockerfile

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

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

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

下面通过示例介绍如何制作不同框架应用镜像的 Dockerfile。

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

  1. FROM centos:7
  2. MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>
  3. # 安装打包必备软件
  4. RUN yum install -y wget unzip telnet lsof net-tools bind-utils
  5. # 准备 JDK/Tomcat 系统变量与路径
  6. ENV JAVA_HOME /usr/java/latest
  7. ENV CATALINA_HOME /home/admin/taobao-tomcat
  8. ENV PATH ${JAVA_HOME}/bin:${CATALINA_HOME}/bin:${PATH}
  9. # 设置 EDAS-Container/Pandora 应用容器版本
  10. ENV EDAS_CONTAINER_VERSION V3.5.4
  11. LABEL pandora V3.5.4
  12. # 下载安装 OpenJDK
  13. RUN yum -y install java-1.8.0-openjdk-devel
  14. # 创建 JAVA_HOME 软链接
  15. RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi
  16. # 下载安装 Ali-Tomcat 7.0.92 到 /home/admin/taobao-tomcat 目录
  17. 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 && \
  18. mkdir -p ${CATALINA_HOME} && \
  19. tar -xvf /tmp/taobao-tomcat.tar.gz -C ${CATALINA_HOME} && \
  20. mv ${CATALINA_HOME}/taobao-tomcat-production-7.0.59.3/* ${CATALINA_HOME}/ && \
  21. rm -rf /tmp/taobao-tomcat.tar.gz ${CATALINA_HOME}/taobao-tomcat-production-7.0.59.3 && \
  22. chmod +x ${CATALINA_HOME}/bin/*sh
  23. # 根据环境变量,下载安装 EDAS Contaienr/Pandora 应用容器版本
  24. 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 && \
  25. tar -xvf /tmp/taobao-hsf.tgz -C ${CATALINA_HOME}/deploy && \
  26. rm -rf /tmp/taobao-hsf.tgz
  27. # 下载部署 EDAS 演示 WAR 包
  28. RUN wget http://edas.oss-cn-hangzhou.aliyuncs.com/demo/hello-edas.war -O /tmp/ROOT.war && \
  29. unzip /tmp/ROOT.war -d ${CATALINA_HOME}/deploy/ROOT && \
  30. rm -rf /tmp/ROOT.war
  31. # 设定 Tomcat 安装目录为容器启动目录,并采用 run 方式启动 Tomcat,在标准命令行输出 catalina 日志。
  32. WORKDIR ${CATALINA_HOME}
  33. CMD ["catalina.sh", "run"]

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

  1. FROM centos:7
  2. MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>
  3. # 安装打包必备软件
  4. RUN yum install -y wget unzip telnet lsof net-tools bind-utils
  5. # 准备 JDK/Tomcat 系统变量与路径
  6. ENV JAVA_HOME /usr/java/latest
  7. ENV CATALINA_HOME /home/admin/taobao-tomcat
  8. ENV PATH ${JAVA_HOME}/bin:${PATH}
  9. ENV ADMIN_HOME /home/admin
  10. # 设置 EDAS-Container/Pandora 应用容器版本
  11. ENV EDAS_CONTAINER_VERSION V3.5.4
  12. LABEL pandora V3.5.4
  13. # 下载安装 OpenJDK
  14. RUN yum -y install java-1.8.0-openjdk-devel
  15. # 创建 JAVA_HOME 软链接
  16. RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi
  17. # 根据环境变量,下载安装 EDAS Contaienr/Pandora 应用容器版本
  18. RUN mkdir -p ${CATALINA_HOME}/deploy
  19. 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 && \
  20. tar -xvf /tmp/taobao-hsf.tgz -C ${CATALINA_HOME}/deploy/ && \
  21. rm -rf /tmp/taobao-hsf.tgz
  22. # 下载部署 EDAS 演示 JAR 包
  23. 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
  24. # 将启动命令写入启动脚本 start.sh
  25. 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
  26. WORKDIR $CATALINA_HOME
  27. CMD ["/bin/bash", "/home/admin/start.sh"]

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

  1. FROM centos:7
  2. MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>
  3. # 安装打包必备软件
  4. RUN yum install -y wget unzip telnet lsof net-tools bind-utils
  5. # 准备 JDK/Tomcat 系统变量
  6. ENV JAVA_HOME /usr/java/latest
  7. ENV CATALINA_HOME /home/admin/apache-tomcat-7.0.91
  8. ENV ADMIN_HOME /home/admin
  9. ENV PATH ${JAVA_HOME}/bin:${CATALINA_HOME}/bin:${PATH}
  10. RUN mkdir -p ${ADMIN_HOME}
  11. # 下载安装 OpenJDK
  12. RUN yum -y install java-1.8.0-openjdk-devel
  13. # 创建 JAVA_HOME 软链接
  14. RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi
  15. # 下载安装 Tomcat
  16. 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 && \
  17. tar -xvf /tmp/apache-tomcat-7.0.91.tar.gz -C ${ADMIN_HOME} && \
  18. rm /tmp/apache-tomcat-7.0.91.tar.gz && \
  19. chmod +x ${CATALINA_HOME}/bin/*sh
  20. RUN mkdir -p ${CATALINA_HOME}/deploy
  21. # 增加容器内中文支持
  22. ENV LANG="en_US.UTF-8"
  23. # 增强 Webshell 使⽤体验
  24. ENV TERM=xterm
  25. # 下载部署 EDAS 演示 WAR 包
  26. RUN wget http://edas-hz.oss-cn-hangzhou.aliyuncs.com/demo/1.0/hello-edas.war -O /tmp/ROOT.war && \
  27. unzip /tmp/ROOT.war -d ${CATALINA_HOME}/deploy/ROOT && \
  28. rm -rf /tmp/ROOT.war
  29. # 设定 Tomcat 安装目录为容器启动目录,并采用 run 方式启动 Tomcat,在标准命令行输出 catalina 日志
  30. WORKDIR ${ADMIN_HOME}
  31. CMD ["catalina.sh", "run"]

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

  1. FROM centos:7
  2. MAINTAINER 企业级分布式应用服务EDAS研发团队 <edas-dev@list.alibaba-inc.com>
  3. # 安装打包必备软件
  4. RUN yum install -y wget unzip telnet lsof net-tools bind-utils
  5. # 准备 JDK/Tomcat 系统变量
  6. ENV JAVA_HOME /usr/java/latest
  7. ENV PATH ${JAVA_HOME}/bin:$PATH
  8. ENV ADMIN_HOME /home/admin
  9. # 下载安装 OpenJDK
  10. RUN yum -y install java-1.8.0-openjdk-devel
  11. # 创建 JAVA_HOME 软链接
  12. RUN if [ ! -L "${JAVA_HOME}" ]; then mkdir -p `dirname ${JAVA_HOME}` && ln -s `readlink -f /usr/lib/jvm/java` ${JAVA_HOME}; fi
  13. # 下载部署 EDAS 演示 JAR 包
  14. RUN mkdir -p ${ADMIN_HOME}/app && \
  15. 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
  16. # 增加容器内中⽂支持
  17. ENV LANG="en_US.UTF-8"
  18. # 增强 Webshell 使⽤体验
  19. ENV TERM=xterm
  20. # 将启动命令写入启动脚本 start.sh
  21. RUN mkdir -p ${ADMIN_HOME}
  22. 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
  23. WORKDIR ${ADMIN_HOME}
  24. CMD ["/bin/bash", "/home/admin/start.sh"]

自定义设置 Dockerfile

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

升级 OpenJDK

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

  1. # 下载安装 OpenJDK 9
  2. 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

    1. # 设置 EDAS-Container/Pandora 应用容器版本
    2. ENV EDAS_CONTAINER_VERSION V3.5.4
  4. 重新制作并发布应用镜像。

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

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

  1. # 设置 EDAS 应用 JVM 参数
  2. ENV CATALINA_OPTS ${EDAS_CATALINA_OPTS}
  3. # 设置 JVM 参数
  4. ENV JAVA_OPTS="\
  5. -Xmx3550m \
  6. -Xms3550m \
  7. -Xmn2g \
  8. -Xss128k"

在本地构建镜像

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

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

例如:

  1. docker build -t hsf-provider:1.0.0 .

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

上传镜像到镜像仓库

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

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

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

例如:

  1. docker login --username=tdy218@gmail.com registry.cn-hangzhou.aliyuncs.com
  2. docker tag 2b64f63601a7 registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0
  3. docker push registry.cn-hangzhou.aliyuncs.com/webapps/hsf-provider:1.0.0

将镜像推送到Registry

镜像创建规约

通过 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 启动参数