[Cloud Foundry] 雲端應用佈署-使用CF CLI及Docker

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 之前,先準備下列事項:

  1. 如在自己的映像檔內沒有安裝所需要的服務,例如:DB等,需要在 Cloud Foundry 上將每項服務實例(例如:DB、RabbitMQ 等)都已創建,並將程式修改為使用 VCAP 方式讀取環境變數

  2. 您可以訪問想要佈署的應用的組織和空間。
    

  3. 安裝 cf CLI 工具,安裝連結

  4. 安裝 windows 版本 Docker,安裝連結

  5. 安裝 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

ALL RIGHTS RESERVED. COPYRIGHT © 2018. Designed and Coded by Makee.io