【編者的話】容器正變得越來越“小”,雖道路坎坷卻滿含各種值得我們學習的經驗教訓。
Bitnami的軟體開發人員Adnan Adulhussein在最近的Docker London Meetup大會上與會者分享了他在三年的容器化之路中學到的經驗和教訓。在此期間,Bitnami以可以在任何平台上進行雲打包應用程式而聞名,從沒有Docker容器轉移到包含 70多個基于容器的應用程式的整個容器應用程式庫。
他說,Bitnami已經實作了大部分建構>部署>維護容器、雲、虛拟機或裸機的管道應用程式。但到了2014年中期,Adulhussein加入Bitnami的時候,“我們擁有這巨大的容器Docker鏡像(我們在這個鏡像中塞滿了所有的東西)。這個鏡像就像一個虛拟機。是以,我們還開發了一個管理這個巨大容器的内部工具。”
他表示,剛開始的時候,适應容器化的思維是困難的,而且當時的關于容器的文檔也很少。這也是當ops小組意識到他們在做錯誤的容器時,他們仍然決定繼續進行的原因,他們希望看看能不能嘗試作出改進。
一年後,他們向公衆釋出了第一套包含八個運作時和基礎設施的Bitnami鏡像。詳情如下:
- 已在Github上開源
- 可以在Docker Hub上自動建構
- 内容完善的文檔(a strong focus on documentation)
- dogfooded(Bitnami團隊正在使用這些鏡像進行日常的工作)
不久,他們開始嘗試使用像WordPress,Drupal和其他簡單的PHP應用程式的所有功能于一身的鏡像。
他們将靈活疊代方法應用于容器化,根據需要制定政策,比如看看它是如何響應s6-Overlay進行多程序監督的。
以下是Bitnami團隊這一路學到的一些經驗教訓:
1:每個容器一個任務
有時當你的工作開始逐漸進入容器化時,你會發現最終你的工作将被拆散揉碎。你将迷失在把所有事情都分解成小任務,這往往會造成更多的容器産生,而這些容器很可能是你無法掌控和確定安全的。另一方面,開發人員很容易養成将大量東西放入每個容器的習慣。你的應用程式隻需要docker這個輕量級的,獨立的,可執行的軟體(詳細可以參考Docker官網的代碼,運作時間,系統工具,系統庫和設定)。開發者提前釋出的容器的自由度往往有時會被卡在老的釋出習慣上(而實際上是非必須的)。
Adulhussein說,你需要尋找邏輯點來破解代碼,經常聚焦在任務上,但是有時Docker文檔的建議往往是動态變化的。這迫使開發人員以更全面的方式思考代碼,然後分解成任務。
他說:“就像Unix如何做一件事情一樣(而且它确實做得非常好) - 對于Docker容器來說也是一樣的, ”他舉例說:“如果分割容器是有意義的,當你有一個Web服務和一個資料庫的時候,你可能想要分離應用和資料使其更具擴充性。”
而這些痛點Bitnami都可以很好的幫你解決。Bitnami幫你建立多容器應用程式,如從應用程式容器中分離資料庫容器。
2:克服缺少開箱即用的操作
從2016年年中開始,Bitnami對它自己的容器做了優化,同時建立了開發容器,将像Rails和Eclipse這樣的流行架構容器化了。Adulhussein表示,他們之是以走了這條路,因為他們使用的大部分應用程式不能從架構很好的擴充,因為:
- 大多數應用程式不是雲原生的,也不是容器原生的;
- 他們使用的許多應用程式(例如WordPress)都将檔案上載存儲在檔案系統中,盡管你可以重新配置插件,但不是開箱即用;
- 他們使用的許多應用程式,如Magento,都依賴于HTAccess規則
Adulhussein表示,這些開發容器允許其他團隊執行諸如“在幾秒鐘内建立開發環境,引導一個新應用程式”等操作。如果本地目錄是空的,它将挂載一個本地目錄。“
3:關注容器入口點
通過Bitnami,你可以将容器入口點寫在Dockerfile中。這将在容器啟動時運作,并接收容器的指令(CMD)作為參數,通常用于啟動一個互動式shell,如下:
- FROM bitnami / node:latest ENTRYPOINT [“node”]
- docker run mynonde -e “console.log(’hello!’)”
Adulhussein還說,你可以選擇一個運作時二進制檔案作為鏡像入口:
Docker概述了關于入口點的更多最佳實踐。
4:注意初始化系統的重要性
差不多已經兩年了,容器社群已經意識到你可以運作輕量級的容器而不需要初始化或重置系統。但是,跳過初始化操作,這可能導緻處理和信号的錯誤處理,進而可能導緻容器洩漏或者無法停止的容器。綜上,Bitnami的優勢恰恰在于将Yelp’s dumb-init 很友善的應用于容器的簡單初始化(系統)。
5:優化鏡像使其更小巧
Adulhussein提供了更小的Docker鏡像,這樣做的好處如下:
- 更小的空間占用,
- 更快的傳輸,
- 更少的被攻擊的機率。
他指出,“ 像Alpine和Busybox這樣的東西真的是非常有用的容器,而且也是非常非常小的鏡像”,它們的大小都是5MB左右。他還提供了Bitnami在2016年底釋出的開源Minideb,用來作為更大的替代品(約50MB)。
他說:“如果你不能做到和Alpine很好的相容,那麼擁有一個類似于大型圖書館的管理軟體将是一個不錯的選擇。”
6:權衡利用特權和非特權容器
參考頗受歡迎的我可以使用非特權容器嗎?網站中提到的建議,Adulhussein提倡遵循OpenShift最佳實踐(為了使用非特權容器)。他說,可以運作每個容器為随機的GID - GID預設為0,假設UID是未知的:
$ docker run -user bitnami / minideb id
uid = gid = (root)
groups = (root)
他繼續說,檔案對root組的所有使用者具有讀寫執行權限,并且這些服務可以綁定到非特權端口。不過,他警告說,如果執行時出錯,你可能會得到一個奇怪的“無名”容器資訊。
Bitnami開放源代碼的目的是什麼?
Bitnami正在通過向所有應用程式推出非特權和多階段建構來優化Docker鏡像。他們還增加了Bitnami的文檔和教程,他們正在試驗Bazel容器的建構,以及如何通過運作容器叢集來使CI / CD平台受益(持續內建和持續傳遞)。最後,他說Bitnami也在為Kubernetes開發一些工具,包括Helm包管理器和Kubeless本地無伺服器架構。
原文連結:6 Lessons from Bitnami’s Transition to Container-Based Ops(翻譯:dssky2008)