java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
相信每个人入职第一天就是搭建本地开发环境, 因为我司用的是 java, 看见了多年不见的 eclipse 的图标出现我的电脑上, 我是难过的后来知道并不是我一个人有此感受这篇文章是为了解决前后端开发没有彻底分离的坑, 详细的给大家介绍了利用 Docker 搭建前端 Java 的开发环境
一解决的痛点
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 脚本集成到项目根目录中, 就可以愉快的使用了
来源: http://www.phperz.com/article/18/0219/359655.html