镜像制作
有两种方式制作应用镜像:一种是基于封装好监控功能的基础镜像(推荐),还有一种是基于操作系统的镜像(比如centos7)。选择一种即可。
一、基于百度云官方提供的基础镜像(推荐)
前期准备
1.环境准备
- 在CCE产品上开通镜像仓库,创建命名空间,并记录用户名和密码、命名空间名称
- 一台安装并配置好Docker的机器
2.基础镜像
基础镜像默认包含探针
环境类型 | 说明 | 镜像地址 |
---|---|---|
centos7.1与jdk8 | centos7.1预装jdk8 | hub.baidubce.com/cnap-public/microservice-springcloud:probe2.2.0.2_centos7.1_java8 |
ubuntu18.04与jdk8 | ubuntu18.04预装jdk8 | hub.baidubce.com/cnap-public/microservice-springcloud:probe2.2.0.2_ubuntu18.04_java8 |
基础镜像说明
- jdk8安装路径:/home/java
- 探针安装路径:/home/emcprobe
- 启动脚本start.sh路径:/home
基础镜像使用 "ENTRYPOINT" 设置容器入口,使用基础镜像时(from),需要以 "CMD ["param1","param2"...]" 格式传递用户程序启动命令。基础镜像会接受CMD命令作为参数,启动用户程序。
编写Dockerfile文件
以环境基于 centos7和jdk8 来创建应用provider-demo为例。Dockerfile仅需引用上述提供的基础镜像,并将自己的启动命令写入CMD即可。
使用监控功能的应用
操作步骤:
1、进入到Docker机器存放用户程序的目录下,如/home/appimage。
2、创建Dockerfile文件,内容如下:
#基础镜像镜像地址
FROM hub.baidubce.com/cnap-public/microservice-springcloud:probe2.2.0.2_centos7.1_java8
# 安装应用程序包,推荐/home/app/lib目录下
COPY {BMS_JAR_NAME} /home/app/lib/
# 应用启动命令
CMD ["java","-jar","/home/app/lib/{BMS_JAR_NAME}"]
注意:{BMS_JAR_NAME} 替换为需要部署的程序包的名称。这里的CMD命令仅作为参数向基础镜像ENTRYPOINT命令传递
使用Dockerfile创建镜像
在Dockerfile所在的目录(/home/appimage)执行docker build命令,创建镜像:
docker build -t hub.baidubce.com/[namespace]/[ImageName]:[镜像版本] .
namespace为环境准备中创建的命名空间的名称;ImageName由用户指定所创建镜像的名称;
注意,命令后的 “.”
创建结束后,可以通过docker image ls 或者 docker images命令查看镜像是否创建:
docker image ls
docker images
推送镜像到镜像仓库
镜像制作完成后,将制作的镜像推送到百度云镜像仓库:
docker push hub.baidubce.com/[namespace]/[ImageName]:[镜像版本]
镜像制作与推送完成后,即可在CNAP平台上进行部署。
二、基于操作系统的基础镜像
前期准备
1.环境准备
- 在CCE产品上开通镜像仓库,创建命名空间,并记录用户名和密码、命名空间名称
- 一台安装并配置好Docker的机器
2.代码准备
以创建provider-demo为例:
文件 | 说明 | 下载链接 |
---|---|---|
provider-demo-1.0-SNAPSHOT.jar | 用户的spring cloud 微服务(服务提供者)或者普通java应用包 | 无(用户代码) |
监控探针包 | 支持监控信息的展示 | emcprobe.tar.gz |
将这两个文件放置在Docker机器的同一个目录下,如/home/appimage目录,下文将以此目录为例进行镜像的制作。
编写Dockerfile文件
2.1使用监控功能的应用
操作步骤: 1、进入到Docker机器存放用户程序和凤睛探针包的目录下,如/home/appimage。 2、创建Dockerfile文件,内容如下:
FROM centos:7
# 描述镜像创建者信息,可自定义
MAINTAINER BAIDU
# 设置时区,使得用户应用日志打印可以获取正确的时间
RUN rm -f /etc/localtime & cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# 安装JDK(需手动下载jdk包并放置在Dockerfile相同目录)
ADD jdk-8u191-linux-x64.tar.gz /home/java
# 设置JAVA_HOME
ENV JAVA_HOME /home/java/jdk1.8.0_191
ENV PATH $PATH:$JAVA_HOME/bin
# 安装lsof命令,用于应用诊断
RUN yum update -y && yum install -y lsof
# 设置工作空间,用于部署应用。可自定义。探针会部署在应用的平级目录中
ENV APP_HOME /home/app
# 设置jar包名,用于jar包拷贝。如provider.jar。
ENV JAR_NAME {BMS_JAR_NAME}
# 安装探针包, 用于应用监控
ADD emcprobe.tar.gz $APP_HOME/..
# 安装应用程序包
COPY start.sh ${APP_HOME}/bin/
COPY ${JAR_NAME} ${APP_HOME}/lib/
# 配置工作目录
WORKDIR ${APP_HOME}
# 启动应用
CMD ["/bin/bash", "./bin/start.sh"]
注意:{BMS_JAR_NAME} 替换为需要部署的程序包的名称。
Dockerfile中应用路径可以自定义,监控探针则会部署在应用的平级目录。例如,应用路径默认为/home/app,则监控探针路径为/home/emcprobe。因此,请不要使用'/'做为应用的根目录。 start.sh为应用的启动脚本,该脚本包含反注册逻辑且还会调用监控探针的启动脚本。建议参考此脚本完成自己的启动脚本编写,或者直接使用该脚本,可以快速接入。start.sh脚本需和Dockerfile文件放置在同一目录下。start.sh脚本参考内容如下:
#!/bin/bash
# 用于在注册中心下线服务,若移除可能会导致服务下线延迟
trap "{ stop; sleep 0.5; exit 255; }" EXIT
# 用于应用监控
export EM_APP_HOME=${APP_HOME}
export PID_FILE=${EM_APP_HOME}/log/instance.pid
cd ${EM_APP_HOME}
# 应用启动逻辑
function start_app(){
mkdir -p ${EM_APP_HOME}/log/
# 应用的启动参数用户可自定义。启动后需要将pid写入文件以使用监控功能
$JAVA_HOME/bin/java -jar ${EM_APP_HOME}/lib/${JAR_NAME} &
echo $! > ${PID_FILE}
}
# 该方法为具体的服务下线逻辑
function stop(){
echo "start to kill user process"
if [ -f ${EM_APP_HOME}/log/instance.pid ]; then
ps aux | awk -vpid=$(cat ${PID_FILE}) '$2==pid {print}' | grep $(cat ${PID_FILE}) &> /dev/null
if [ $? -ne 0 ]; then
echo "already stopped!"
return
fi
echo "stopping process "
kill $(cat ${PID_FILE})
for ((i=0;i<40;i++)); do
if [ $i -eq 30 ]; then
kill -9 $(cat ${PID_FILE})
fi
ps aux | awk -vpid=$(cat ${PID_FILE}) '$2==pid {print}' | grep $(cat ${PID_FILE}) &> /dev/null
if [ $? -eq 0 ]; then
echo -n .
sleep 0.5
else
echo " [done]!"
rm ${EM_APP_HOME}/log/instance.pid
break
fi
done
fi
}
# 启动应用
start_app
# 启动监控探针
cd ${EM_APP_HOME}/../emcprobe
bash ./bin/start.sh
使用Dockerfile创建镜像
在Dockerfile所在的目录(/home/appimage)执行docker build命令,创建镜像:
docker build -t hub.baidubce.com/[namespace]/[ImageName]:[镜像版本] .
namespace为环境准备中创建的命名空间的名称;ImageName由用户指定所创建镜像的名称;
注意,命令后的 “.”
创建结束后,可以通过docker image ls 或者 docker images命令查看镜像是否创建:
docker image ls
docker images
推送镜像到镜像仓库
镜像制作完成后,将制作的镜像推送到百度云镜像仓库:
docker push hub.baidubce.com/[namespace]/[ImageName]:[镜像版本]
镜像制作与推送完成后,即可在CNAP平台上进行部署。
三、历史版本
2020-9-08 2.2.0.2 最新版本
- 优化trace消息生成: 去除微服务框架相关心跳、拉取配置请求、spring注解相关插件 的trace消息
- 支持全新的拓扑展示,适配http和rpc调用场景
- 修复新老版本探针兼容问题
环境类型 | 说明 | 镜像地址 |
---|---|---|
centos7.1与jdk8 | centos7.1预装jdk8 | hub.baidubce.com/cnap-public/microservice-springcloud:probe2.2.0.2_centos7.1_java8 |
ubuntu18.04与jdk8 | ubuntu18.04预装jdk8 | hub.baidubce.com/cnap-public/microservice-springcloud:probe2.2.0.2_ubuntu18.04_java8 |
监控探针包 | 支持监控信息的展示 | emcprobe-2-2-0-2.tar.gz |
2020-6-5 2.1.1.2
- 新增okhttp3 插件
环境类型 | 说明 | 镜像地址 |
---|---|---|
centos7.1与jdk8 | centos7.1预装jdk8 | hub.baidubce.com/cnap-public/microservice-springcloud:probe2.1.1.2_centos7.1_java8 |
ubuntu18.04与jdk8 | ubuntu18.04预装jdk8 | hub.baidubce.com/cnap-public/microservice-springcloud:probe2.1.1.2_ubuntu18.04_java8 |
监控探针包 | 支持监控信息的展示 | emcprobe-2-1-1-2.tar.gz |