Docker搭建前端Java的开发环境详解
作者:daisy 发布时间:2023-05-21 04:23:25
一、解决的痛点
1、免搭建后端开发环境。
2、开发环境改变只需要改变镜像就能同步更新。
3、不需要eclipse等IDE工具。
4、切换开发项目
二、解决思路
利用docker启动Ubuntu镜像,在容器中搭建好项目需要的开发环境,使用挂载卷将本地代码挂载到容器中,使用容器中的环境编译运行代码,宿主机通过 docker 暴漏出的端口访问容器中的服务,这样前端的开发机上就只需要部署docker就搞定了。
三、关于docker
了解docker
本文并不打算细讲docker的知识,相关的文章有很多,如果有兴趣可以看 这本书,对于docker的使用我也仅限于此工具的开发,如果有不对的地方还有大家指出来。
加速器
daocloud 加速器
四、搭建环境
下载和安装好docker之后我们就可以开始了,我们下面讲的都是java,不过其他环境同理。
获取 Ubuntu 镜像。
docker pull ubuntu
完成后执行 docker images
就能看到一个刚刚更新的镜像了。
进入容器
docker run -it ubuntu
五、安装软件、配置环境变量
首先更新apt-get
apt-get update
接下来就可以使用 apt-get install *
安装你需要的软件了,如果没有就下载安装包自行安装,同时配置好环境变量,这里就不赘述了。
六、启动服务
进入tomcat目录,启动服务,在浏览器打开 0.0.0.0:8080, 如果没有错的话你会看到该服务器无法访问。这是因为我们刚才启动的服务是在docker内,如果不做一些操作的话我们是无法访问到docker内部的服务的。
所以,我们先退出容器
exit
退出之后执行 docker ps -a
,就能看到我们刚才的容器依然还在,可能大多刚接触docker的人都会犯这个错误,以为退出容器之后容器就销毁了,其实不然。
如果我们想再进入这个容器可以执行下面的命令,容器ID请复制自己的。
docker exec -it 容器ID bash
虽然容器还在运行,但是他并没有持久化,为了防止万一,在我们修改容器里面的内容之后尽快持久化。
docker commit 容器ID java
这个命令的意思是将我们容器持久化为一个新的镜像,名字叫java。
启动这个新建的镜像。
docker run -it -p 8080:8080 java
注意看我们的启动命令发生了变化,多了一个 -P 这个命令的意思是将容器内的 8080 端口暴漏到宿主机上。
再次访问 0.0.0.0:8080
,我们就能看到那只小花猫了,真可爱。
刚才那个容器还在占用我们的内存怎么办,干掉他。
docker rm 容器ID
至此我们的第一步已经完成了,接下来我们就要集成我们的代码了。
七、集成代码
我们刚才启动的容器是一个完全的独立的黑盒子,它根本不知道我们的代码再哪里,所以我们就要使用docker的挂载卷让宿主机和容器可以共享目录。
不好意思,我们又要干掉刚才启动的那个容器了。
docker run -it -v /Users/name/web:/opt/root -p 8080:8080 java
我们的启动命令又加入了新成员 -v。这个命令的意思就是将用户根目录下的 web 目录挂在到容器中 /opt/root 目录下。
进入目录后我们就能发现web目录下的文件静静的躺在里面,像是沉睡多年的玛丽苏在等待你的呼唤。
开始呼唤吧。
mvn clean install -U -Plocal -DskipTests
一段时间过后我们就会看到打包成功的提示,将war包copy到 tomcat webapps 目录下,就能访问你的项目了。
至此我们的项目终于跑起来了,但是有几个问题。
1、每次都要跑这么长的命令?好麻烦。
2、每次改代码都要重新打包,时间很长。
3、启动日志怎么看?报错了怎么办?
4、怎么修改前端模板文件不需要重启服务?
基于这些问题,我们就需要写一个脚本来解决了。
八、shell脚本
脚本将提供下面几个指令
-y 更新maven包-编译-打包-发布-启动tomcat
-p 编译-打包-发布-启动tomcat
-r 重启tomcat
-c 重新编译java文件-发布-启动tomcat
-w 监听vm文件,默认5S同步一次
-l 查看tomcat日志
-h 帮助
# 需要变动的变量
#################################################################
# 环境变量,根据conf目录下选择
DEV="local"
#################################################################
# 不需要改动的变量
# war包地址
WAR_URL="/opt/root/target/*.war"
# tomcat 地址
TOM_URL="/usr/share/tomcat7"
# 项目启动地址
TOM_ROOT="${TOM_URL}/webapps"
# 文件监听间隔,单位秒
WT=5
# 拷贝 vm
WC_VM="src/main/webapp/WEB-INF/tpl /usr/share/tomcat7/webapps/ROOT/WEB-INF/"
# 拷贝class
WC_JAVA="target/classes /usr/share/tomcat7/webapps/ROOT/WEB-INF/"
# 通用方法
#
# 使用新包
function newwar(){
# 删除旧包
rm -rf ${TOM_ROOT}/*
# 移动war包
mv ${WAR_URL} ${TOM_ROOT}/ROOT.war
}
# 重启tomcat
function restart(){
# 关闭已启动程序
killall -9 java
# 启动服务
${TOM_URL}/bin/startup.sh
# 输入启动日志
tail -f ${TOM_URL}/logs/catalina.out
}
# 指令处理
while getopts ":yprcwlh" optname
do
case "$optname" in
"y")
echo "更新jar包"
mvn clean install -U -P${DEV} -DskipTests
newwar
restart
;;
"p")
echo "重新打包"
mvn clean package -P${DEV} -DskipTests
newwar
restart
;;
"r")
echo "重启tomcat"
restart
;;
"c")
echo "重新编译并重启服务"
mvn clean compile -P${DEV} -DskipTests
cp -R ${WC_JAVA}
restart
;;
"w")
echo "开始监听vm文件"
# 监听 VM
watch -n ${WT} cp -R ${WC_VM}
;;
"l")
echo "日志"
# 监听 VM
tail -f ${TOM_URL}/logs/catalina.out
;;
"h")
echo " -y 更新maven包-编译-打包-发布-启动一条龙服务"
echo " -p 编译打包发布启动一条龙服务"
echo " -r 重启tomcat"
echo " -c 重新java文件并部署重启服务"
echo " -w 监听vm文件,默认5S同步一次"
echo " -l 查看日志"
echo " -h 帮助"
;;
esac
九、推广到团队
经过上面三步,我们的工具已经建好了,但是怎么让其他人也能使用起来呢?
docker 提供了云服务,如果我们的镜像足够小就可以将镜像推送到云上供团队其他人下载运行,但是我们的镜像已经超过了1G。。。所以我们就不能使用这种方式了。
docker save java -o ./java.tar
使用上面的命令可以将镜像持久化到本地文件 java.tar,然后通过其他手段进行传输到其他同学的机器上,我们使用AirDrop,几分钟的事情。
docker load -i java.tar
其他同学可以通过这个命令将我们的镜像加载到他的docker中。
再将shell脚本集成到项目根目录中,就可以愉快的使用了。
总结


猜你喜欢
- 首次使用idea需要配置哪些东西?最近因为我的eclipse无法配置sts,于是将战场转移至idea,首次使用idea,所有的配置都得重新开
- 前言最近面试时,面试官问了一个列表倒计时效果如何实现,然后脑袋突然懵的了O(∩_∩)O,现在记录一下。运行效果图实现思路实现方法主要有两个:
- java中对List分段操作的实例问题:假设A系统查询出来一个很大很大的List,现在B系统想要得到这个List来导出报表,但是B系统部署环
- 下面给大家介绍C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能,具体代码如下所示:using Syst
- 连接操作redisSpring Boot中操作redis还是需要使用相关的启动器<dependency><groupId&
- eclipse运行tomcat提示端口被占用今天碰到一个问题,在eclipse中运行一个程序,eclipse里面的tomcat一启动就报错说
- 里氏替换原则(LSP)定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能。解释说明:其实LSP是对开闭原则的一个扩展,在OO思想
- 前言C#中提供了比较全面的字符串处理方法,很多函数都进行了封装为我们的编程工作提供了很大的便利。System.String是最常用的字符串操
- 目录功能使用类 SuperAdapter 的作用类 AbsViewHolder 的作用Sample这个适配器我珍藏已久(近两年), 不断看到
- 多线程@Async的使用体验场景导入:可以将大批量的数据insert操作采用多线程的方式并行执行第三方服务的接口调用:由于存在个别第三方服务
- 项目中要使用到在线支付功能 目前常用的在线支付手段主要是 支付宝 和微信。 这里我使用的是支付宝支付,支付宝有个好处就是他有一个沙箱模式 即
- springboot 启动排除某些bean的注入问题:最近做项目的时候,需要引入其他的jar。然后还需要扫描这些jar里的某些bean。于是
- 本文实例为大家分享了C#仿Windows XP自带的扫雷游戏的具体代码,供大家参考,具体内容如下1 题目描述:模仿Windows XP自带的
- 前言MongoDB是一款由C++编写的高性能、开源、无模式的常用非关系型数据库产品,是非关系数据库当 * 能最丰富、最像关系数据库的数据库。它
- 重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在
- 写项目时,要求仿微信朋友圈,双击顶栏置顶,于是封装了双击回调接口,方便大家拿来就用/** * Created by Administrato
- Java的SPI机制实例详解SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或
- 本文实例为大家分享了Android调用系统图库获取图片的具体代码,供大家参考,具体内容如下1、开发工具与关键技术:Eclipse、Andro
- **请注意!请注意!!!**今天讲给大家讲解非常“有用”的设计模式,解释器模式!!!设计模式有三大种类,一种是创建型模式,一种是结构型模式,
- 在Android控件View的文字周围添加图标,供大家参考,具体内容如下在控件TextView文字周围放置图片(基于TextView的But