- OpenShift在企業中的實踐:PaaS DevOps微服務(第2版)
- 魏新宇 郭躍軍
- 2009字
- 2021-11-05 10:17:23
4.2.4 制作容器鏡像的最佳實踐
1.基礎鏡像的選擇
應用容器化的第一步就是選擇基礎鏡像,我們遵循如下標準選擇基礎鏡像。
鏡像應從官方途徑獲得,避免使用來自社區構建和維護的鏡像。應用鏡像應在PaaS平臺中構建,所選擇的基礎鏡像應來自可信鏡像源。可信的鏡像來源包括:
·Dockerhub官方鏡像(https://hub.docker.com)。
·紅帽容器鏡像庫registry.access.redhat.com或registry.redhat.io。
在OpenShift中我們更推薦使用第二類鏡像。紅帽提供的鏡像是經過嚴格安全掃描的,掃描遵循如下規則:
·鏡像中不能出現嚴重(Critical)和重要(Important)級別的安全問題。
·應遵循最小安裝原則,在鏡像中不要引入與應用系統運行無關的組件和軟件包。
·應為非特權鏡像(Unprivileged Image),不需要提升容器運行權限。
·應經過數字簽名檢查,避免鏡像被覆蓋和竄改。
·安全掃描僅限在鏡像范圍,不會涉及源碼等其他資源。
根據掃描結果確定鏡像的健康等級,只有A、B級別可運行在OpenShift平臺上,避免使用C及以下級別的鏡像,如圖4-2所示。

圖4-2 鏡像健康等級
紅帽很多基礎鏡像是可以直接從互聯網拉取(無須額外的認證)的,如RHEL7的基礎容器鏡像,如圖4-3所示。

圖4-3 RHEL7的基礎容器鏡像
查看鏡像的健康等級,如圖4-4所示。
使用docker或者podman都可以拉取鏡像,如圖4-5所示。
除了RHEL容器鏡像之外,紅帽還提供了通用基礎鏡像(Universal Base Image,UBI),它可以運行在任何OCI兼容的Linux上。這意味著我們可以在UBI上構建容器化的應用程序,將其推送到鏡像倉庫,然后分享給別人。UBI允許我們在所需的容器化應用程序上進行構建、共享和協作。UBI的架構如圖4-6所示。

圖4-4 查看鏡像的健康等級

圖4-5 成功拉取容器鏡像

圖4-6 UBI的架構
什么時候選擇使用UBI?可以參照以下幾點:
·開發人員想要構建一個容器鏡像,以便可以更廣泛地分發。
·運營團隊希望獲得具有企業生命周期的可支持的基礎鏡像。
·企業想要為客戶提供Kubernetes Operator。
·客戶希望在其紅帽環境中獲得企業支持。
·社區希望更自由地共享容器化的應用程序。
圖4-7給出了UBI 7提供的8類容器鏡像,我們可以根據需要進行選擇。

圖4-7 UBI 7提供的8類容器鏡像
我們可以在任意安裝了podman或docker的linux服務器上獲取UBI的鏡像,如圖4-8所示。

圖4-8 獲取UBI的鏡像
2.標準容器鏡像制作最佳實踐
制作標準容器鏡像,我們建議遵循以下最佳實踐。
·明確指定基礎鏡像:明確指定FROM鏡像的版本,如rhel:rhel7或ubi7/ubi:7.8,盡量避免使用latest標簽的鏡像。
·使用標簽維護鏡像兼容性:在給鏡像打標簽時,盡量保持向后兼容。例如,目前有一個名為foo:v1的鏡像,當更新鏡像之后,只要它仍然與原始鏡像兼容,你就可以繼續標記鏡像為foo:v1,這樣使用該標簽鏡像的消費者就不會被干擾。如果發布的是不兼容更新,那么就打新的標簽foo:v2。
·避免多進程:建議在一個容器中不啟動兩個進程,而是將多個進程在獨立的容器中運行,多個容器使用Pod封裝。
·清理臨時文件:應該全部移除在構建過程中產生的臨時文件,例如ADD命令加入的無用文件,強烈建議在yum install之后執行yum clean清除緩存這些臨時文件。
·在單行運行多個命令:盡量在單個RUN指令下運行多個命令,這樣減少鏡像的層,縮短下載和提取鏡像的時間。
·適當的順序放置指令:docker/podman是從上到下讀取Dockerfile,每個指令成功執行之后才會創建新的層執行下一個指令,這樣盡量將一些不變的指令放置到頂層,可以使用緩存加快構建速度。
·標記重要端口:使用EXPOSE標記重要端口,雖然沒有實際的暴露端口動作,但是對于可讀性和后續維護性有很重要意義,可以使用docker/podman inspect查看運行鏡像需要的端口。
·設置環境變量:使用ENV指令設置環境變量是最佳實踐。例如設置中間件的版本,這樣使用者不需要看Dockerfile就可以獲取版本;設置一些比較容易識別的程序使用的系統目錄,如JAVA_HOME。
·避免默認密碼:盡量避免設置默認密碼。很多人可能在使用鏡像的時候忘記修改默認密碼而導致安全問題。密碼可以使用環境變量替換。
·避免SSHD:盡量避免在容器中運行SSHD。可以使用docker/podman exec或oc rsh進入運行的容器中,不需要運行SSHD。
3.OpenShift容器鏡像制作最佳實踐
制作OpenShift容器鏡像,我們建議遵循以下最佳實踐。
·具備S2I功能:需要編寫用于S2I的裝配腳本和運行腳本,并放置到指定的目錄中。
·使用Service用于容器間通信:鏡像中調用其他服務時最好使用Service Name通信。
·通用依賴庫:確保鏡像中已經包含通用的庫,如創建Java鏡像時放置常用的JDBC Driver。
·配置文件中使用環境變量:重要的配置使用環境變量設置,如與其他服務通信的Service Name等。
·設置鏡像元數據:通過LABEL指令定義鏡像元數據,可以幫助OpenShift為開發人員提供更好的體驗,如鏡像描述、應用版本等。
·日志:日志可使用標準輸出。如果有多種日志,則添加前綴標識。
·Liveness和Readiness Probes:允許用戶定義健康監測判定進程狀態和是否可以處理請求。
·鏡像模板:盡量提供使用鏡像的模板。模板讓使用者更容易使用正確的配置部署鏡像。
·支持任意的User ID:默認OpenShift使用任意的User ID運行容器。將任意用戶需要讀寫的文件或目錄屬組設置為root group,因為任何用戶都屬于root group,但是root group又沒有特殊的權限,不會引起安全問題。另外,使用非root用戶啟動,監聽的端口必須大于1024。
在介紹了制作容器鏡像的最佳實踐以后,接下來介紹應用容器化的方法。我們在應用容器化的步驟中將遵循本小節介紹的最佳實踐。
- 編程卓越之道(卷3):軟件工程化
- Troubleshooting PostgreSQL
- TradeStation交易應用實踐:量化方法構建贏家策略(原書第2版)
- 微信小程序開發與實戰(微課版)
- Getting Started with Python and Raspberry Pi
- MINECRAFT編程:使用Python語言玩轉我的世界
- Delphi開發典型模塊大全(修訂版)
- Offer來了:Java面試核心知識點精講(框架篇)
- Java EE輕量級解決方案:S2SH
- 你必須知道的.NET(第2版)
- Distributed Computing with Python
- Learning Redux
- Python程序設計教程
- Cloud Development andDeployment with CloudBees
- Java項目驅動開發教程