大家好,我是等天黑。

.NET 又双叒叕出新功能了, 就在前几天,.NET 团队发布博客,宣称在 .NET SDK 中内置了对 .NET 应用容器化的支持。

小试牛刀

在正式介绍它之前,先通过一个简单的例子,看下它是如何使用的。

# 创建一个新项目, 然后进入到文件夹
dotnet new mvc -n my-awesome-container-app
cd my-awesome-container-app # 添加下面的程序包
#(目前需要手动引入, 后续会直接集成到 .NET SDK)
dotnet add package Microsoft.NET.Build.Containers # 发布项目
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer # 在容器中运行应用
docker run -it --rm -p 5010:80 my-awesome-container-app:1.0.0

然后访问 http://localhost:5010, 就已经可以看到这个测试的 .NET MVC 应用了。

注意,这里需要安装 .NET 7 preview 7 或以上版本,并且本机安装并运行了 Docker。

容器化 .NET 应用是不是变得更加简单方便了。

内置容器化支持

可能你已经有了疑问, 这是什么魔法?我们熟悉的 Dockerfile 去哪了? 基础镜像是怎么定义的?镜像标签是什么?

是的,之前我们更熟悉使用 Dockerfile 的形式构建镜像。而现在,可以在 .NET 项目中,配置 MSBuild 属性来做同样的事情,指定基础镜像,标签等等。

要对 .NET 应用进行容器化,只需要在 project.csproj 中配置属性即可,如下

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>my_awesome_container_app</RootNamespace>
</PropertyGroup> <PropertyGroup>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PublishProfile>DefaultContainer</PublishProfile>
<ContainerImageName>my-super-awesome-app</ContainerImageName>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Build.Containers" Version="0.1.8" />
</ItemGroup> </Project>

下面是一些常见的自定义参数介绍

基础镜像

<ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:6.0</ContainerBaseImage>

镜像库

默认情况下,会推送到本地的 Docker Daemon,当然也支持推送到远程的镜像库。

<ContainerRegistry>registry.mycorp.com:1234</ContainerRegistry>

镜像标签

标签可以给应用生成不同的版本,默认情况是读取项目的 Version 属性,你也可以指定 ContainerImageTag 属性,如下

<ContainerImageTag>1.2.3-alpha2</ContainerImageTag>

多个标签用分号隔开

<ContainerImageTags>1.2.3-alpha2;latest</ContainerImageTags>

目前来说,项目还是在初期阶段,不过已经看到了 .NET 团队在这方面的努力,对于其他的一些容器化功能,相信会很快在未来的版本中添加。

更多详细的内容,可以参考下面的文档:

https://github.com/dotnet/sdk-container-builds/blob/main/docs/ContainerCustomization.md

总结

上面的容器化功能,主要是由 sdk-container-builds 这个库实现的。工作原理并不复杂,代码也不多,里面使用到了 .NET 7 新的 Tar API 处理文件,并构建了标准的 OCI 镜像文件,然后通过 Docker Registry HTTP APIDocker Registry 进行交互以及上传镜像。

希望本文对您有用 !

Reference

https://github.com/dotnet/sdk-container-builds

https://docs.docker.com/registry/spec/api/

https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk

.NET 7 SDK 对容器的内置支持的更多相关文章

  1. Spring MVC内置支持的4种内容协商方式【享学Spring MVC】

    每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...

  2. php 内置支持的标签和属性

    内置支持的标签和属性列表如下: 标签名 作用 包含属性 include 包含外部模板文件(闭合) file import 导入资源文件(闭合 包括js css load别名) file,href,ty ...

  3. 迭代器模式的一种应用场景以及C#对于迭代器的内置支持

    迭代器模式 先放上gof中对于迭代器模式的介绍镇楼 意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 别名 游标(Cursor). 动机 一个聚合对象, 如列表(li ...

  4. thinkphp中ajax使用实例(thinkphp内置支持ajax)

    thinkphp中ajax使用实例(thinkphp内置支持ajax) 一.总结 1.thinkphp应该是内置支持ajax的,所以请求类型里面才会有是否是ajax // 是否为 Ajax 请求 if ...

  5. 重磅!K8S 1.18版本将内置支持SideCar容器。

    作者:justmine 头条号:大数据与云原生 微信公众号:大数据与云原生 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便阅读,微信公众号已按分类排版,后续的文 ...

  6. Apache Spark 3.0 将内置支持 GPU 调度

    如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...

  7. Spring Boot 定制与优化内置的Tomcat容器

    1.Spring Boot定制与优化内置Tomcat容器. > 内置的容器有三个分别是Undertow.Jetty.Tomcat,Spring Boot 对这三个容器分别进行了实现,它们上层接口 ...

  8. python__007内置函数

    本文摘自:https://docs.python.org/3/library/functions.html?highlight=built#ascii     内置功能     abs() delat ...

  9. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

随机推荐

  1. SpringBoot2.x整合Prometheus+Grafana【附源码+视频】

    图文并茂,新手入门教程,建议收藏 SpringBoot2.x整合Prometheus+Grafana[附源码+视频] 附源码+视频 目录 工程简介 简介 Prometheus grafana Spri ...

  2. 【Java集合】ArrayDeque源码解读

    简介 双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列. ArrayDeque是一种以循环数组方式实现的双端队列,它是非线程安全的. 它既可以作为队列也可以作为栈. 继承体系 Arr ...

  3. zabbix配置邮件报警

    1.yum源安装sendmail,sendmail-cf和mailx 2.关闭postfix,/etc/init.d/postfix stop chkconfig posfix off 3.启动sen ...

  4. sql-DCL用户及权限管理及其他常用命令-oracle

    DCL 用户管理 创建用户 create user 用户名 identified by 密码; 在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限 ...

  5. mysql备份数据库linux

    备份数据库 问题描述: ​ 我们用的是mysql,以今天遇到的情况为例,我们是在两台服务器上要搭相同的平台,部署完成后页面报错,发现是数据库的问题,我们打开数据库查看,确实数据库中少建一个wind数据 ...

  6. [LINUX] 像电影里的黑客一样用 terminal 作为日常开发

    目录 1.效果预览 2.具体实现 2.1 定位鼠标位置 2.2 获取屏幕位置 2.3 计算鼠标在哪个窗口 2.4 1920x1080 平铺效果设计 2.5 1280x1024 平铺效果设计 3 代码 ...

  7. SpringBoot 开发案例之整合FastDFS分布式文件系统

    1.pom依赖 <!--fastdfs--> <dependency> <groupId>com.github.tobato</groupId> < ...

  8. 在Visual Studio Code 中配置Python 中文乱码问题

    在Visual Studio Code 中配置Python 中文乱码问题 方法一:直接代码修改字符集 添加前四行代码 import io import sys #改变标准输出的默认编码 sys.std ...

  9. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

  10. 聊一聊 C# 后台GC 到底是怎么回事?

    一:背景 写这一篇的目的主要是因为.NET领域内几本关于阐述GC方面的书,都是纯理论,所以懂得人自然懂,不懂得人也没法亲自验证,这一篇我就用 windbg + 源码 让大家眼见为实. 二:为什么要引入 ...