本文将首先讨论镜像的构建时间和启动时间,接着会将一个简单的.NET程序运行在基于容器的应用上,然后观察镜像大小的变化,最终缩短镜像的构建和加载时间。此外,代码优化是本文的另一个主题。 现在,.NET开发人员可以无障碍地使用如Docker这样的Linux容器,那么让我们来尝试如何以正确的方式配置一个容器。 可能,文章的标题改成“Linux容器开发人员的演变”会更好。由于.NET可在Linux(以及Windows和macOS)上运行,所以整个世界的Linux容器和微服务已经开放给了.NET开发人员。 有着大量的开发人员,长期的运行记录和优异性能指标的.NET,现在给以Windows为中心的开发人员提供了一个使用Linux容器的机会。 虽然在Linux容器中尝试运行.NET代码是诱人的,同时也会产生一些细微差别,但是这样做是不会错的。你可以很容易地将一些.NET代码推送到镜像中。 毕竟,一切都发生的这么快,一定都很好。 对不对? 事实并非如此。让.NET代码运行在Linux容器中并不是一件简单的事情,但请记住:“先让它工作,然后让它工作得很快。” 在下面的例子中,上文说的“很快”指的是构建镜像所需的时间,启动镜像所需的时间和镜像内部代码的性能。本文将首先讨论镜像的构建时间和启动时间,接着会将一个简单的.NET程序运行在基于容器的应用上,然后观察镜像大小的变化,最终缩短镜像的构建和加载时间。此外,代码优化是本文的另一个主题。 短暂的停留 考虑一个非常简单的微服务示例,它只给出一个“Hello world”类型的HTTP响应。也就是说,当在浏览器中填写URL,你就会得到一个包括主机名的Web页面。 我们可从这个代码库中(https://github.com/donschenck/dotnet_docker_msa)下载源码,并制作第一个Dockerfile(Dockerfile.attempt1),接着使用以下命令构建镜像: #dockerbuild-tattempt1-fDockerfile.attempt1. 然后在容器中运行镜像: #dockerrun-d-p5000:5000--nameattempt1attempt1 将浏览器的URL指向主机的IP地址,情况如下:
数字 第一次构建镜像,一共耗时95秒。其中,下载红帽企业Linux(简称RHEL)镜像与安装.NET SDK,这些文件一共490MB。最终,镜像大小为659MB。 一般而言,镜像的后续构建将更快,因为Docker化的镜像已经在主机上可用。改变源码后,我们再次运行构建。这一次构建镜像,大约耗时50秒,得到了相同大小的镜像,也是659MB。 镜像的大小很重要。因为镜像使用操作系统的存储空间,虽然空间便宜,但它仍然是有限的商品。当定期使用容器时,我们很容易忽略过时的镜像,然而它仍然在占用磁盘。如果你不注意的话,磁盘空间将很快用尽。 如何使镜像尽可能的小? 移除镜像不需要的部分 使用命令 在构建镜像之前构建应用 应用是在容器中运行镜像时构建.NET程序的。这耗时大约1.6秒虽然时间不长,但却是在浪费时间。 在恢复之前插入的 与此同时,镜像大小却增加到610.2MB,而我们还得运行 运行Dotnet Publish命令 因为容器是一个运行时环境,那我们为什么不使用 使用dotnet发布代码,会减少镜像大小和缩短容器启动时间。更改project.json文件,注释掉下图中红框的内容,这告诉编译器此文件为一个平台构建。您可以在下图中看到它: 接下来,我们使用 因为我们不再需要安装.NET程序,只要一个包含RHEL文件的基础镜像即可,这样就减少了镜像的大小。这是Dockerfile的第四次迭代Dockerfile.attempt4: FROMregistry.access.redhat.com/rhel7 RUNyuminstall-ylibunwind RUNyuminstall-ylibicu ADDbin/Release/netcoreapp1.0/rhel.7.2-x64/publish/./opt/app-root/src/ WORKDIR/opt/app-root/src/ EXPOSE5000 CMD["/bin/bash","-c","/opt/app-root/src/dotnet_docker_msa"] 请注意, 谁需要缓存? 多次运行 FROMregistry.access.redhat.com/rhel7 RUNyuminstall-ylibunwind |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|