使用 Docker 搭建前端 Java 開發環境

這篇文章是爲了解決先後端開發沒有完全分離的坑,由於我司用的是java,入職第一天就是搭建本地開發環境,看見了多年不見的eclipse的圖標出現個人電腦上,我是難過的。後來知道並非我一我的有此感覺。依稀記得有個同窗整整一天項目都沒跑起來的崩潰感。爲了解決這個問題咱們嘗試了不少方案,可是大大小小都有許多坑。
直到有一天....我坐在地鐵上,看着對面的妹子發呆,突然一道閃電滑過,地鐵忽然停了!
爲何我忽然想不起當天那個妹子長什麼樣子了~好惆悵。前端

解決的痛點

  1. 免搭建後端開發環境。java

  2. 開發環境改變只須要改變鏡像就能同步更新。git

  3. 不須要eclipse等IDE工具。web

  4. 切換開發項目docker

解決思路

利用docker啓動Ubuntu鏡像,在容器中搭建好項目須要的開發環境,使用掛載卷將本地代碼掛載到容器中,使用容器中的環境編譯運行代碼,宿主機經過 docker 暴漏出的端口訪問容器中的服務,這樣前端的開發機上就只須要部署docker就搞定了。shell

關於docker

瞭解docker

本文並不打算細講docker的知識,相關的文章有不少,若是有興趣能夠看 這本書,對於docker的使用我也僅限於此工具的開發,若是有不對的地方還有你們指出來。ubuntu

加速器

daocloud 加速器後端

搭建環境

下載和安裝好docker以後咱們就能夠開始了,咱們下面講的都是java,不過其餘環境同理。瀏覽器

獲取 Ubuntu 鏡像。

docker pull ubuntutomcat

完成後執行 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腳本集成到項目根目錄中,就能夠愉快的使用了。

感謝

特別感謝我司 @董珂 @海峯 @賓哥 幾位同窗提供的幫助!謝謝。

相關文章
相關標籤/搜索