DockerCon 2019本周将在旧金山举行 ,DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团队博客发布了《一起使用.NET和Docker - DockerCon 2019更新》:https://devblogs.microsoft.com/dotnet/using-net-and-docker-together-dockercon-2019-update/,分享.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?spm=a2c4e.11153940.blogcont700628.17.10fb43bf5u3n1d。

从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应用程序可以被"发布",使得它和它的所有依赖关系在一个地方,这很容易放入容器

原文地址:https://www.cnblogs.com/shanyou/p/10800521.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

.NET和Docker ,比翼双飞相关推荐

  1. /var/lib/docker/overlay2/xxxxx no such file or directory docker文件删除引发的问题

    记一次误删引发的服务雪崩 K8s node节点磁盘报警,报警后我找到服务中占用磁盘最多的地方,在overlay2目录下,对下面的文件进行了删除   删除后,有状态服务先出现了问题,服务无法启动.停止. ...

  2. 本地打包Docker镜像上传至阿里云远程仓库(一站式脚本)

    打包镜像上传至远程仓库: 1. 本地项目为 mytest-project 2. 仓库为阿里云镜像仓库 registry.cn-beijing.aliyuncs.com/test/mytest-proj ...

  3. docker报错:driver failed programming external connectivity on endpoint, iptables:No chain by that name

    docker 报错: Error response from daemon: Cannot restart container hello: driver failed programming ext ...

  4. Docker容器的备份与恢复,Docker镜像的备份与恢复

    1. 备份容器 首先,为了备份Docker中的容器,我们会想看看我们想要备份的容器列表.要达成该目的,我们需要在我们运行着Docker引擎,并已创建了容器的Linux机器中运行 docker ps 命 ...

  5. docker安装kafka消息队列

    1. 启动zookeeper容器(Zookeeper用于崩溃检测,实现Topic发现,和维护Topic的生产和消费状态) docker run -d --name zookeeper -p 2181: ...

  6. 设置普通用户执行docker命令,执行docker命令无需输入密码或者切换root用户

    每次执行docker命令都要输入密码或者切换root用户,非常不方便,尤其是在shell脚本中就更麻烦了,一起来解决这个问题: 1. 创建名为docker的组,如果之前已经有该组就会提示已存在: su ...

  7. docker :open /var/lib/docker/tmp/GetImageBlob318829910: no such file or directory异常解决

    千万不要直接去重装docker,不要删除镜像,不要手动创建目录和文件,只需要这样就好了!

  8. 将jar包部署在docker上,将jar包打成镜像,使用docker部署jar包

    假设你已经准备好以下东西,即可进行服务部署 一台安装好docker的linux服务器(安装docker见安装docker) 准备好的jar包 接下来开始吧! 将jar包上传至服务器(建好文件夹存放以方 ...

  9. 使用rancher对Docker容器服务升级

    这是笔者以前使用到的一个docker管理工具--rancher 升级服务的步骤 记录一下,说不定有人需要或者以后能用上呢? 1.打包好后上传服务器,编写Dockerfile FROM jdk8apli ...

最新文章

  1. OpenCV中的二进制鲁棒独立基本特征——BRIEF
  2. python下什么版本-python版本有什么不同
  3. 大数的菲波那契计算/Huge Fibonacci Numbers - ACM
  4. 在oracle中通过connect by prior来实现递归查询!
  5. 使用头文件的原因和规范
  6. OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
  7. vue-cli 该如何正确打包iconfont?
  8. [Gamma阶段]第四次Scrum Meeting
  9. linux命令行工具大全,七款极为实用的Linux命令行工具
  10. CentOS7.6安装VNC
  11. Protocol Buffer编译器安装
  12. 在js中为什么0.1+0.2不等于0.3
  13. VS2010如何打开VS2012的项目
  14. cisco ASA ios升级或恢复
  15. 删除Skypee顽固病毒(AutoIt3木马)
  16. 弱网测试工具-ATC和NEWT
  17. 教你找到免费的Google Translate API(谷歌翻译接口)+C#版的Google翻译函数
  18. 可视化分析中国500强排行榜数据后,我发现了...
  19. 芦荟天然植物提取物的作用是什么
  20. 派森小镇(三)被抛弃的·小列表

热门文章

  1. web 后台返回json格式数据的方式(status 406)
  2. Fish Shell 使用笔记
  3. Vue单页面在ios10系统上出现白屏的bug
  4. Linux 环境下 jdk1.8 maven3.2.3 Git2.8.0 安装脚本
  5. Docker Storm开发环境搭建
  6. HTML accesskey 属性
  7. php 利用http上传协议(表单提交上传图片 )
  8. MyBatis --教程
  9. CentOS利用crontab执行计划任务
  10. [Linux程序设计][调试][ElectricFence]