1. 程式人生 > >原來谷歌是這樣構建 Docker 映象的!

原來谷歌是這樣構建 Docker 映象的!

來自微信公眾號:JFrog傑蛙DevOps
作者:王青
Matthew Moore 是谷歌公司的資深工程師,專注於谷歌 Docker 技術的應用,他是在谷歌最早落地 Docker 技術團隊的核心成員。本次演講他為大家介紹了谷歌使用 Docker 技術的心得。

虛擬機器的問題
圖片描述
最初,大家都使用虛擬機器作為軟體的執行環境,對外提供服務。為了在虛擬機器上執行你的 Service,你不得不執行一大堆程式:

  • 系統程序
  • SSH
  • 安裝
  • Agent
  • 安裝
  • Bash
  • 安裝一大堆 libs

其實,你僅僅只是想讓你的 Service 執行起來,但你不得不維護一個40GB的虛擬機器。

然後你開始試用 Docker


圖片描述
開始試用 Docker,你毫不猶豫選擇了和之前虛擬機器一樣的映象:Ubuntu 1404, 將之前的虛機的內容複製到了 Docker 映象,安裝了一堆軟體,最後發現你的 Docker 映象有8GB。

谷歌的 Docker 映象構建實踐

找到最小的基礎映象
Alpine Linux 是基於musl 和 BusyBox 的作業系統,目的是為了為使用者提供更高效的資源使用效率。它的特性是體積小,最小的 Alpine Linux 體積可以只有5MB。谷歌某些團隊使用 Alpine Linux 作為 Docker Build 的基礎映象。

目的:僅僅為了執行 Service
圖片描述
谷歌認為,為了執行一個 Service,並不需要將那些無關聯的包,程式打包到容器裡,換句話說,Docker 映象裡只留下需要用到的,其他的都刪除,從而得到一個最小的映象。這需要考慮以下幾點:

  1. 程式編譯後的二進位制檔案(從 Artifactory 獲取)
  2. 程式的所有依賴(從 Artifactory 獲取)
  3. 程式語言的執行時(libc,JRE,node,…)
  4. 任何程式和 Kernel 之間的中介軟體

其實這一切的資訊,構建工具都已經知道。
谷歌的構建工具 Bazel
介紹 Bazel 之前,先介紹下谷歌的開發模式,對於伺服器端程式碼庫,谷歌的開發流程如下:

  1. 所有的伺服器端程式碼庫都在一個巨大的版本控制系統裡
  2. 每個人都用 Bazel 構建軟體
  3. 不同的組負責原始碼樹的不同部分,所有的元件都是作為BUILD 目標來用
  4. 分支主要是用來管理髮布,所以每個人都在最新版本上開發軟體

Bazel(https://bazel.build/

)是 Google 內部用來構建自己的伺服器端軟體的工具。目前變成谷歌公司貢獻的一個開源專案,目的是幫助開發者將軟體的構建和測試變得更快,更可靠。
圖片描述
從上圖可以看到,Bazel 有 WORDSPACE 的概念,WORDSPACE 檔案用來準備 Docker 映象構建所依賴的所有材料和來源。BUILD 檔案用來告訴 Bazel 這個映象應該使用什麼命令進行構建,以及如何構建,如何測試。

使用 Bazel 的宣告式語言: WORKSPACE 和 BUILD,開發者可以用檔案描述整個構建和部署的環境。谷歌使用 Bazel 進行 Docker 的構建已經很多年,它為谷歌帶來以下收益:

  1. 支援跨平臺構建,分散式快取,優化依賴解析,並行構建,增量構建。
  2. 支援多語言(Java, C++, Android, iOS, Go等等)。
  3. 跨平臺。
  4. 水平擴充套件和自定義擴充套件。

Bazel 是以下理念的奠基石:由於 Bazel 需要所有的依賴都被完整地指定,我們可以預測改動影響了哪些程式和測試,並在提交前執行他們。

谷歌提供的 Distroless 映象構建檔案
圖片描述
Distroless (https://github.com/GoogleCloudPlatform/distroless) 是谷歌內部使用的映象構建檔案,包括 Java 映象,Node,Python 等映象構建檔案,Distroless 僅僅只包含執行服務所需要的最小映象,不包含包管理工具,shell 命令列等其他功能。

為什麼你需要這些映象?這些映象是谷歌和其他大公司的最佳實踐的產物,經過了漏洞掃描,映象會持續更新,保持安全性。

如何使用?Distroless 提供的構建映象的 BUILD 檔案,通過 Bazel 可以直接進行構建。
總結
谷歌為大家介紹了內部如何解決映象過大的問題,以及進行大規模併發構建,測試所用到的構建工具 Bazel,並且開源了 Docker 映象構建檔案 Distroless 專案。如果你認為你的映象也存在體積太大的問題,可以參考谷歌的實踐,體驗他們的工具。

Docker最佳實戰
隨著Docker技術被越來越多的人所認可,其應用的範圍也越來越廣泛。該課程集中於Docker實踐應用,不會過多糾結於細細微的理論分析,而是涵蓋Docker最基本和常用的功能和命令,讓學員在最短的時間內瞭解如何上手使用Docker,配合精心設計的範例,以及範例程式碼的演化過程,學員可以可以直觀地看到Docker在實際專案中的應用,可能碰到的問題,如何解決,以及如何改進專案的開發過程。
圖片描述

目前群已滿100人,新增微訊號:csdn01,備註“Docker”即可入群!