用dw做的网站容易变形,网站关键词设定,厦门seo推广外包,阿里云万网网站制作本文将首先讨论镜像的构建时间和启动时间#xff0c;接着会将一个简单的.NET程序运行在基于容器的应用上#xff0c;然后观察镜像大小的变化#xff0c;最终缩短镜像的构建和加载时间。此外#xff0c;代码优化是本文的另一个主题。
现在#xff0c;.NET开发人员可以无障…
本文将首先讨论镜像的构建时间和启动时间接着会将一个简单的.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下载源码并制作第一个DockerfileDockerfile.attempt1接着使用以下命令构建镜像
# docker build -t attempt1 -f Dockerfile.attempt1 .
然后在容器中运行镜像
# docker run -d -p 5000:5000 --name attempt1 attempt1
将浏览器的URL指向主机的IP地址情况如下 数字 第一次构建镜像一共耗时95秒。其中下载红帽企业Linux简称RHEL镜像与安装.NET SDK这些文件一共490MB。最终镜像大小为659MB。
一般而言镜像的后续构建将更快因为Docker化的镜像已经在主机上可用。改变源码后我们再次运行构建。这一次构建镜像大约耗时50秒得到了相同大小的镜像也是659MB。
镜像的大小很重要。因为镜像使用操作系统的存储空间虽然空间便宜但它仍然是有限的商品。当定期使用容器时我们很容易忽略过时的镜像然而它仍然在占用磁盘。如果你不注意的话磁盘空间将很快用尽。
如何使镜像尽可能的小
移除镜像不需要的部分 使用命令dotnet restore --no-cache可以消除任何缓存这样镜像的大小下降到608.6MB减少了50.6 MB同比缩小超过7。
在构建镜像之前构建应用 应用是在容器中运行镜像时构建.NET程序的。这耗时大约1.6秒——虽然时间不长但却是在浪费时间。
在恢复之前插入的dotnet build命令并在构建镜像之前构建应用这样的话容器将会更快地启动。这个结果可在Dockerfile.attempt3中实现。
与此同时镜像大小却增加到610.2MB而我们还得运行dotnet build虽然现在花这个时间但却可在每次启动容器时受益。
运行Dotnet Publish命令 因为容器是一个运行时环境那我们为什么不使用dotnet publish命令发布代码然后把代码放入镜像呢如果这样做的话我们就没必要在镜像中安装.NET程序了。毕竟我们需要的是一个可在任何地方独立运行的应用。
使用dotnet发布代码会减少镜像大小和缩短容器启动时间。更改project.json文件注释掉下图中红框的内容这告诉编译器此文件为一个平台构建。您可以在下图中看到它 接下来我们使用dotnet publish -c Release -r rheh.7.2-x64发布代码这会把所有的编译文件和运行时文件放入一个文件夹我们把此文件夹复制到镜像中。
因为我们不再需要安装.NET程序只要一个包含RHEL文件的基础镜像即可这样就减少了镜像的大小。这是Dockerfile的第四次迭代——Dockerfile.attempt4
FROM registry.access.redhat.com/rhel7
RUN yum install -y libunwind
RUN yum install -y libicu
ADD bin/Release/netcoreapp1.0/rhel.7.2-x64/publish/. /opt/app-root/src/
WORKDIR /opt/app-root/src/
EXPOSE 5000
CMD [/bin/bash, -c, /opt/app-root/src/dotnet_docker_msa]
请注意yum install命令将安装一些.NET需要的依赖文件然后运行docker build命令最终生成一个694.6MB的镜像。
谁需要缓存 多次运行yum install命令前一次操作将为后一次构建缓存。如果在每个yum install命令之后我们立即清除缓存效果将会很好。下面是Dockerfile的第五次迭代———Dockerfile.attempt5
FROM registry.access.redhat.com/rhel7
RUN yum install -y libunwind yum clean all
RUN yum install -y libicu yum clean all
ADD bin/Release/netcoreapp1.0/rhel.7.2-x64/publish/. /opt/app-root/src/
WORKDIR /opt/app-root/src/
EXPOSE 5000
CMD [/bin/bash, -c, /opt/app-root/src/dotnet_docker_msa]
基于Dockerfile.attempt5构建的镜像其大小减少到293.7MB这比第一次构建缩小了55%。
堆叠命令 对Dockerfile做最后更改我们需要堆叠yum install命令具体内容如下所示
FROM registry.access.redhat.com/rhel7
RUN yum install -y libunwind libicu yum clean all
ADD bin/Release/netcoreapp1.0/rhel.7.2-x64/publish/. /opt/app-root/src/
WORKDIR /opt/app-root/src/
EXPOSE 5000
CMD [/bin/bash, -c, /opt/app-root/src/dotnet_docker_msa]
最终得到的镜像大小为257.5MB这比第一次构建缩小了60%。
下面是各个Dockerfile构建的镜像大小对比图 总结 在探索新技术与新模式时我们不能将早期的结果与最优做法相混淆。虽然早期的成功会给我们带来兴奋和鼓励但它也可能使我们丧失进步的动力。勤奋然后不断尝试并且始终接受改进的建议会帮助我们走的更远。
推荐一个培训 【3天烧脑式微服务架构训练营 | 上海站】本次培训涉及DevOps微服务需要解决的问题、回归、微服务那些事儿、Spring Cloud简介、服务发现Eureka、客户端负载均衡Ribbon、声明式的客户端Feign、使用断路器实现微服务容错Hystrix、微服务网关Zuul、统一配置管理Spring Cloud Config、微服务跟踪Spring Cloud Sleuth、Spring Cloud常见问题总结等点击下面图片即可查看具体培训内容。 点击阅读原文链接可直接报名。