微软的.NET开源后可以运行在Mac和Linux平台,也支持运行在Docker容器里。我们今天要尝试的是在Mac上开发一个.NET应用,并且把它用Docker跑起来,然后部署到阿里云容器服务上。
本文的后续文章介绍了如何访问SQLServer数据库,点击[在Docker中运行SQLServer ASP.NET应用]。(https://yq.aliyun.com/articles/60857)
在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之旅吧。