一、部署环境
环境 | 值 |
---|---|
服务器 | 阿里云ECS服务器 |
服务器名称 | campusappserver |
操作系统 | centos7.06 |
nginx | 1.1.10 |
开放端口 | 80、443 |
二、部署思路
1、使用jenkins+docker容器实现基于服务的自动化部署。
2、自动化部署范围:各个微服务以及微服务依赖的公共模块、基础框架和eurake注册中心。不包括微服务注册依赖的sidecar,sidecar需要手动部署。
3、基于tomcat:8-jre8的基础镜像,包括了运行web应用的环境,Dockfile参考附录。
4、应用代码存放在宿主机器,运行docker容器时,将应用根目录挂载至容器的/usr/local/tomcat/webapps/ROOT目录中。
5、日志存放在容器中,重启后日志数据会丢失,也考虑挂载到宿主机的日志目录下。
6、应用上传的文件存放到ftp服务器中,考虑在宿主机搭建ftp服务器供所有应用共用。
7、自动部署步骤
拉取最新代码编译成war包 → 将war包拷贝到应用根目录并解压 → 将对应容器停止 → 启动容器 → 部署完成。
三、开机启动
启动项 | 启动方法 |
---|---|
数据盘挂载 | 用 blkid 获取磁盘的uuid和属性 vim /etc/fstab UUID=************* /data ext4 defaults 1 1 启动/data为挂载的目录 |
redis | vim /etc/init.d/redis_6379 追加 # chkconfig: 2345 90 10 # description: Redis is a persistent key-value database //设置开机执行redis脚本 chkconfig redis_6379 on 参考链接 https://www.cnblogs.com/renzhicai/p/7773080.html |
nginx | 参考链接 https://www.cnblogs.com/piscesLoveCc/p/5867900.html |
docker | systemctl enable docker.service |
jenkins节点 | crontab -e添加定时任务启动节点脚本 /home/tomcat/jenkins-agent-check.sh |
服务容器 | 使用–restart=always参数启动容器 docker run --restart=always |
sidecar | vi /etc/rc.d/rc.local 在末尾添加一行> /home/tomcat/autorun_sidecar.sh //赋权可执行 chmod +x /etc/rc.d/rc.local |
四、常见问题
1、怎样进入运行中的容器?
docker exec -it 容器名称 /bin/bash
2、怎样查看应用输出的日志?
进入容器后,应用日志默认输出到/log/zmeg_new目录下。
3、sidecar日志输出目录在哪里?
/home/tomcat/log/*_sidecar.log
五、附录
1、campus镜像Dockerfile
FROM tomcat:8-jre8
LABEL author="neo"
LABEL company="gzzm"
RUN rm -rf /usr/local/tomcat/webapps/* && mkdir /usr/local/tomcat/webapps/ROOT
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
生成镜像:docker build -t campus/1.0 .
2、eurake镜像Dockerfile
FROM java:8-jre
LABEL author="neo"
LABEL company="gzzm"
COPY target/microservice-eureka-1.0-SNAPSHOT.jar /microservice-eureka.jar
COPY src/main/resources/application-docker.yml /config/application.yml
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/microservice-eureka.jar"]
3、autorun_sidecar.sh
开机启动各服务依赖的sidecar以及网关gateway-zuul的脚本,新增加的sidecar需要在该脚本中增加启动脚本。
#!/bin/bash
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-zmeg/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-zmeg.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-campus/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-campus.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-weixin/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-weixin.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-device/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-device.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-attendance/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-attendance.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-education/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-education.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-sidecar-social/target/microservice-sidecar-1.0-SNAPSHOT.jar >> /home/tomcat/log/sidecar-social.log 2>&1 &
nohup java -jar /home/tomcat/application/microservice/microservice-gateway-zuul/target/microservice-gateway-zuul-1.0-SNAPSHOT.jar >> /home/tomcat/log/gateway-zuul.log 2>&1 &
4、微服务容器控制文件*_control.sh
#!/bin/bash
stop(){
docker stop campus1.0
docker rm campus1.0
}
start(){
docker run --restart=always -itd --name campus1.0 -p18080:8080 -v /home/tomcat/application/campus_campus:/usr/local/tomcat/webapps/ROOT campus/1.0
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 5
start
;;
*)
echo "usese:$0 start|stop|restart"
;;
esac
服务的控制脚本,用于手动启动、停止、重启容器。新增加的服务需要增加对应的控制脚本。
红色标识为需要修改的项:
campus1.0为容器的名称,作为停止容器的唯一标识。
18080为从容器中映射到宿主机的端口。
campus_campus为应用所在目录
5、docker_autobuild.sh
自动部署脚本
#!/bin/bash
projectdir=${APP_ROOT}/${JOB_BASE_NAME}/
cp ${WORKSPACE}/target/${warname} ${projectdir}
cd ${projectdir}
jar -xvf ${warname}
docker stop ${containername}
docker rm ${containername}
docker run --restart=always -itd --name ${containername} -p${port}:8080 -v ${projectdir}:/usr/local/tomcat/webapps/ROOT ${imagename}
Jenkins上的任务名称需要与应用目录名称一致,例如jenkins上的任务名称为campus_campus,在服务器中对应的是/home/tomcat/application/campus_campus应用。
为了让campus_common和zmeg_new两个公共的更新任务能使用标准的更新脚本,在任务中配置了JOB_BASE_NAME参数,用于覆盖jenkins自带的任务名称(campus_common或zmeg_new)。
在更新脚本中,经常需要引用应用所在的根目录/home/tomcat/application,在节点中配置了APP_ROOT环境变量,供更新脚本引用。