返回文章列表

Docker無伺服器架構應用實踐

本文探討 Docker 容器技術與無伺服器架構的結合,深入解析如何在 Docker 環境下建構、佈署和管理無伺服器應用。涵蓋 OpenFaaS、OpenWhisk 和 Fn Project 三大 FaaS 平台,並提供混合伺服器less FaaS 架構的實踐,協助開發者在成本、管理和控制之間取得平衡。

Web 開發 雲端技術

隨著容器技術的成熟與普及,Docker 成為許多開發者的首選工具。然而,伺服器less 架構的興起,也為應用程式佈署和管理帶來了新的可能性。本文將探討如何結合 Docker 與無伺服器架構,利用 Docker 容器作為函式的佈署單元,並以 Docker 作為開發工具、協調引擎和網路層,在本地、私有雲或混合雲環境中建構和佈署無伺服器應用。透過混合伺服器less FaaS 架構,開發者可以在成本效益、自行管理伺服器以及對伺服器的控制程度之間取得平衡,並享有自動擴充套件、簡化管理等優勢。本文將深入研究 OpenFaaS、OpenWhisk 和 Fn Project 三大 FaaS 平台,提供實務操作,協助讀者掌握無伺服器應用開發的最新趨勢。

伺服器less架構與Docker的未來

前言

容器技術在今日已經非常成熟。Docker作為推動容器技術普及的軟體套件,目前已被數十萬名開發者用作日常的DevOps工具。可以說,Docker這個容器引擎現在已經變得相當穩定。對於基礎設施級別的軟體套件來說,穩定性意味著高品質和可靠性。作為使用者,我們每天都在使用它,相信你們也是如此,將其作為工具鏈的一部分。但當Docker的新版本釋出時,我們不再感到興奮,就像我們對Linux核心的新版本釋出一樣。在我看來,容器的黃金時代已經過去了。

Docker的興起與衰落

Docker的興起始於2013年,並在2014年至2016年間迎來了文藝復興時期。在2016年,Docker Swarm和Kubernetes之間的協調引擎之爭達到了頂峰。其中,由我參與的Swarm2K專案是我人生中的一次難得經歷。後來,Docker在2017年宣佈也將支援Kubernetes,這場競賽就此結束。

在2018年3月,本文即將出版之際,Docker的創始人Solomon Hykes離開了Docker公司。Docker這家公司已經慢慢地、堅定地從初創企業轉向企業業務。這對我們意味著什麼?企業業務意味著穩定性,而初創企業則意味著冒險。讓我們轉向新的冒險——後容器的無伺服器時代。

伺服器less時代的到來

我們將在這本文中討論伺服器less技術。它是容器和微服務之後的自然演進,以不同的方式呈現。首先,Docker容器成為了函式的佈署單元,這是Function-as-a-Service(FaaS)架構中的基本工作單元。其次,微服務架構已經逐漸演變為FaaS架構。FaaS可以在本地或雲端實作。當整個FaaS堆積疊由雲端供應商管理時,它就變成了完全的伺服器less。

但在這之間,還有一些東西存在。有一種被稱為混合伺服器less FaaS架構。這種架構是本文希望讀者能夠瞭解和享受的主要內容。它是我們在成本、在自行管理伺服器以及對伺服器的控制程度之間取得平衡的關鍵。

本文涵蓋的內容

本文詳細介紹了Docker上三個主要的FaaS平台:OpenFaaS、OpenWhisk和Fn Project。所有這些專案都處於早期階段,並且正在變得越來越成熟。因此,這是讀者和我一起學習和乘著這波新浪潮的絕佳機會。讓我們開始吧!

本文的目標讀者

如果您是一名開發者、Docker工程師、DevOps工程師,或者是任何對在伺服器less環境中使用Docker感興趣的相關人員,那麼這本文是為您而寫的。如果您是一名大學生或研究生,本文也能幫助您加強在伺服器less和雲端運算領域的知識。

如何充分利用本文

讀者應該具備Linux和Docker命令的基本知識。雖然不是必需的,但如果讀者對網路協定有基本的瞭解,並且熟悉雲端運算的概念,將會大有幫助。雖然可以使用MacBook或Windows作業系統的PC來執行本文中的範例,但強烈建議讀者使用Ubuntu Linux 16.04及以上的版本。擁有MacBook或Windows的讀者可以透過虛擬機器或雲端例項執行Linux來執行範例。

下載範例程式碼

下載程式碼檔案的步驟如下:

  1. 在www.packtpub.com登入或註冊。
  2. 選擇SUPPORT標籤。
  3. 點選Code Downloads & Errata。
  4. 在搜尋框中輸入書名,並按照螢幕上的指示進行操作。

下載檔案後,請確保使用最新版本的以下軟體解壓縮或提取資料夾:

  • Windows:WinRAR/7-Zip
  • Mac:Zipeg/iZip/UnRarX
  • Linux:7-Zip/PeaZip

本文使用的慣例

本文中使用了多種文字慣例:

  • 程式碼在文字中:表示文字中的程式碼字、資料函式庫表名、資料夾名稱、檔案名稱、檔案副檔名、路徑名、虛擬URL、使用者輸入和Twitter帳號。例如:「我們將嘗試使用echoit函式來與OpenFaaS打招呼。」
  • 程式碼區塊如下所示:
FROM ubuntu
RUN apt-get update && apt-get install -y nginx
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]
  • 命令列輸入或輸出如下所示:
$ curl -sSL https://get.docker.com | sudo sh
$ docker swarm init --advertise-addr=eth0
  • 粗體:表示新術語、重要詞語或螢幕上顯示的詞語。例如,選單或對話方塊中的詞語在文字中會以這種方式顯示。以下是範例:「以下截圖顯示了執行OpenFaaS Portal的瀏覽器。」

聯絡我們

我們始終歡迎讀者的反饋。

  • 一般反饋:請將電子郵件傳送至[email protected],並在郵件主題中提及書名。
  • 如果您對本文的任何方面有疑問,請將電子郵件傳送至[email protected]

評論

內容解密:

本章節主要介紹了Docker技術的成熟和伺服器less架構的興起。首先,我們瞭解了Docker的歷史和其在容器技術中的重要性。接著,我們討論了伺服器less架構的概念和其與Docker的結合。最後,我們簡要介紹了本文的目標讀者和如何充分利用本文。

Docker與伺服器less架構的結合

Docker在伺服器less架構中的角色

Docker容器技術為伺服器less架構提供了基礎。透過將應用程式封裝在容器中,開發者可以更輕鬆地佈署和管理應用程式。在伺服器less架構中,Docker容器成為了函式的佈署單元。

伺服器less架構的優勢

伺服器less架構提供了多項優勢,包括:

  • 成本效益:開發者只需為實際使用的資源付費。
  • 自動擴充套件:伺服器less架構可以根據需求自動擴充套件或縮減。
  • 簡化管理:開發者無需管理伺服器或擔心基礎設施的維護。

Docker與伺服器less的結合

Docker與伺服器less架構的結合為開發者提供了更大的靈活性。開發者可以使用Docker容器來封裝應用程式,然後在伺服器less架構中佈署這些容器。

程式碼範例

以下是一個簡單的Dockerfile範例,用於建立一個Nginx伺服器:

FROM ubuntu
RUN apt-get update && apt-get install -y nginx
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]

內容解密:

此Dockerfile範例展示瞭如何建立一個包含Nginx伺服器的Docker映像。第一行FROM ubuntu表示使用Ubuntu作為基礎映像。第二行RUN apt-get update && apt-get install -y nginx安裝了Nginx伺服器。第三行EXPOSE 80暴露了80埠。最後一行ENTRYPOINT ["nginx", "-g", "daemon off;"]設定了容器的進入點,以Nginx伺服器作為預設命令。

伺服器less架構的未來

混合伺服器less FaaS架構

混合伺服器less FaaS架構是一種結合了本地佈署和雲端佈署的架構。這種架構允許開發者在本地和雲端之間靈活地佈署和管理應用程式。

三大FaaS平台

本文將詳細介紹三個主要的FaaS平台:OpenFaaS、OpenWhisk和Fn Project。這些平台都在積極發展中,為開發者提供了多種選擇。

內容解密:

本章節介紹了伺服器less架構和Docker的結合。首先,我們瞭解了Docker在伺服器less架構中的角色。接著,我們討論了伺服器less架構的優勢和Docker與伺服器less的結合。最後,我們簡要介紹了混合伺服器less FaaS架構和三大FaaS平台。

無伺服器運算與Docker的革命:從容器化到無伺服器架構的轉變

隨著容器技術的成熟,大多數開發者已經熟悉如何將應用程式封裝成容器作為佈署單元。Docker讓我們能夠將應用程式以標準格式佈署到幾乎任何地方,從本地筆電到QA叢集、客戶端,甚至是公有雲,如下圖所示:

此圖示展示了Docker容器如何佈署到不同的基礎設施和平台上。現在,在公有雲上執行Docker容器已經成為常態。我們已經享受到按需啟動雲端例項並按使用量付費的好處。無需等待硬體採購,我們可以利用敏捷方法與持續交付流程來最佳化資源。

根據Docker的報告,其中一家客戶在使用Docker將現有應用程式遷移到雲端後,總擁有成本(TCO)降低了66%。不僅TCO大幅降低,使用Docker的企業還能將上市時間從數月縮短至數天,這是一個巨大的成就。

將容器佈署到雲端基礎設施(如AWS、Google Cloud或Microsoft Azure)已經簡化了許多事情。雲端基礎設施消除了企業自行購買硬體和維護硬體的需求。然而,即使用公有雲基礎設施,企業仍需要像架構師這樣的角色來確保站點的可靠性和可擴充套件性。其中一些人被稱為SRE(站點可靠性工程師)。

此外,企業還需要自行處理系統層級的套件和依賴關係。由於軟體堆積疊不斷變化,他們需要自行進行應用程式安全性和OS核心的修補。在許多場景中,當負載達到峰值時,團隊必須擴充套件叢集規模以應對請求。工程師還需要盡可能縮減叢集規模,以降低雲端成本,因為這是一個按使用量付費的模式。

開發者和工程團隊一直努力提供卓越的使用者經驗和站點可用性。在此過程中,過度組態的隨需例項或利用率不足的例項可能會帶來高昂的成本。根據AWS的一份白皮書(https://d0.awsstatic.com/whitepapers/optimizing-enterprise-economics-serverless-architectures.pdf),多達85%的已組態機器未被充分利用。

為瞭解決這些過度組態和利用率不足的問題,無伺服器運算平台(如AWS Lambda、Google Cloud Functions、Azure Functions和IBM Cloud Functions)應運而生。

本章涵蓋以下主題:

  1. 無伺服器運算
  2. 無伺服器FaaS的通用架構
  3. 無伺服器/FaaS的使用案例
  4. 以FaaS/Docker方式實作「Hello World」

什麼是無伺服器運算?

試想一下,我們生活在一個完全由軟體驅動的世界,具有某種智慧。在這個世界裡,我們可以開發軟體而無需進行任何繁瑣的操作。只需說明我們想要執行的軟體型別,幾分鐘後,它就會出現在網際網路的某個地方,為眾多使用者提供服務。而且,我們只需為使用者發出的請求數量付費。然而,這種世界太過理想化。

現在,讓我們更加務實地思考一個世界,在這個世界裡,我們仍然需要自行開發軟體。至少目前為止,我們不需要關心任何伺服器的組態和管理。這對於開發者來說,至少是最佳的世界,我們可以佈署應用程式以服務數百萬使用者,而無需關心任何伺服器,甚至不需要知道這些伺服器在哪裡。我們真正想要的只是建立一個能夠滿足業務需求、規模適宜且價格合理的應用程式。

無伺服器平台正是為瞭解決這些問題而誕生的。作為對開發者和快速成長的企業的回應,無伺服器平台似乎是一個巨大的勝利。但它們究竟是什麼?

無伺服器與FaaS之間的關係

下圖說明瞭事件驅動程式設計、FaaS和無伺服器FaaS之間的關係,其中無伺服器FaaS是FaaS和無伺服器之間的交集:

此圖示是一個文氏圖,闡述了無伺服器與FaaS之間的關係。無伺服器是一種正規化轉變,使開發者無需擔心伺服器的組態和營運。計費將按請求次數進行。此外,公有雲上提供了許多有用的服務供我們選擇,將它們連線起來並利用它們來解決業務問題以完成任務。

無伺服器架構中的應用程式通常使用第三方服務來執行其他任務,例如身份驗證、資料函式庫系統或檔案儲存。無伺服器應用程式不一定需要使用這些第三方服務,但以這種方式架構應用程式可以充分利用根據雲端的無伺服器平台。這種架構中的前端應用程式通常是一個厚重、強大的前端,例如單頁應用程式或行動應用程式。

這種無伺服器運算轉變的執行引擎是Function as a Service(FaaS)平台。FaaS平台是一種運算引擎,允許我們編寫簡單、自包含、單一用途的函式來處理或計算任務。FaaS平台的計算單元是一個函式,建議該函式是無狀態的。這種無狀態屬性使得函式可以被平台完全管理和擴充套件。

FaaS平台不一定執行在無伺服器環境中,例如AWS Lambda,但有許多FaaS實作,如OpenFaaS、Fn Project和OpenWhisk,允許我們在自己的硬體上佈署和執行FaaS。如果FaaS平台執行在無伺服器環境中,則稱為無伺服器FaaS。例如,我們在本機執行OpenWhisk,因此它是我們的FaaS平台。但當它執行在IBM Cloud上作為IBM Cloud Functions時,它就是一個無伺服器FaaS。

每個FaaS平台都設計為使用事件驅動的程式設計模型,以便能夠高效地連線到公有雲上的其他服務。透過非同步事件模型和函式的無狀態屬性,這種環境使無伺服器FaaS成為下一代運算的理想模型。

# 使用官方的 Node.js 映像作為基礎映像
FROM node:14

# 設定工作目錄
WORKDIR /usr/src/app

# 複製 package.json 和 package-lock.json
COPY package*.json ./

# 安裝應用程式的依賴項
RUN npm install

# 複製應用程式的原始碼
COPY . .

# 暴露應用程式的埠
EXPOSE 8080

# 執行應用程式
CMD [ "node", "app.js" ]

內容解密:

此Dockerfile用於容器化一個Node.js應用程式。以下是每個部分的詳細解釋:

  1. FROM node:14:使用官方的Node.js 14版本作為基礎映像。
  2. WORKDIR /usr/src/app:在容器中設定工作目錄為/usr/src/app
  3. COPY package*.json ./:將主機上的package.jsonpackage-lock.json複製到容器中的工作目錄。
  4. RUN npm install:在容器中安裝package.json中定義的依賴項。
  5. COPY . .:將主機上的應用程式原始碼複製到容器中的工作目錄。
  6. EXPOSE 8080:宣告容器在執行時將監聽8080埠。
  7. CMD [ "node", "app.js" ]:定義容器啟動時執行的命令,這裡是執行node app.js來啟動應用程式。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker無伺服器架構應用實踐

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

圖表翻譯: 此圖表展示了是否使用無伺服器架構的決策流程。如果選擇使用無伺服器架構,則佈署FaaS並自動擴充套件,按需計費。否則,需要組態伺服器並手動擴充套件,產生固定成本。

無伺服器FaaS的缺點與挑戰

無伺服器FaaS(Function as a Service)雖然帶來了許多便利和優勢,但同時也存在一些缺點和挑戰。這些挑戰主要包括以下幾個方面:

對基礎設施的控制力有限

在無伺服器FaaS模型中,使用者基本上無法擁有或直接控制伺服器。這使得當需要對基礎設施進行細粒度控制時,無伺服器模型並不適合。例如,在某些特定應用場景中,需要對硬體或系統層面進行最佳化或定製的情況下,無伺服器FaaS可能無法滿足這些需求。

執行限制

無伺服器FaaS存在諸多限制,尤其是函式執行的時間限制和每個函式例項的記憶體限制。這些限制可能會影響某些需要長時間運作或大量記憶體的應用。此外,無伺服器FaaS引入了一種固定且特定的應用開發方式,這可能使得將現有的系統直接遷移到FaaS變得困難。

與私有或混合基礎設施的相容性問題

如果無法將所有工作負載遷移到組織外部的公有雲上,那麼完全使用無伺服器平台將變得不可行。無伺服器架構的真正好處之一是存在便捷的公有雲端服務,這使得在私有或混合基礎設施上完全利用無伺服器平台變得困難。

Docker的應用與解決方案

為瞭解決上述無伺服器FaaS的挑戰,本文探討了在自有基礎設施上使用FaaS與無伺服器FaaS之間的平衡。透過選擇三個主要允許將Docker容器佈署為函式的FaaS平台,本文簡化並統一了FaaS的佈署模型。

以Docker容器作為佈署單位

使用Docker容器作為佈署單位(函式),並以Docker作為開發工具和協調引擎及網路層,可以在自有的硬體、私有雲基礎設施或混合雲環境中開發和佈署無伺服器應用程式。這種方法的一個重要優點是,使用具有Docker技能的小型開發團隊就可以輕鬆管理這種基礎設施。