容器技術,Docker,虛拟化,這些名詞誕生盡管有很長一段時間了,但是在雲原生開發領域仍舊熱度不減。甚至連SAP賴以成名的ABAP Netweaver,如今也踏上了容器化的上雲探索之路,比如下面這張來自SAP社群的一篇部落格: Proof of Concept: Deploying ABAP in Kubernetes
今天咱們暫時不聊ABAP的容器化,先從最簡單的概念開始。網絡上關于Docker容器的技術文章多如牛毛,Jerry也就不再重複了,我還是緊扣SAP技術和SAP解決方案來寫。
如果有一個已經能夠正常運作的Java應用,可以将其以Docker容器的方式,部署且運作在SAP雲平台上嗎?當然可以,而且隻需要簡單的幾個指令行即可。
本文接下來的步驟是針對那些聽說過Docker容器技術,但尚未動手實踐過的朋友。通過閱讀本文,可以了解将Java應用容器化并部署到SAP雲平台運作的大緻步驟。您也可以根據本文的步驟動手試一試,隻需要在本地搭一個最簡單的Java開發環境,安裝Docker用戶端和申請一個SAP雲平台的trial賬号即可。
(1) 首先得有一個能在本地正常運作的SpringBoot應用。如果沒有,百度之然後自己動手做一個。
如果實在不想自己動手,從Jerry的
github倉庫上克隆一個下來也行:
本地配置好maven和JDK之後,直接用指令行啟動它:
mvn spring-boot:run
你會看到Tomcat started on port 8000的提示,意思是該應用已經成功啟動,監聽在本地端口8000上。
浏覽器裡輸入localhost:8000/product, 看到Hello World. 至此,我們就有了一個本地正常運作的SpringBoot應用了,下一步是将其打包成Docker鏡像。
(2) 在SpringBoot項目裡建立一個名叫Dockerfile的檔案,輸入以下内容:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
VOLUME /log
EXPOSE 8080
ADD target/prolikeService.jar app.jar
ENV JAVA_OPTS="-Dserver.port=8080"
ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar
這實際是一個指令檔案,Docker用戶端會根據裡面的内容,制作一個Docker鏡像。
簡要介紹每一行内容的含義。
第一行:指定待制作的鏡像是基于名叫openjdk:8-jdk-alpine的鏡像,在Docker Hub網站上能找到更多關于該鏡像的說明:
https://hub.docker.com/_/openjdk第二行和第三行:定義兩個名叫tmp和log的持久化存儲。容器運作時産生的資料,随着容器的銷毀而銷毀,但有時我們又希望這些資料能夠持久化儲存,比如需要分析某個容器運作時産生的日志檔案,這時可以使用Dockerfile裡VOLUME關鍵字提供的容器持久化技術,建立所謂的“卷”,将容器應用運作時寫入資料的目錄,映射到主控端上的某個目錄下。
如果一個容器尚處在運作狀态,我們可以用指令行進入容器内部,檢視log檔案夾裡的運作日志檔案
docker exec -it 8302db78f838 /bin/sh
如果該容器已經銷毀,我們就可以到主控端的/var/lib/docker/volumes目錄下,檢視持久化的日志檔案:
第五行:把目前項目通過maven打包而成的jar包拷貝到容器内部,重命名為app.jar
第六~七行:設定JVM啟動參數,暴露8080端口給外部。
Dockerfile檔案編寫完畢後,使用指令行制作鏡像:
docker build -t i042416/springbootexample:v1 .
v1代表該鏡像的标簽,指令行尾部的句号代表目前目錄。
鏡像制作完畢後,使用指令行将制作好的鏡像推送到Docker Hub網站上(有點像我們本地用git用戶端送出代碼到Github上):
docker push i042416/springbootexample:v1
成功之後,能夠在Docker Hub上看到推送好的鏡像:
https://hub.docker.com/repository/docker/i042416/springbootexample這樣,稍後SAP雲平台就能從Docker Hub上拉取這個鏡像了。
(3) 登入SAP雲平台CloudFoundry環境,使用指令行部署, 用參數--docker-image指定我們剛剛上傳到Docker Hub上的鏡像名稱,部署生成的應用名叫jerryjavadocker.
cf push jerryjavadocker --docker-image i042416/springbootexample:v6
因為我的容器鏡像修改過好幾次,是以标簽從v1升到了v6.
成功部署,應用的狀态顯示成了running:
在SAP雲平台也能看到這個成功部署的應用,處于運作狀态:
運作這個成功部署好的Docker應用,和我們在本地mvn spring-boot:run的效果一樣。至此這個SpringBoot應用的容器化和SAP雲平台的部署就成功了。
順便說一句,昨天Jerry的文章
SAP新一代全棧開發工具:SAP Business Application Studio推送之後,有一位朋友在文章下面留言:
關于傳統ABAP開發人員如何學習SAP Cloud Platform相關技術,Jerry後續如果有機會的話會專門寫一篇短文介紹自己的做法,敬請期待。
感謝閱讀。
本文來自雲栖社群合作夥伴“汪子熙”,了解相關資訊可以關注微信公衆号"汪子熙"。