本文介紹Custom Container(自定義容器運行環境)的背景信息、基本原理、使用限制和HTTP Server配置要求等。
背景信息
在云原生時代,容器鏡像已經逐漸成為軟件部署和開發的標準工具。為優化開發者體驗、提升開發和交付效率,函數計算提供Custom Container,開發者可以將容器鏡像作為函數的交付物。使用Custom Container具有以下優勢。
低成本遷移,無需修改代碼或重新編譯二進制文件。共享對象(*.so),保持開發和線上環境一致。
避免代碼和依賴分離,簡化分發和部署的步驟。
容器鏡像天然分層緩存,提高代碼上傳和拉取效率。
標準可復用的第三方庫引用、分享、構建、代碼上傳、存儲和版本管理,豐富的開源生態CI/CD交付體驗。
可通過HTTP協議和函數計算系統交互。
可運行無需交互的鏡像。
基本原理
函數計算系統初始化執行環境實例前會扮演該函數的服務角色(Service Role),獲得臨時用戶名和密碼并拉取鏡像。拉取成功后,根據指定的啟動命令Command和參數Args啟動您的鏡像。
Custom Container函數可分為Web Server模式與非Web Server模式。
Web Server模式
Web Server模式是指未設置webServerMode或webServerMode設置為true。容器鏡像交付物需要包含HTTP Server。函數計算通過配置的CAPort端口監聽您定義的HTTP Server,此HTTP Server將接管函數計算的所有請求,包括來自您的事件函數和HTTP函數的調用。您在開發函數具體的交互邏輯之前,一般需要確認開發的是事件函數還是HTTP函數,原理如下所示:
事件函數
HTTP函數
非Web Server模式
非Web Server模式是指webServerMode設置為false。容器鏡像交付物內無需定義HTTP Server。啟動運行后,容器鏡像需在函數超時時間內運行完成并退出。由于沒有端口進行交互,此模式僅支持事件觸發,不支持HTTP函數。事件將以環境變量的形式傳入容器內。原理如下所示:
事件函數
目前支持非Web Server模式的地域包括華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華南1(深圳)、中國香港、日本(東京)、新加坡、美國(弗吉尼亞)、美國(硅谷)。
使用限制
鏡像大小限制
ACR個人版、企業版基礎版、企業版標準版和高級版,最大支持10 GB的未解壓鏡像。
鏡像啟動加速
函數創建或更新后,需等待加速鏡像準備完成后,才能在函數計算控制臺觸發函數調用。
鏡像倉庫
支持拉取阿里云容器鏡像服務的企業版和個人版的鏡像。更多信息,請參見什么是容器鏡像服務ACR。
鏡像訪問
目前僅ACR個人版公開鏡像支持跨賬號同地域讀取,其余鏡像僅支持同賬號同地域下私有鏡像倉庫讀取。
容器內文件讀寫權限
容器run-as-user UID默認是Root用戶ID,即UID=0
。如果您在Dockerfile中指定了具體的使用者,則會以指定的使用者運行該容器鏡像。
容器可寫層存儲空間限制
排除只讀鏡像層,容器產生的數據大小限制為512 MB或10 GB,同函數高級配置項中的磁盤大小。具體信息,請參見創建函數。
鏡像架構限制
目前函數計算僅支持AMD64鏡像架構,因此,針對搭載Apple芯片的Mac電腦(或其他ARM架構的機器),構建鏡像時需要指定鏡像的編譯平臺為Linux/Amd64。參考命令如docker build --platform linux/amd64 -t $IMAGE_NAME .
。
構建完成后,可執行docker inspect
進行檢查。如果返回內容包含 "Architecture" : "amd64"
,則表示構建的鏡像正確。
HTTP Server配置要求
以下要求僅適用于Web Server模式的Custom Container函數:
Custom Container啟動的服務一定要監聽
0.0.0.0:CAPort
或*:CAPort
端口。如果您使用127.0.0.1:CAPort
端口,會導致請求超時,出現以下錯誤:{ "ErrorCode":"FunctionNotStarted", "ErrorMessage":"TheCA'shttpservercannotbestarted:ContainerStartDuration:25000000000.PingCAfaileddueto:dialtcp21.0.XX.XX:9000:getsockopt:connectionrefusedLogs:2019-11-29T09:53:30.859837462ZListeningonport9000" }
Custom Container的監聽端口,即函數屬性CAPort默認是9000。如果Custom Container使用默認的監聽端口,那么實現的Custom Container的HTTP Server監聽的端口也必須是9000。 如果Custom Container使用的監聽端口是8080,那么實現的Custom Container的HTTP Server監聽的端口也必須是8080。
Connection需要設置為Keep-Alive,Server端請求超時時間需設置在15分鐘及以上。示例如下:
//例如,Node.js使用Express時。 var server = app.listen(PORT, HOST); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout
HTTP Server需要在120秒內啟動完畢。
公共請求頭
Custom Container的公共請求頭和Custom Runtime的公共請求頭一致。更多信息,請參見函數計算公共請求頭。
日志格式
Custom Container中所有打印到標準輸出(Stdout)的日志會自動收集到您指定的日志服務中。關于配置日志功能的具體操作,請參見配置日志。
Custom Container的日志格式與Custom Runtime的日志格式一致。更多信息,請參見函數日志格式。
冷啟動優化最佳實踐
相比于代碼包,容器鏡像依賴的基礎環境會帶來額外的數據下載和解壓的時間。為了更好的冷啟動體驗,推薦您使用以下最佳實踐:
容器鏡像地址推薦使用與函數計算同地域的VPC鏡像地址,以減少鏡像拉取延時,提高穩定性。
鏡像最小化,基于類似Alpine或Ubuntu這樣的最小鏡像或者是其他鏡像中精簡版本構建自定義鏡像。僅保留必要的依賴,刪除不必要的文檔、數據和其他文件。
容器鏡像配合預留實例一起使用。更多信息,請參見彈性管理(含預留模式)。
在資源允許和線程安全的情況下,搭配使用單實例多并發功能,可避免不必要的冷啟動,同時降低成本。更多信息,請參見設置實例并發度。
函數創建或更新后,使用函數計算默認開啟的鏡像啟動加速功能,可減少鏡像啟動的冷啟動耗時。更多信息,請參見鏡像啟動加速(ACR個人版)和鏡像啟動加速(ACR企業版)。
計費說明
Custom Container的計費項與其他類型Runtime的計費項一致。更多信息,請參見計費概述。
其中,鏡像資源使用量中的執行時間是從倉庫拉取鏡像到拉取鏡像結束的時長。例如,1024 MB內存的實例拉取鏡像耗時10秒,則本次拉取鏡像的資源消耗量為10 GB*秒。
容器鏡像在一定時間范圍內有緩存,因此并不是每次冷啟動一定會產生鏡像拉取的費用。