在阿里云上运行ASP.NET Docker应用

微软的.NET开源后可以运行在Mac和Linux平台,也支持运行在Docker容器里。我们今天要尝试的是在Mac上开发一个.NET应用,并且把它用Docker跑起来,然后部署到阿里云容器服务上。

本文的后续文章介绍了如何访问SQLServer数据库,点击[在Docker中运行SQLServer ASP.NET应用]。()

在Mac上安装.NET Core

按照微软的官方文档,我们可以非常容易地在Mac上安装.NET Core。

安装openssl

在Mac上安装.NET Core需要先安装openssl。

brew update
brew install openssl
brew link --force openssl

安装 .NET Core SDK

下载.NET Core SDK官方安装包,按照提示安装即可。

可选: 安装 Visual Studio Code

这步不是必须的,你可以用自己喜欢的编辑器写.NET代码。和Visual Studio不同,Visual Studio Code是一个跨平台的代码编辑器,还有调试能力,如果你想尝试一下新的体验,可以下载Visual Studio Code。解开压缩包后把应用拷贝到系统Application目录下。

编译,运行,并构建Docker镜像

本地运行Hello World

使用dotnet命令行可以创建.NET HelloWorld程序。dotnet restore是将所有依赖信息恢复出来。

$ dotnet new
$ dotnet restore

运行新生成的程序

$ dotnet run
Project dotnet-hello (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
Compiling dotnet-hello for .NETCoreApp,Version=v1.0

Compilation succeeded.
    0 Warning(s)
    0 Error(s)

Time elapsed 00:00:01.2329439

Hello World!

运行ASP.NET应用

为了部署到云上,我们需要一个Web应用。按照ASP.NET官方入门文档的步骤可以创建一个Web应用。

不愿意自己敲字的同学可以从这里复制代码:
https://code.aliyun.com/libin.libin/dotnet-helloworld

$dotnet restore
$dotnet run
Project dotnet-helloworld (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Hosting environment: Production
Content root path: /Users/**/netcoreapp1.0
Now listening on: http://*:5000
Application started. Press Ctrl+C to shut down.

启动浏览器访问http://localhost:5000可以看到输出了:

构建Docker镜像

首先看看例子目录下都有哪些文件:

$ tree
.
├── Dockerfile
├── Program.cs
├── README.md
├── Startup.cs
├── build.sh
├── docker-compose.yml
├── project.json
└── project.lock.json

0 directories, 8 files

Dockerfile用来生成Docker镜像,内容如下:

FROM microsoft/dotnet:latest
COPY bin/Debug/netcoreapp1.0/publish/ /root/
EXPOSE 5000/tcp
ENTRYPOINT dotnet /root/helloworld.dll

基础镜像为微软的官方镜像,另外bin/Debug/netcoreapp1.0/publish/dotnet publish命令生成。要生成Docker镜像需要执行如下命令:

dotnet publish
docker build -t dotnet-helloworld .

上传到阿里云容器Hub,记得先在其中的<name>替换成自己的名字。

docker tag dotnet-helloworld registry.aliyuncs.com/<name>/dotnet-helloworld
docker push registry.aliyuncs.com/<name>/dotnet-helloworld

本地Docker运行Web应用

本地运行Docker应用的命令如下:

$ docker run -it -p 5000:5000 dotnet-helloworld
Hosting environment: Production
Content root path: /root
Now listening on: http://*:5000
Application started. Press Ctrl+C to shut down.

如果你按照官方文档,会发现应用仅侦听localhost,造成浏览器访问不了。可以在代码中指定应用侦听所有地址。

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        //侦听所有地址
        .UseUrls("http://*:5000")
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

将应用部署到阿里云容器服务

还记得例子目录下有个docker-compose.yml文件吗?

dotnet-helloworld:
  image: 'registry.aliyuncs.com/<name>/dotnet-helloworld:latest'
  labels:
    aliyun.scale: '1'
    aliyun.routing.port_5000: http://helloworld
  restart: always

把上面内容中<name>替换为自己的名字,在集群里创建应用时,选择使用编排模版创建

在模版编辑器中粘贴docker-compose.yml文件内容,然后点击创建并部署

应用创建成功后进入服务页面,发现服务的访问端点已经自动生成了:

点击访问端点,启动浏览器可以看到ASP.NET的输出了:

小节

微软的开源和对非Windows的支持力度越来越大,在Docker上运行.NET应用使得原来的Windows开发者也可以享受容器技术带来的诸多好处。访问阿里云容器服务 开始你的Docker之旅吧。

时间: 2024-08-31 15:46:09

在阿里云上运行ASP.NET Docker应用的相关文章

关于在阿里云上运行的docker

问题描述 一些疑问,想发出来大家讨论下:在我的理解中如下:首先在阿里云平台(由不同的物理节点构成)-使用阿里云平台提供ESC(即租户现在使用的redhat或者其它实例)--在这个实例上再搭建docker(现在是这样子吗)?那么,是不是理解为,在物理机上的一个虚拟实例中搭建了docker?使用docker再创建了不同的container(redhat或其它来承载应用)?那么为何不是在物理机上直接docker,在docker中承载应用?即,模式一:物理机-实例-docker(container)模式

阿里云上从ASP.NET线程角度对“黑色30秒”问题的全新分析_实用技巧

在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. "黑色30秒"问题现象的主要特征是:排队的请求(Requests Queued)突增,到达HTTP.SYS的请求数(Arrival Rate)下降,QPS(Requests/Sec)下降,CPU消耗下降,Current Connections上升. 昨天晚上18:08左右发生了1次"黑色30秒",正好借此案例分析一下. 1.为什么Requests Qu

DockerCon 2016 深度解读:在阿里云上体验Docker 1.12内置的编排能力

昨天才从DockerCon大会归来,阿里云容器服务团队将为大家奉献一系列深入学习的文章来帮助大家了解Docker 1.12的最新动态. 第一部分:在阿里云上体验Docker 1.12内置的编排能力 (本文) 第二部分:在阿里云上体验Docker 1.12的路由能力和容器应用分发部署 在DockerCon第一天的Keynote里面,Docker CTO Solomon Hykes宣布Docker将提供内置的编排(Orchestration)能力,从而能使得Docker Engine原生支持集群管理

在阿里云上体验Docker 1.12的路由能力和容器应用分发部署

阿里云容器服务团队将为大家奉献一系列深入学习的文章来帮助大家了解Docker 1.12的最新动态. 第一部分:在阿里云上体验Docker 1.12内置的编排能力 第二部分:在阿里云上体验Docker 1.12的路由能力和容器应用分发部署 (本文) 简述 Docker 1.12除了提供内置的编排能力,也提供了服务路由支持 routing mesh,和新的多容器应用分发和部署机制. 这里我们先介绍两个概念 分布式应用打包 (Distributed Application Bundle,简称DAB):

阿里云上Docker企业版之旅

阿里云上Docker企业版之旅 6月9号,Docker中国网站正式发布.在Docker中国官方镜像加速上线的同时,Docker企业版也可以从阿里云的云市场在线购买和试用了. Docker企业版基于社区版增加了面向企业的管理和安全能力,Docker企业版在国内由阿里云和Docker联合提供技术支持,为企业客户提供稳定.安全.可以信赖的容器应用平台.本文将介绍如何在阿里云上试用原汁原味的Docker企业版. 购买Docker企业版试用授权 首先访问阿里云云市场中Docker 企业版售卖页: http

阿里云服务器-如何在linux服务器上运行asp网站

问题描述 如何在linux服务器上运行asp网站 请好心人告知怎么去配置环境,需要安装和修改什么. 我将整个网站放入根目录下并不能让网站正常工作 解决方案 理论上你可以用mono和apache运行asp,net程序,但是干嘛你不直接用windows虚拟机呢.因为你会遇到很多问题,比如你用了sql server,而linux只能用别的,你要修改代码. 不规范的代码,用了硬编码的目录分隔符,你又要修改.你调用了excel等activex,你又得修改.要用了exchage server,msmq等等,

远程调试阿里云上的NodeJS Docker应用

云端调试 代码部署到了云上以后,如果想进行远程调试就不想本地调试那么方便了.一旦出现问题,大家会通过读日志文件的方式猜测修改.阿里云容器服务提供了集中日志输出的能力,省却了开发人员自己登录到每台机器上去读日志的痛苦.如果代码在本地运行得很好,在云上却不对,通过日志方式能够发现大部分错误. 但是,但是,总有那么一些时候,读日志不能解决所有问题,开发人员还是需要登录到云上远程调试代码. 我们今天就进行一个这样的尝试,远程调试NodeJS代码.基本思路是通过支持远程调试的IDE连接到云端进行调试.ID

阿里云上搭建Docker Swarm模式集群最佳实践

Docker技术体系和生态在2016年得到飞速发展.成熟,在2016中国容器技术调研报告中也发现了国内绝大部分用户都在关注 Docker,80%的用户都会考虑使用容器技术.那如何能快速的在阿里云上搭建Docker集群呢?本文将讲解如何利用资源编排快速搭建Docker Swarm 模式集群,本例子中将安装Docker1.12,在Docker1.12中提供了Swarm模式,将一组Docker Engine构成一个集群统一管理.调度. 集群架构图如下: 如果已有VPC网络和NAT网关,可以跳过第一步,

在阿里云上进行Docker集群的自动弹性伸缩

简介 在刚刚结束的云栖大会上,阿里云容器服务演示了容器的自动弹性伸缩,能够从容应对互联网应用的峰值流量.关于阿里云上容器的自动弹性伸缩,可以参考文章在阿里云上进行Docker应用的自动弹性伸缩. 同时在流量变大的时候自动进行容器的弹性伸缩,要求容器集群有很好的容量规划,必须有多余的集群资源以支持弹性扩容.但问题是当流量变大,容器扩容导致集群资源不够的时候怎么办呢,是否需要手工进行容器集群的扩容?实际阿里云容器服务不仅支持容器级别的自动弹性伸缩,也支持集群节点级别的自动弹性伸缩.从而真正做到从容应