制作容器镜像

最近更新时间:2024-05-29 10:39:21

我的收藏
本文介绍通过 Spring Cloud 应用和 Mesh 应用制作容器镜像的操作方法。
关于 JDK 版本,推荐使用 Tencent KonaJDK,请下载 KonaJDK 安装文件(下载地址)。

准备构建材料

Spring Cloud 应用构建材料

1. 简化版本
简化版本的 Dockerfile 不包含文件配置和 JVM 监控功能,仅需要用户替换掉 Dockerfile 中 Spring Cloud 应用 jar 包名称,您也可以先试用 TSF 提供的 Spring Cloud 应用 Demo JAR 包(下载地址)。
注意
在 Spring Cloud 应用 JAR 包同级目录下编写 Dockerfile。
KonaJDK
OpenJDK
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
#安装 KonaJDK
ADD ./java-8-konajdk.rpm /java-8-konajdk.rpm
RUN yum update -y && yum install -y java-8-konajdk.rpm

# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
# 考虑到容器场景对于内存的要求,建议添加-Xshare:off选项关闭CDS功能
CMD ["sh", "-ec", "exec java ${JAVA_OPTS} -Xshare:off -jar ${jar}"]
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
RUN yum update -y && yum install -y java-1.8.0-openjdk

# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
CMD ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar}"]
2. 使用 JVM 监控功能
如果您希望使用 JVM 监控 功能,则需要在 Dockerfile 中增加 JVM 监控组件 TencentCloudJvmMonitor-1.3.1下载地址),JVM 监控包相关版本更新列表请查看文档,然后在 CMD 命令中启动该组件。
注意
将 Spring Cloud 应用 JAR 包和 JVM 监控组件放在同级目录下,并在该目录下编写 Dockerfile。
KonaJDK
OpenJDK
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
#安装 KonaJDK
ADD ./java-8-konajdk.rpm /java-8-konajdk.rpm
RUN yum update -y && yum install -y java-8-konajdk.rpm

# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar 包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# JVM 监控组件要和您的 Dockerfile 位于同一级目录,并创建 JVM 监控数据采集目录
ENV agentjar TencentCloudJvmMonitor-1.3.1-RELEASE.jar
# 若容器的基础版本为 非 gnu-libc 版本,如 Alpine,请添加如下语句
# RUN ln -sf /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
COPY ${agentjar} ${workdir}

RUN mkdir -p /data/tsf_apm/monitor/jvm-metrics/

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
# 使用 JVM监控功能需要加上 gclog 和 javaagent 的配置, 否则将无法提供 jvm 监控能力
# 考虑到容器场景对于内存的要求,建议添加-Xshare:off选项关闭CDS功能
CMD ["sh", "-ec", "exec java -Xloggc:/data/tsf_apm/monitor/jvm-metrics/gclog.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=8 -XX:GCLogFileSize=50M -javaagent:${workdir}/${agentjar}=hascontroller=true ${JAVA_OPTS} -Xshare:off -jar ${jar}"]
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
RUN yum update -y && yum install -y java-1.8.0-openjdk
# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar 包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# JVM 监控组件要和您的 Dockerfile 位于同一级目录,并创建 JVM 监控数据采集目录
ENV agentjar TencentCloudJvmMonitor-1.3.1-RELEASE.jar
# 若容器的基础版本为 非 gnu-libc 版本,如 Alpine,请添加如下语句
# RUN ln -sf /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
COPY ${agentjar} ${workdir}

RUN mkdir -p /data/tsf_apm/monitor/jvm-metrics/

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
# 使用 JVM监控功能需要加上 gclog 和 javaagent 的配置, 否则将无法提供 jvm 监控能力
CMD ["sh", "-ec", "exec java -Xloggc:/data/tsf_apm/monitor/jvm-metrics/gclog.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -verbose:gc -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=8 -XX:GCLogFileSize=50M -javaagent:${workdir}/${agentjar}=hascontroller=true ${JAVA_OPTS} -jar ${jar}"]
3. 使用文件配置
如果您希望使用 TSF 文件配置 功能,则需要在 Dockerfile 中增加文件配置组件 tsf-consul-template-docker.tar.gz下载地址),然后在 CMD 启动命令中启动该组件。
KonaJDK
OpenJDK
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
#安装 KonaJDK
ADD ./java-8-konajdk.rpm /java-8-konajdk.rpm
RUN yum update -y && yum install -y java-8-konajdk.rpm

# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# tsf-consul-template-docker 用于文件配置功能,如不需要可注释掉该行
ADD tsf-consul-template-docker.tar.gz /root/

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
# 考虑到容器场景对于内存的要求,建议添加-Xshare:off选项关闭CDS功能
CMD ["sh", "-ec", "sh /root/tsf-consul-template-docker/script/start.sh; exec java ${JAVA_OPTS} -Xshare:off -jar ${jar}"]
私有化版本使用建议:
私有化的 TSF 要支持 stdout 日志,需要在启动命令中将 stdout 及 stderr 重定向到一个文件中。将上文的CMD一行替换成:
RUN mkdir -p /data/tsf_std/stdout/logs
CMD ["sh", "-ec", "exec java ${JAVA_OPTS} -Xshare:off -jar ${jar} 2>&1 > /data/tsf_std/stdout/logs/sys_log.log"]
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
RUN yum update -y && yum install -y java-1.8.0-openjdk
# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# tsf-consul-template-docker 用于文件配置功能,如不需要可注释掉该行
ADD tsf-consul-template-docker.tar.gz /root/

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
CMD ["sh", "-ec", "sh /root/tsf-consul-template-docker/script/start.sh; exec java ${JAVA_OPTS} -jar ${jar}"]
私有化版本使用建议:
私有化的 TSF 1.12 及之前版本要支持 stdout 日志,需要在启动命令中将 stdout 及 stderr 重定向到一个文件中。将上文的 CMD 一行替换成:
RUN mkdir -p /data/tsf_std/stdout/logs
CMD ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar} 2>&1 > /data/tsf_std/stdout/logs/sys_log.log"]

Mesh 应用构建材料

1. 下载 Mesh 应用 Demo 包:tsf_mesh_demo_java_docker
2. 在 tar.gz 包同级目录下,编写 Dockerfile 文件:
KonaJDK
OpenJDK
FROM centos:7
# 添加 KonaJDK 安装包
ADD ./java-8-konajdk.rpm /java-8-konajdk.rpm
# 安装 KonaJDK
RUN yum update -y && yum install -y /java-8-konajdk.rpm

RUN mkdir /root/app/
# 其中 userService.tar.gz 是 Mesh 应用压缩包
ADD userService.tar.gz /root/app/
# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT ["bash","/root/app/userService/start.sh"]
FROM centos:7
RUN yum update -y && yum install -y java-1.8.0-openjdk

RUN mkdir /root/app/
# 其中 userService.tar.gz 是 Mesh 应用压缩包
ADD userService.tar.gz /root/app/
# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT ["bash","/root/app/userService/start.sh"]
Mesh 应用压缩包解压后的文件目录结构及文件规范参见 Mesh Demo 介绍

使用文件配置功能

如果容器应用需要使用 TSF 文件配置功能,需要修改 Dockerfile,具体使用指引参见 文件配置 > 前提条件

构建镜像

1. Dockerfile所在目录执行build命令:
docker build . -t ccr.ccs.tencentyun.com/tsf_<主账号 ID>/<应用名>:[tag]
其中<主账号 ID>对应用户腾讯云的主账号 ID(注意不是当前登录账号 ID,主账号 ID 可以在腾讯云个人信息页面获取。),<应用名>表示控制台上的应用名。tag为镜像的 tag,用户可自定义。
2. 命令执行完成后,通过 docker image ls 查看创建的镜像。



后续操作

镜像制作完成后,您可以将镜像推送至镜像仓库进行应用部署。推送镜像请参见 镜像管理,部署应用请参见 容器托管应用