容器正變得越來越“小”,雖道路坎坷卻滿含各種值得我們學習的經驗教訓。
Bitnami的軟體開發人員Adnan Adulhussein在最近的Docker London Meetup大會上與會者分享了他在三年的容器化之路中學到的經驗和教訓。在此期間,Bitnami以可以在任何平臺上進行雲打包應用程式而聞名,從沒有Docker容器轉移到包含70多個基於容器的應用程式的整個容器應用程式庫[1]。
他說,Bitnami已經實現了大部分構建>部署>維護容器、雲、虛擬機器或裸機的管道應用程式。但到了2014年中期,Adulhussein加入Bitnami的時候,“我們擁有這巨大的容器Docker映象(我們在這個映象中塞滿了所有的東西)。這個映象就像一個虛擬機器。因此,我們還開發了一個管理這個巨大容器的內部工具。”
他表示,剛開始的時候,適應容器化的思維是困難的,而且當時的關於容器的檔案也很少。運營團隊意識到自己在處理容器工作時出了問題,但他們決定繼續堅持並嘗試能否加以改進。
一年後,他們向公眾釋出了第一套包含八個執行時和基礎設施的Bitnami映象。詳情如下:
不久,他們開始嘗試使用像WordPress、Drupal和其他簡單的PHP應用程式的所有功能於一身的映象。
他們將敏捷迭代方法應用於容器化,根據需要制定策略,比如看看它是如何響應s6-Overlay進行多行程監督的[3]。
以下是Bitnami團隊這一路學到的一些經驗教訓:
有時當你的工作開始逐漸進入容器化時,你會發現最終你的工作將被拆散揉碎。你將迷失在把所有事情都分解成小任務,這往往會造成更多的容器產生,而這些容器很可能是你無法掌控和確保安全的。另一方面,開發人員很容易養成將大量東西放入每個容器的習慣。你的應用程式只需要Docker這個輕量級的,獨立的,可執行的軟體(詳細可以參考Docker官網的程式碼,執行時間,系統工具,系統庫和設定)。開發者提前釋出的容器的自由度往往有時會被卡在老的釋出習慣上(而實際上是非必須的)。
Adulhussein說,你需要尋找邏輯點來破解程式碼,經常聚焦在任務上,但是有時Docker檔案的建議往往是動態變化的。這迫使開發人員以更全面的方式思考程式碼,然後分解成任務。
他說:“就像Unix如何做一件事情一樣(而且它確實做得非常好)——對於Docker容器來說也是一樣的, ”他舉例說:“如果分割容器是有意義的,當你有一個Web服務和一個資料庫的時候,你可能想要分離應用和資料使其更具擴充套件性。”
而這些痛點Bitnami都可以很好的幫你解決。Bitnami幫你建立多容器應用程式,如從應用程式容器中分離資料庫容器。
從2016年年中開始,Bitnami對它自己的容器做了最佳化,同時建立了開發容器,將像Rails和Eclipse這樣的流行框架容器化了[4]。Adulhussein表示,他們之所以走了這條路,因為他們使用的大部分應用程式不能從框架很好的擴充套件,因為:
Adulhussein表示,這些開發容器允許其他團隊執行諸如“在幾秒鐘內建立開發環境,引導一個新應用程式”等操作。如果本地目錄是空的,它將掛載一個本地目錄。
透過Bitnami,你可以將容器入口點寫在Dockerfile中。這將在容器啟動時執行,並接收容器的命令(CMD)作為引數,通常用於啟動一個互動式shell,如下:
Adulhussein還說,你可以選擇一個執行時二進位制檔案作為映象入口:Docker概述了關於入口點的更多最佳實踐[6]。
差不多已經兩年了,容器社群已經意識到你可以執行輕量級的容器而不需要初始化或重置系統。但是,跳過初始化操作,這可能導致處理和訊號的錯誤處理,進而可能導致容器洩漏或者無法停止的容器。綜上,Bitnami的優勢恰恰在於將Yelp’s dumb-init很方便的應用於容器的簡單初始化(系統)。
Adulhussein提供了更小的Docker映象,這樣做的好處如下:
-
更小的空間佔用;
-
更快的傳輸;
-
更少的被攻擊的機率。
他指出,“ 像Alpine和Busybox這樣的東西真的是非常有用的容器,而且也是非常非常小的映象”,它們的大小都是5MB左右。他還提供了Bitnami在2016年底釋出的開源Minideb[7],用來作為更大的替代品(約50MB)。
他說:“如果你不能做到和Alpine很好的相容,那麼擁有一個類似於大型圖書館的管理軟體將是一個不錯的選擇。”
參考頗受歡迎的我可以使用非特權容器嗎?[8]網站中提到的建議,Adulhussein提倡遵循OpenShift最佳實踐(為了使用非特權容器)。他說,可以執行每個容器為隨機的GID – GID預設為0,假設UID是未知的:
bash
$ docker run -user 1001 bitnami / minideb id
uid = 1001 gid = 0(root)
groups = 0(root)
他繼續說,檔案對root組的所有使用者具有讀寫執行許可權,並且這些服務可以系結到非特權埠。不過,他警告說,如果執行時出錯,你可能會得到一個奇怪的“無名”容器資訊。
Bitnami正在透過向所有應用程式推出非特權和多階段構建[9]來最佳化Docker映象。他們還增加了Bitnami的檔案和教程[10],他們正在試驗Bazel容器的構建[11],以及如何透過執行容器叢集來使CI / CD平臺受益(持續整合和持續交付)。最後,他說Bitnami也在為Kubernetes開發一些工具,包括Helm包管理器和Kubeless本地無伺服器框架。
-
https://www.slideshare.net/AdnanAbdulhussein/lessons-learned-building-a-container-app-library-82098008
-
https://github.com/bitnami
-
http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/
-
https://docs.bitnami.com/containers/how-to/use-codenvy-bitnami-containers/
-
https://www.cloudaccess.net/additional-resources/140-tips-and-tricks/783-common-htaccess-rules.html
-
https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
-
http://github.com/bitnami/minideb
-
http://canihaznonprivilegedcontainers.info/
-
https://docs.bitnami.com/containers/how-to/optimize-docker-images-multistage-builds/
-
http://docs.bitnami.com/
-
https://docs.bazel.build/versions/master/be/docker.html
原文連結:https://thenewstack.io/six-lessons-bitnamis-transition-container-based-world/
本次培訓內容包括:Docker容器的原理與基本操作;容器網路與儲存解析;Kubernetes的架構與設計理念詳解;Kubernetes的資源物件使用說明;Kubernetes 中的開放介面CRI、CNI、CSI解析;Kubernetes監控、網路、日誌管理;容器應用的開發流程詳解等,點選識別下方二維碼加微信好友瞭解具體培訓內容。
3月23日開始上課,最後8個名額,點選閱讀原文連結即可報名。
長按二維碼向我轉賬
受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。