官术网_书友最值得收藏!

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。

在介紹了制作容器鏡像的最佳實踐以后,接下來介紹應用容器化的方法。我們在應用容器化的步驟中將遵循本小節介紹的最佳實踐。

主站蜘蛛池模板: 治县。| 台北县| 峡江县| 阿克陶县| 达日县| 巴青县| 南雄市| 濮阳市| 如东县| 高台县| 邹城市| 大邑县| 梅州市| 府谷县| 贵溪市| 襄汾县| 波密县| 宁波市| 陆良县| 稷山县| 营口市| 仁布县| 青田县| 洛南县| 观塘区| 额尔古纳市| 镇巴县| 新巴尔虎右旗| 昭通市| 玉屏| 逊克县| 明光市| 鄂尔多斯市| 九江市| 东明县| 张家港市| 延长县| 深水埗区| 合江县| 怀安县| 屏边|