Cloud Foundry 是採用開放源碼 PaaS 解決方案,支援多種程式語言、開發框架及資料庫等服務,而且更容易開發、測試及佈署。本篇文章將介紹如何將自己的應用程式佈署至 Cloud Foundry 上。
目前 Cloud Foundry 可以支援 Java、Ruby、JavaScript 等程式語言,支持的程式語言及框架如下表所示。
開發框架 | 程式語言 |
---|---|
Spring | Java |
Lift | Scala |
Play | Scala/Java |
Grails | Groovy |
Sinatra | Ruby |
Rails | Ruby |
Node.js | JavaScript |
除了對程式語言及開發框架的支援,Cloud Foundry 也提供服務(Services),包含關聯式資料庫 MySQL、PostgreSQL,以及 NOSQL 解決方案的 MongoDB 與 Redis,還有 RabbitMQ Broker 等服務。
佈署至 Cloud Foundry 上的方式
將目前的應用程式佈署至 Cloud Foundry 方式分為兩種,相關實作方式如下所示:
1.Cloud Native:
Cloud Native 應用程式允許開發人員使用平台上的服務作為從基礎架構。團隊只需專注於他們的軟件,而不是配置、安裝和維護操作系統,採用 Cloud Native 方式需要依照下列規格來實作:
- 把單體式的系統 (monolitch), 拆解成多個獨立的微服務, 再靠 API 把彼此串聯起來的架構
- 須符合平台可以支援的語言及框架 * 將程式串接資料庫及其他服務方法,透過讀取環境變數方式取得,例如:
port = os.getenv('PORT', '8080')
1.1 事前準備
將應用程式佈署到 Cloud Foundry 之前,先準備下列事項:
將您的應用程式串接方式改為 API 接口,DB 認證取得採用 vcap 方式讀取環境變數。
排除應用程式中無關的文件和 Lib。
應用程式所需要的每項服務實例(例如:DB等)都已創建。
您可以訪問想要佈署的應用的組織和空間。
- 安裝 cf CLI 工具,安裝連結
1.2 應用程式佈署(cf CLI)
將事前準備工作整理好後,本章節描述如何透過 cf CLI 工具將自己的應用程式佈署至 Cloud Foundry 上
cf CLI 指令介紹
首先您需要先開啟 command line 視窗,window 透過 cmd 開啟,MAC 則開啟終端機,輸入下列指令可以確認目前 cf CLI 工具是否安裝完成
cf [global options] command [arguments...] [command options]:
Option | Description |
---|---|
-help, -h | Show help |
-v | Print API request diagnostics to stdout |
push | Push a new app or sync changes to an existing app |
start | Start an app |
stop | Stop an app |
delete | Delete an app |
apps | List all apps in the target space |
app | Display health and status for app |
ssh | SSH to an application container instance |
Step1. 將應用程式專案內加入 Deployment Files
此步驟需在您的應用程式資料夾最外層加入下列的 Deployment Files,讓應用程式佈署至 Cloud Foundry 上可以依據下列文檔,自動安裝相依的套件及執行環境,下列範例以 Python 為例
Procfile (Declare required runtime process)
web: python hello.py
requirements.txt (Required packages)
Flask
manifest.yml (Manifest description)
---
buildpack: https://github.com/cloudfoundry/python-buildpack
applications:
- name: cf-hello-world
memory: 128M
random-route: true
[Note] Ref: https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html
Step2. 確認資料夾內的檔案
此步驟可以透過下列指令,確認應用程式資料夾內包含下列檔案
$ pwd
/home/cf-hello-world
$ ls
hello.py manifest.yml Procfile requirements.txt
Step3. 透過 cf CLI 工具登入 Cloud Foundry
$ cf login -a $API_DOMAIN --skip-ssl-validation -u $USER_NAME -p $USER_PASSWORD`<br />
[Note] $API_DOMAIN is api.wise-paas.com in WISE-PAAS
Step4. 將應用程式佈署至 Cloud Foundry
在此應用程式專案的資料夾目錄內,下此指令
$ cf push
[Note] Before executing cf push, please check whether an App name of cf-hello-world already exists to avoid conflict.
Step5. 確認應用程式是否佈署完成
如果應用程式佈署完成會於命令視窗得到下列的訊息,包含:服務目前的 url、所使用的硬體資源狀況等
App cf-hello-world was started using this command `python hello.py`
Showing health and status for app cf-hello-world in org test / space Develop as $USER_NAME...
requested state: started
instances: 1/1
usage: 128M x 1 instances
urls: cf-hello-world-orthotropic-army.cloudfoundry.com
last uploaded: Tue Dec 12 08:37:15 UTC 2017
stack: cflinuxfs2
buildpack: https://github.com/cloudfoundry/python-buildpack
state since cpu memory disk details
#0 running 2017-12-12 04:39:09 PM 0.0% 0 of 128M 0 of 1G
1.3 Debug 方法(cf CLI)
如果想針對佈署至 Cloud Foundry 上的應用程式 debug 或是查看 logs,可以參考下列的指令
View the App Stream Live Logs
$ cf logs cf-hello-world
View the App Recent Logs
$ cf logs cf-hello-world --recent
Show the App Events
$ cf events cf-hello-world
Login the App
$ cf ssh cf-hello-world
2.1 Hello World Source
hello.py
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World from Python Flask!'
port = os.getenv('PORT', '8080')
if __name__ == "__main__":
app.run(host='0.0.0.0', port=int(port))
2.Docker:
Cloud Foundry 也可以使用 Docker image 為應用程序創建容器,如果本身針對 OS 環境或是開發環境有特別需求,可以將自己的整個應用程式環境打包成 Docker image,透過 cf CLI 工具將映像檔傳送至 Cloud Foundry 佈署
2.1 事前準備
將應用程式佈署到 Cloud Foundry 之前,先準備下列事項:
如在自己的映像檔內沒有安裝所需要的服務,例如:DB等,需要在 Cloud Foundry 上將每項服務實例(例如:DB、RabbitMQ 等)都已創建,並將程式修改為使用 VCAP 方式讀取環境變數
您可以訪問想要佈署的應用的組織和空間。
安裝 cf CLI 工具,安裝連結
安裝 windows 版本 Docker,安裝連結
安裝 MAC 版本 Docker,安裝連結
2.2 製作 Docker 映像檔
如果你已經將 Docker 映像檔製作好,並上傳至 Docker hub,即可跳過 2.2 步驟,此步驟主要是重新建置一個 Docker 映像檔
Step 1. 製作 Deployment Files 及 Dockerfile
下列範例是以 Python 為例,首先會撰寫一隻 Python 程式,並製作需要的安裝套件檔案,最後
hello.py
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World from Python Flask!'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
requirements.txt (Required packages)
Flask
Dockerfile (Deployment setting)
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
EXPOSE 80
CMD ["python", "hello.py"]
Step 3. 製作 Docker 映像檔
在此應用程式專案的資料夾目錄內,透過 Docker 指令,建置映像檔,並確認映像檔是否建置完成
$ docker build -t hello_world .
$ docker images
Step 4. 將映像檔上傳至 Docker hub
$ docker login
$ docker tag hello_world $REPO_NAME/hello_world:v1
$ docker push $REPO_NAME/hello_world:v1
[Note] $REPO_NAME is your repository name on public docker hub
2.3 將 Docker 映像檔佈署至 Cloud Foundry
如果映像檔已經上傳至 Docker hub 完成,即可透過 cf CLI 工具,去指定的 Docker repo 取得映像檔,並佈署至 Cloud Foundry 上
$ cf push cf-hello-world --docker-image $REPO_NAME/hello_world:v1
[Note] cf-hello-world is $APPNAME / helloworld is $IMAGENAME / v1 is $TAGVERSION
2.4. 確認應用程式是否佈署完成
如果應用程式佈署完成會於命令視窗得到下列的訊息,包含:服務目前的 url、所使用的硬體資源狀況等
App cf-hello-world was started using this command `python hello.py`
Showing health and status for app cf-hello-world in org test / space Develop as $USER_NAME...
requested state: started
instances: 1/1
usage: 128M x 1 instances
routes: cf-hello-world.cloudfoundry.com
last uploaded: Tue Dec 12 08:37:15 UTC 2017
stack: cflinuxfs2
docker image: bangminshiue/ubuntu_test
start command: /bin/bash
state since cpu memory disk details
#0 running 2017-12-12 04:39:09 PM 0.0% 0 of 128M 0 of 1G
2.5 Debug 方法 (cf CLI)
如果想針對佈署至 Cloud Foundry 上的應用程式 debug 或是查看 logs,可以參考下列的指令
View the App Stream Live Logs
$ cf logs cf-hello-world
View the App Recent Logs
$ cf logs cf-hello-world --recent
Show the App Events
$ cf events cf-hello-world
Login the App
$ cf ssh cf-hello-world