在Kubernetes上運行SAP UI5應用(上)

2018年只剩最後30天了。Jerry在2017年的最後一天,曾經立下一個目標:這個公衆號在2018年保證至少每週發佈一篇SAP原創技術文章html

從Jerry在後臺統計的2018整年文章數量來看,這個目標已經提早實現了。爲了感謝你們的支持,在2018年的最後一天,Jerry會發佈一個合集:《SAP成都研究院2018年XX篇原創文章合集》,包含了2018年整年SAP成都研究院的同事們發佈過的文章。nginx

Jerry在11月份中旬去SAP上海研究院參加了Kubernetes的內部培訓(詳情參考個人前一篇文章:站在巨人肩膀上的牛頓:Kubernetes和SAP Kyma)。在SAP上海研究院的同事們若是想參加這個內部培訓,能夠聯繫同事Yang Katie。git

爲了不很快就把三位老師傳授的知識忘得精光,我得給本身找點練習來鞏固所學的東西。程序員

Jerry 2014年末加入SAP CRM Fiori開發團隊時,咱們開發的CRM Fiori應用,仍是部署在傳統的SAP Netweaver上的,詳情參考個人文章:SAP Fiori應用的三種部署方式github

後來,我陸續接觸了Salesforce的雲平臺Heroku,也學着不少程序員同樣把本身的博客搭在github上,再後來接觸了SAP本身的雲平臺,天然而然地就會試着把SAP UI5部署到這些平臺上:web

如今既然學了Kubernetes,那麼就來試試將SAP UI5應用運行在Kubernetes上面吧。瀏覽器

我用來部署的UI5應用名叫Jerry's Service Order, 是一個典型的Master-Detail風格的應用,左邊Master List是全部服務訂單列表,選中任意一個,在右邊的Detail頁面顯示選中的服務訂單的明細。

這個UI5應用的外觀如上圖所示。爲簡單起見,全部顯示的數據都是從項目裏的一個json文件讀取的,不支持新訂單的建立或修改。該應用能夠從個人github獲取:

https://github.com/i042416/jerrylist

如本文標題所示,這個練習的終極目標就是讓該UI5應用運行於Kubernetes上,那麼第一步就是先讓它運行於容器裏。和SAP Kubernetes內部培訓同樣,我選擇了Docker這個很是受歡迎的容器引擎做爲這個Kubernetes練習的容器技術。

關於Docker的簡介和安裝介紹,請參閱阮一峯大神的文章:Docker 入門教程

http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

爲何咱們要使用Docker容器?下面這段話摘自阮一峯的博客:

「Docker 屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。

Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行同樣。有了 Docker,就不用擔憂環境問題。

整體來講,Docker 的接口至關簡單,用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。」

Jerry梳理了一下將SAP UI5應用運行在Docker容器裏的全過程,總共分三個步驟:

1. 讓UI5應用運行在本地容器內

2. 將包含了UI5應用的本地容器打成一個新鏡像

3. 將本地鏡像上傳到Docker hub,再下載測試

下面是詳細步驟。

1. 讓UI5應用運行在本地容器內

若是僅僅只會跑Docker的Hello World(其實Jerry兩週前就是這個水平,囧),拿到這個需求,從什麼地方入手?

固然是從包含了能運行UI5應用的那些web服務器的鏡像入手,這裏我選擇了Nginx鏡像,在Docker hub上有10.4k個stars。

用下面的命令直接運行這個鏡像:

docker run -it nginx

docker ps拿到實例化的容器id:

而後進入處於運行狀態中的容器,執行shell命令:

docker exec -it bbc5d48a761c /bin/sh

看到#提示符後,進入容器內部的目錄:/usr/share/nginx/html

若是咱們能將github上的UI5應用的文件想辦法拷貝到這個目錄下面,就達到了在本地Docker容器運行UI5應用的目的了。

有不少種辦法能夠把github裏的資源下載到Docker容器內部這個指定的目錄下, 這裏Jerry用一種我以爲最簡單的方式,即經過Docker Volume技術將宿主機上的某個目錄A以Volume的方式掛接到容器內部的html文件夾上,這樣咱們直接把github倉庫上的webapp文件夾下載到宿主機的文件夾A便可,這個文件夾會以Volume的形式自動出如今容器內部映射好的目錄內。

docker run -d -p 1081:80 -v pwd/webapp:/usr/share/nginx/html/webapp –name jerry-custom nginx

使用參數-p 1081:80將Nginx服務經過端口1081暴露出來,所以我此次要使用http://localhost:1081測試新啓動的容器實例。

再次執行docker exec進入docker容器內部,確保**/usr/share/nginx/html**文件夾下確實包含了指望看到的UI5應用。

瀏覽器裏輸入localhost:1081/webapp,確保UI5應用可以正常訪問,至此這個應用已經在本地docker容器裏成功運行起來了。

2. 將包含了UI5應用的本地容器打成一個新鏡像

到目前爲止這個本地docker實例是沒有辦法給其餘人使用的,爲此咱們得先利用dockerfile製做一個包含了UI5應用的docker鏡像,上傳到docker hub上,以便其餘人下載。

隨便建立一個文件夾,好比jerry-build, 而後把webapp文件夾放進去,再建立一個dockerfile文件,內容就三行:

**FROM nginx:stable **

**COPY webapp/ /usr/share/nginx/html/webapp/ **

RUN ls -la /usr/share/nginx/html/webapp*

這三個指令從語義上不難理解,第一行FROM命令告訴docker鏡像構建例程使用nginx的stable版本做爲基礎鏡像進行新鏡像的構建。第二行COPY命令負責把webapp文件夾下的全部UI5資源文件拷貝到nginx docker鏡像的對應目錄內。第三行RUN命名執行shell命令ls,生成新的鏡像文件。

dockerfile的詳細語法請參考Docker 官方文檔:

https://docs.docker.com/engine/reference/builder/#usage

執行命令docker build ., 最後一個.表明「當前目錄」。

看到上圖"Successfully built(成功構建)"的輸出信息後,咱們加上參數**-t jerry-nginx-image:1.0**從新構建一個名爲jerry-nginx-image的鏡像:

成功構建後,使用參數-p暴露一個新的端口1082:

docker run -d -p 1082:80 jerry-nginx-image:1.0

如今localhost:1082/webapp也能訪問UI5應用了。

使用**docker images, **如今咱們能看到這個構建好的鏡像了,接下來咱們會將其推送到Docker hub上。

3. 將本地鏡像上傳到Docker hub

Docker hub的使用方式幾乎和github徹底一致。說句題外話:雖然github今年6月份被微軟收購了,可是用戶體驗一點也沒變,一如既往的優秀。

關於github更多另類用法,請參閱Jerry的文章:寫在Github被微軟收購之際 - Github的那些另類用法

首先在Docker hub上註冊一個賬號:

建立一個新倉庫:

取名i042416/ui5-nginx:

新建好的空的倉庫看起來是這樣的:

使用docker ps獲得本地正在運行的docker容器的ID:

使用commit命令提交這個本地容器的修改(類比git commit ):

docker commit 53de4188b702 i042416/ui5-nginx

如今準備將這個本地提交事後的鏡像推送到Docker hub了。

執行命令docker login:

在CloudFoundry上部署應用的朋友們能夠把docker login類比成cf login(下面是cf login的截圖):

最後一步就是用docker push將本地鏡像推送到Docker hub:

刷新Docker hub上新建的倉庫,能觀察到剛纔的本地推送記錄和鏡像尺寸。

如今能夠通知您的朋友,在其電腦上消費這個鏡像了。固然您也能夠把本身電腦上的本地鏡像刪除,再使用docker run執行。

在兩種狀況下,因爲本地鏡像檢索失敗,咱們都將看到提示信息:Unable to find image ‘i042416/ui5-nginx:latest' locally, 而後觀察到遠端鏡像的下載過程。

使用1080端口基於鏡像i042416/ui5-nginx啓動一個新的容器:

localhost:1080/webapp可以正常工做:

docker inspect命令證明了這個啓動的容器確實是基於鏡像i042416/ui5-nginx的。

在這個主題的下半部分,咱們將使用這個i042416/ui5-nginx鏡像,開始咱們的Kubernetes之旅。敬請期待。

更多閱讀

要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":

相關文章
相關標籤/搜索