(1) 首先要有一個可以工作的SpringBoot應用。
從Jerry的
github上clone這個github repository到本地:
cd進入項目檔案夾内,使用指令行mvn spring-boot:run
當看到控制台輸出 Tomcat started on port: 5030(http)的提示後,說明SpringBoot應用在本地啟動成功,
這時用下面的url可以通路這個SpringBoot應用,如果一切正常,
http://localhost:5030/commerce/product可以在浏覽器裡看到Hello World:
祝:該SpringBoot應用監聽的端口為5030,如果想修改成其他端口,在application.properties裡修改。
(2) 下一步是登入阿裡雲伺服器,将該SpringBoot打包成Docker鏡像。
我的github倉庫裡已經寫好了一個Dockerfile檔案,Docker鏡像就是基于該Dockerfile進行制作。
第一行的FROM指令,指定了我們這個鏡像基于openjdk這個鏡像制作。
第二行的VOLUME指令,定義了一個持久化存儲,指向容器中的tmp檔案夾。SpringBoot應用為内置的Tomcat伺服器執行個體建立的預設工作目錄為tmp,通過該指令,可以在運作Docker的主控端目錄/var/lib/docker建立一個臨時的目錄,挂接到容器内部的tmp去。
如果你的SpringBoot應用不會進行持久化寫操作,則該步驟可以省略。
第三行,把本地目錄下target檔案夾裡打好的jar檔案添加到容器裡,重命名為app.jar.
第四行:ENV指令的作用是設定環境變量。在複雜的使用場景中,我們可能需要使用各種參數啟動JVM,這些參數通過ENV指令設定的環境變量傳入Java指令。在這個簡單的例子裡可以省略環境變量的設定。
第五行:ENTRYPOINT,顧名思義,容器鏡像運作的起始點。
了解了這個Dockerfile的作用和文法後,我們使用docker build基于這個Dockerfile生成一個鏡像。
docker build -t jerry/springbootexample:v1 .
上面指令行最後的"."并不是表示結束的标點符号,而是Linux系統裡的".", 代表目前目錄。
執行上述指令行後,會看到我們在Dockerfile裡定義的5條指令被依次執行,首先是下載下傳openJDK這個基礎鏡像:
然後依次執行剩餘步驟。
看到Successfully built 提示消息後,說明該鏡像成功建立了。
使用docker images指令行能看到這個鏡像,大小為136MB.
(3) 最後,就是使用docker run指令執行這個鏡像。
run指令有很多參數,比如以互動式方式運作鏡像:
docker run -it jerry/springbootexample:v1
這種方式下,鏡像處理使用者請求時的輸出會自動重定向到主控端的控制台上。
而-p參數可以實作端口映射,下面指令行的含義是把Docker内SpringBoot應用監聽的端口映射到主控端的8000端口。這樣,當使用者在浏覽器裡通路時,使用的端口應該是主控端的端口8000.
docker run -p 8000:9000 --name jerrydockerdemo -d jerry/springbootexample:v1
可以使用docker ps指令拿到該運作鏡像的ID,再用docker stop指令終止鏡像的運作。
也可以使用指令docker exec -it, 進入一個正在運作的容器内部:
sudo docker exec -it 8302db78f838 /bin/sh
我們之前在編寫Dockerfile時,用VOLUME指令建立的tmp,此時進入容器内部就可以觀察到了。在tmp裡,果然發現了SpringBoot在執行過程中,其内置的Tomcat執行個體運作時工作目錄下生成的資料。
本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。