DockerCon 2019本周將在舊金山舉行 ,DockerCon 是從業者、貢獻者、維護者、開發者和容器生態系統學習、網絡和創新的一站式活動。 .NET 團隊博客發布了《一起使用.NET和Docker - DockerCon 2019更新》,分享.NET團隊如何在過去一年中改進使用.NET和Docker的經驗。.NET團隊去年改進.NET Core Docker體驗的大部分工作都集中在.NET Core 3.0上。.NET Core 3.0 是第一個發布實質性運行時更改以使CoreCLR更有效的支持Docker資源限制,並提供更多配置供您調整的版本。
.NET 團隊致力於使.NET Core成為真正的容器運行時。在過去的版本中,我們認為.NET Core是容器友好的。.NET 團隊現在正在加強運行時,使其在低內存環境中具有容器感知功能並高效運行。 我們做出的最基本的改變是減少CoreCLR默認使用的內存,在過去的幾個版本中,.NET 團隊付出了很多努力來改進.NET Core在TechEmpower基准測試中的表現。使用.NET Core 3.0,.NET 團隊找到了顯着提高性能並減少大量使用內存的方法。.NET 團隊現在在容量限制為大約150 MB的容器中運行TechEmpower純文本基准測試,同時每秒處理數百萬個請求,這使我們能夠每天驗證內存受限的情況。
說到Docker,我對.NET Core搭配 Docker的使用非常滿意,.NET Core 3.0的到來會更加美好,再借助於kubernetes的協調,我們的生活會越來越美好。
但是長久以來,Docker 和 Java 就像一對“歡喜冤家”。一方面,容器技術的“不可變基礎設施”特性為開發者帶來了無比寶貴的依賴與環境一致性保證;但另一方面, Linux 容器通過 Cgroups 對應用進行資源限制的方式跟所有依賴於 JVM 進行資源分配的編程語言都產生了本質的沖突。我在客戶咨詢的過程中經常見到客戶的基於java8的應用程序(國內大量的Java應用都是java8)在docker中運行時出現“隨機”故障?或者也許是一些奇怪的死機?兩者都可能是Java 8(仍廣泛使用的)中糟糕的docker支持引起的。Docker使用控制組(cgroups)來限制資源。在容器中運行應用程序時限制內存和CPU絕對是個好主意――它可以阻止應用程序占用整個可用內存及/或CPU,這會導致在同一個系統上運行的其他容器毫無反應。限制資源可提高應用程序的可靠性和穩定性。它還允許為硬件容量作好規划。在Kubernetes或DC/OS之類的編排系統上運行容器時尤為重要。
JVM可以“看到”系統上的整個內存和可用的所有CPU核心,並確保與資源一致。它默認情況下將最大堆大小(heap size)設置為系統內存的1/4,並將某些線程池大小(比如針對GC)設置為物理核心數量,我們在擁有64GB內存的系統上運行,默認的最大堆大小是物理內存的1/4即16GB。如果我們使用docker cgroups限制內存,會發生什么,JVM進程被殺死了。由於它是一個子進程――容器本身幸存下來,但通常當java是容器(PID 1)內的唯一進程時,容器會崩潰。
CPU怎么樣? 系統上的確有12個CPU。因此,即使可用處理器的數量限制為1,JVM也會嘗試使用12 , Java8和Docker的相殺,但是如果你升級到新的Java版本(10及以上版本)已經內置了docker支持功能。但有時升級不是辦法,比如說如果應用程序與新JVM不兼容就不行,而且Oracle在2019年4月更改了Java 8更新的許可證,自Java SE 8 Update 211以來商業使用不再免費。 不過也有好消息,而就在上周,最近發布的OpenJDK 鏡像 openjdk:8u212-jdk 終於能夠讓 Java 8 運行時在容器里面為應用分配出合理的 CPU 數目和堆棧大小了,具體可以參考 https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54。
從Oracle JDK 8 切換到OpenJDK 8 是想繼續使用Java的好選擇,不過我還是勸告大家可以考慮下.NET Core 了,新的項目可以采用.NET Core 2.2進行開發,半年后就可以轉到.NET Core 3.0 .NET Core是以MIT協議開源, Java是GPL協議開源。 Java 8 SDK升級Oracle要收費這件事對於很多小公司是有着重大的影響的。眾多沒有能力開發維護OpenJDK的公司完全可以轉向更具有競爭力的.NET Core,.NET Core從屬於.NET基金會,由微軟進行官方支持。使用最寬松的MIT和Apache 2開源協議,文檔協議遵循CC-BY。這將允許任何人任何組織和企業任意處置,包括使用,復制,修改,合並,發表,分發,再授權,或者銷售。唯一的限制是,軟件中必須包含上述版 權和許可提示,后者協議將會除了為用戶提供版權許可之外,還有專利許可,並且授權是免費,無排他性的(任何個人和企業都能獲得授權)並且永久不可撤銷,用戶使用.NET Core完全不用擔心收費問題,你可以很自由的部署在任何地方。
現在是雲計算時代,.NET Core已經磨練5年時間,准備好了迎接雲計算時代的雲原生應用開發,雲系統中,用更少的硬件為更高密度的用戶提供服務是非常重要的。應用程序的占位面積越小,密度越高。容器只包含應用程序及其依賴項。文件大小要小很多倍,啟動時間以秒為單位,只有應用程序加載到內存中,容器保證在任何主機上工作。鑒於容器的明顯優勢,.NET Core的設計決定之一就是使其成為模塊化。這意味着你的.NET Core應用程序可以被"發布",使得它和它的所有依賴關系在一個地方,這很容易放入容器