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资源限制,并提供更多配置供您调整的版本。java
.NET 团队致力于使.NET Core成为真正的容器运行时。在过去的版本中,咱们认为.NET Core是容器友好的。.NET 团队如今正在增强运行时,使其在低内存环境中具备容器感知功能并高效运行。 咱们作出的最基本的改变是减小CoreCLR默认使用的内存,在过去的几个版本中,.NET 团队付出了不少努力来改进.NET Core在TechEmpower基准测试中的表现。使用.NET Core 3.0,.NET 团队找到了显着提升性能并减小大量使用内存的方法。.NET 团队如今在容量限制为大约150 MB的容器中运行TechEmpower纯文本基准测试,同时每秒处理数百万个请求,这使咱们可以天天验证内存受限的状况。docker
说到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应用程序能够被"发布",使得它和它的全部依赖关系在一个地方,这很容易放入容器学习