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脚本集成到项目根目录中,就可以愉快的使用了。
总结
猜你喜欢
- 前言春节要到了,看惯了前端各种小游戏,确实做得很好,很精致。但是我也要为后端程序员稍微做一点贡献,做一款java版本的【年兽大作战】。这个游
- 本文介绍IntelliJ IDEA中Project 窗口的一些设置技巧,参考IntelliJ IDEA 简体中文专题教程,英文好的同学可以查
- @RequestMapping和@GetMapping @PostMapping的区别最近学习看一些代码,发现对于发送请求这件事,有的地方用
- 假设下面是你的视频网站链接列表,如果别人想爬取你的数据十分轻松,看规则就知道数据库是序列自增的http://www.xxxx.com/vid
- 前言在工作中遇到这样一个问题:开发过程中将数据库的账号、密码等信息配置在了一个单独的properties配置文件中(使用明文)。但运维人员要
- 人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中?这里浅谈Java中的栈和堆首先,将结论写在前
- 首先是.select在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。其中要注意的细节:wrapper.s
- 前言好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf
- 先看下效果:两种需求场景:1.广告页3s后跳转到首页2.短信验证码60s倒计时第一种的话,根据需求我们可以知道,我们想要的效果就是3s结束做
- 01-前言:什么是循环依赖?首先,我们先明确下依赖的定义。 如果一个 Bean bar 的属性,引用了容器中的另外一个 Bean foo,那
- 我们首先看下BASEJDBC的写法实例:package com.dao;import java.sql.Connection;import
- 现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单。 首先你需要配置好
- 使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址、文本等)生成二维码并放在该位置,最后加上立牌编号。步骤:1).
- 在前面一篇Java Comparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对 Compa
- 前言泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它。毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确
- 接口等幂性通俗的来说就是同一时间内,发起多次请求只有一次请求成功;其目的时防止多次提交,数据重复入库,表单验证网络延迟重复提交等问题。比如:
- 由于springboot常用war包部署,改为cloud开发模式多端口情况下,部署反而不习惯毕竟,war包要不要项目名访问都必须放在tomc
- RocketMQ发送消息我们在使用RocketMQ发送消息时,一般都会使用DefaultMQProducer,类型的代码如下:Default
- 本文实例为大家分享了Java界面编程实现界面跳转的具体代码,供大家参考,具体内容如下在事件处理中创建对象public void action
- 代码背景一个班级,有两类学生,A类:不学习,玩,但是玩的东西不一样,有的是做游戏,有的是看电视B类:放哨的学生,专门看老师的动向,如果老师进