其实不集成docker也能实现自动部署,那为啥还要集成docker呢?
docker的优势在于可快速部署到其它环境中,包括其它额外的环境。
下面以一个真实案例进行部署
其它步骤同“构建、部署到服务器并执行脚本”,不同之处在于远程执行shell脚本
编写shell脚本,实现自动构建镜像文件Dockerfile并构建、运行
devops.sh脚本如下:
#!/bin/bash
# this script function is :
# deploy new docker container
#
# USER YYYY-MM-DD - ACTION
# youpanpan 2019-01-28 - CREATED
parasnum=5
# function
help_msg()
{
cat << help
+ Error Cause:
+ you enter $# parameters
+ the total paramenter number must be $parasnum
+ 1st :DOCKER_NAME
+ 2nd :PROJECT_NAME
+ 3rd :PROJECT_VERSION
+ 4th :SOURCE_PORT
+ 5th :DESTINATION_PORT
help
}
# Check parameter number
if [ $# -ne ${parasnum} ]
then
help_msg
exit
fi
# Initialize the parameter.
DOCKER_NAME=$1
PROJECT_NAME=$2
PROJ_VERSION=$3
SPORT=$4
DPORT=$5
PROJ_VERSION=${PROJ_VERSION/"origin/"/""}
DOCKER_FILE="/usr/local/dockerfiles/${DOCKER_NAME}/Dockerfile"
DOCKER_FILE_DIR=/usr/local/dockerfiles/${DOCKER_NAME}
if [ ! -d ${DOCKER_FILE_DIR} ]; then
mkdir -p ${DOCKER_FILE_DIR}
fi
source usr/local/dockerfiles/scripts/mvjar.sh
# check docker images
DOCKER_IMAGE=`/usr/bin/docker images | grep ${DOCKER_NAME} | awk -F ' ' '{print $3}'`
if [ -n "${DOCKER_IMAGE}" ]; then
# check docker container
for dc in `/usr/bin/docker ps -a | grep ${DOCKER_NAME} | awk -F " " '{print $1}'`
do
echo "Stop container: ${dc}"
/usr/bin/docker stop ${dc}
# delete while docker container was exists
echo "##Delete exists Container_Id: "${dc}
/usr/bin/docker rm ${dc}
done
# delete while docker image was exists
echo "#Delete exists Image: "${DOCKER_IMAGE}
/usr/bin/docker rmi ${DOCKER_IMAGE}
fi
# Init dockerfile
echo "**Init dockerfile start: "${DOCKER_FILE}
echo "FROM jdk" > ${DOCKER_FILE}
echo 'MAINTAINER youpanpan "youpp@gswlgf.com"' >> ${DOCKER_FILE}
echo "ADD ${PROJECT_NAME}.jar ${PROJECT_NAME}.jar" >> ${DOCKER_FILE}
echo "EXPOSE 8988" >> ${DOCKER_FILE}
echo "ENTRYPOINT java -jar ${PROJECT_NAME}.jar --spring.profiles.active=test" >> ${DOCKER_FILE}
cat ${DOCKER_FILE}
echo "**Init dockerfile end."
# copy jar to current dockerfile dir
cp /usr/local/www/gs/gs-om-ms/target/${PROJECT_NAME}.jar ${DOCKER_FILE_DIR}/${PROJECT_NAME}.jar
# Build dockerfile
cd ${DOCKER_FILE_DIR}
echo ""
echo "##Build dockerfile for "${DOCKER_NAME}
/usr/bin/docker build -t ${DOCKER_NAME}:${PROJ_VERSION} .
# Run docker container
echo ""
echo "##Running docker container: "${DOCKER_NAME}
/usr/bin/docker run --name ${DOCKER_NAME}_d1 -d -p ${SPORT}:${DPORT} ${DOCKER_NAME}:${PROJ_VERSION}
mvjar.sh脚本如下:
#!/bin/bash
cur_dateTime="`date +%Y-%m-%d-%H%Mss`"
#切换用户到root
sudo -s<<EOF
#将原先的jar备份
mv /usr/local/www/gs/gs-om-ms/target/gs-om-ms.jar /usr/local/www/gs/gs-om-ms/target/gs-om-ms-${cur_dateTime}.jar
#将新构建的jar重命名为运行命令需要的jar
mv /usr/local/www/gs/gs-om-ms/target/gs-om-ms-1.0-SNAPSHOT.jar /usr/local/www/gs/gs-om-ms/target/gs-om-ms.jar
echo "jenkins jar success"
EOF
其实上述做的事情就是:
1、将通过SSH PUSH上去的jar进行移动并将以前的jar进行备份
2、删除以前运行的容器及镜像
3、在指定的目录下新建Dockerfile文件,并echo指定的内容
具体的Dockerfile文件内容如下:
FROM jdk
MAINTAINER youpanpan "youpp@xxx.com"
ADD gs-om-ms.jar gs-om-ms.jar
EXPOSE 8988
ENTRYPOINT java -jar gs-om-ms.jar --spring.profiles.active=test
4、将应用jar copy到当前Dockerfile的目录下
5、编译镜像
6、运行镜像
注:
ENTRYPOINT有两种格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
第一种格式中的变量不会被替换,第二种可以,所以这里使用了第二种
echo "ENTRYPOINT java -jar ${PROJECT_NAME}.jar --spring.profiles.active=test" >> ${DOCKER_FILE}
且必须用双引号括起来,单引号还不行
本人开发的一个网站:编程之道,欢迎来踩!!!