文章目录

  • 项目背景
  • 1、准备一个JavaWeb的Demo项目
  • 1.1、目录结构
  • 1.2、部分代码示例
  • 2、部署脚本准备
  • 2.1、准备Dockerfile镜像构建文件
  • 2.2、准备一键部署Shell脚本
  • 2.3、运行一键部署命令&查看部署结果
  • 2.4、访问测试
  • 写到最后
  • 参考链接


项目背景

经常在Github或者Gitee的开源平台上看到应用的多种部署方式。很多应用已经支持docker compose编排工具一键打包部署运行了。

例如,若依项目支持的应用一键编排部署,如下:

java网站一键部署 java项目一键部署_自动化


因为是一键部署的演示,这里不应用compose编排技术,直接使用docker完成应用的打包、部署、构建、运行这几个步骤。

docker一键部署项目,学习其精髓即可!这里需要应用到一些简单的Shell脚本知识!

任务目标:

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

1、准备一个JavaWeb的Demo项目

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

1.1、目录结构

开发目录

java网站一键部署 java项目一键部署_linux_02


项目上传至服务器后文件目录

java网站一键部署 java项目一键部署_Dockerfile_03

1.2、部分代码示例

java网站一键部署 java项目一键部署_docker_04

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

java网站一键部署 java项目一键部署_java网站一键部署_05


java网站一键部署 java项目一键部署_自动化_06


java网站一键部署 java项目一键部署_docker_07

2.4、访问测试

java网站一键部署 java项目一键部署_Dockerfile_08


java网站一键部署 java项目一键部署_linux_09

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

写到最后

总体说本章没有特殊内容,它整合了maven项目编译docker镜像构建的两个步骤,并使用了Shell脚本实现一键自动化部署。

参考链接

https://zhuanlan.zhihu.com/p/34510815

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.

java网站一键部署 java项目一键部署_自动化_10