文章目录
项目背景
经常在Github或者Gitee的开源平台上看到应用的多种部署方式。很多应用已经支持docker compose
编排工具一键打包部署运行了。
例如,若依项目支持的应用一键编排部署,如下:
因为是一键部署的演示,这里不应用compose
编排技术,直接使用docker完成应用的打包、部署、构建、运行这几个步骤。
docker一键部署项目,学习其精髓即可!这里需要应用到一些简单的Shell脚本
知识!
任务目标:
①编写一个JavaWeb的应用,使用脚本对Web项目进行一键打包、应用部署、docker镜像构建、docker运行;
②访问指定接口,返回:HelloWorld即为部署成功;
1、准备一个JavaWeb的Demo项目
项目具体创建过程以及代码过程省略。部署过程会在Linux服务器上进行。
1.1、目录结构
开发目录
项目上传至服务器后文件目录
1.2、部分代码示例
2、部署脚本准备
2.1、准备Dockerfile镜像构建文件
关于使用Dockerfile构建项目,可以参照:Docker构建JavaWeb项目
# 作者 dongzi
# 描述 dockerfile镜像构建文件
# 基础镜像
FROM docker.io/majiajue/jdk1.8
# 环境变量配置
ENV ENV LC_ALL zh_CN.UTF-8
# 创建一个存放项目文件的目录
RUN mkdir -p /usr/local/app/
# 复制编译打包号的jar包到镜像内/usr/local/app/目录下
# 基于当前项目根目录去复制文件:可以参照deploy.sh 关于docker build说明
COPY target/HelloWorld-1.0.jar /usr/local/app/HelloWorld-1.0.jar
# 启动镜像运行的命令
ENTRYPOINT java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar /usr/local/app/HelloWorld-1.0.jar
2.2、准备一键部署Shell脚本
关于使用maven管理项目,可以参照:Maven管理JavaWeb项目
#!/bin/bash
# 作者 dongzi
# 描述 应用一键部署脚本
# 编译项目并打包
echo "正在编译打包源码..."
rm -rf ./mvn.log
# tee: linux 基于标准的文件输入输出。tee [option] [file]
# https://zhuanlan.zhihu.com/p/34510815
# -f:指定pom.xml所在路径打包
mvn -f ../pom.xml clean package | tee mvn.log
# grep --help
# 在mvn.log中进行正则匹配是否构建成功
buildResult=`grep 'BUILD SUCCESS' mvn.log`
if [[ -z $buildResult ]]
then
echo "项目构建失败...退出,请检查mvn.log --> vi /dz/dz_helloworld/HelloWorld/docker/mvn.log"
exit 0
else
echo "项目构建成功..."
fi
echo "正在检查是否有该项目容器运行..."
# 检查是否有此镜像运行的容器,如果有停止容器,新镜像ID启动
oldImageId=`docker images | grep deploy-helloworld | grep v1.0 | awk '{print $3}'`
oldContainerId=`docker ps | grep $oldImageId | awk '{print $1}'`
# 存在该镜像运行的容器ID
if [[ -n $oldContainerId ]]
then
echo "正在停止容器..."
docker stop $oldContainerId
fi
# 基于当前目录的Dockerfile文件构建一个新镜像: deploy-helloworld:v1.0
# ../:基于上一级目录为根目录去构建文件
echo "开始构建新镜像..."
docker build -f ./Dockerfile -t deploy-helloworld:v1.0 ../
# 构建成功的镜像ID
imageId=`docker images | grep deploy-helloworld | grep v1.0 | awk '{print $3}'`
# 镜像后台运行 By 镜像ID
# -d 后台运行
# -p 9999虚拟机端口和8080Docker端口映射
echo "正在启动容器..."
docker run -d -p 9999:8080 $imageId
echo "启动成功..."
containerId=`docker ps | grep $imageId | awk '{print $1'}`
# 查看容器运行日志
docker logs -f $containerId
2.3、运行一键部署命令&查看部署结果
#HelloWorld项目上传至服务器目录: /dz/dz_helloworld/
目录结构 /dz/dz_helloworld/
– HelloWorld
– docker # 部署脚本所在目录
– src
– pom.xml
– target
#进入docker目录运行deploy.sh脚本
cd /dz/dz_helloworld/HelloWorld/docker
#也可以先给脚本授权
#chmod 755 deploy.sh
#./deploy.sh
bash deploy.sh
2.4、访问测试
至此完成了脚本一键部署项目。
写到最后
总体说本章没有特殊内容,它整合了maven项目编译和docker镜像构建的两个步骤,并使用了Shell
脚本实现一键自动化部署。
参考链接
https://zhuanlan.zhihu.com/p/34510815
https://www.cnblogs.com/leihongnu/p/16288012.html
附
docker run 报错
=================================>
Error response from daemon: driver failed programming external connectivity on endpoint nervous_elion (1754ed8cba3335ce5a1e7ce46b2edeb1ff1c77adf0871963c2d3d694f01f4eea): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9999 -j DNAT --to-destination 172.17.0.2:8080 ! -i docker0: iptables: No chain/target/match by that name.