【小试牛刀】基于JDK1.8镜像,构建项目一键自动化部署到docker

项目背景

经常在Github或者Gitee的开源平台上看到应用的多种部署方式。很多应用已经支持docker compose编排工具一键打包部署运行了。
例如,若依项目支持的应用一键编排部署,如下:
image.png
因为是一键部署的演示,这里不应用compose编排技术,直接使用docker完成应用的打包、部署、构建、运行这几个步骤。
docker一键部署项目,学习其精髓即可!这里需要应用到一些简单的Shell脚本知识!

任务目标:

①编写一个JavaWeb的应用,使用脚本对Web项目进行一键打包、应用部署、docker镜像构建、docker运行;
②访问指定接口,返回:HelloWorld即为部署成功;

1、准备一个JavaWeb的Demo项目

项目具体创建过程以及代码过程省略。部署过程会在Linux服务器上进行。

1.1、目录结构

开发目录
image.png
项目上传至服务器后文件目录
image.png

1.2、部分代码示例

image.png

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

image.png
image.png
image.png

2.4、访问测试

image.png
image.png

至此完成了脚本一键部署项目。

写到最后

总体说本章没有特殊内容,它整合了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.

image.png

猜你喜欢

转载自blog.csdn.net/dongzi_yu/article/details/129629971