运用 Docker 搭建前端 Java 开辟环境

这篇文章是为了处置惩罚前后端开辟没有完整星散的坑,由于我司用的是java,入职第一天就是搭建当地开辟环境,看见了多年不见的eclipse的图标涌现我的电脑上,我是难过的。厥后晓得并非我一个人有此感觉。依稀记得有个同砚整整一天项目都没跑起来的崩溃感。为了处置惩罚这个题目我们尝试了很多计划,然则大大小小都有很多坑。
直到有一天….我坐在地铁上,看着劈面的妹子发愣,遽然一道闪电滑过,地铁倏忽停了!
为何我倏忽想不起当天谁人妹子长什么模样了~好难过。

处置惩罚的痛点

  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剧本集成到项目根目次中,就能够够兴奋的运用了。

感谢

特别感谢我司 @董珂 @海峰 @宾哥 几位同砚供应的协助!感谢。

    原文作者:黑血沸腾
    原文地址: https://segmentfault.com/a/1190000006843830
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞