.NET Core 在 Mac 上 — 构建一个带有 Web API、EF、PostgreSQL 的 ASP.NET Core 应用并在 Docker 上运行






4.88/5 (9投票s)
一个快速演示教程,介绍如何在 Mac 上设置 .NET Core,并创建一个简单的 ASP.NET Core 应用,该应用与 PostgreSQL 数据库通信,并在 Docker 上运行。
引言
与 Windows 应用开发不同,在 Mac 环境中构建应用有点不同,因为我们将处理新的命令、工具和文件结构。换句话说,我对 MAC 环境不太熟悉,这是一个真正的麻烦。本文旨在指导像我这样不熟悉 MAC OS X 并希望开始使用 .NET Core 的开发人员,或希望在 MAC 环境中尝试 .NET Core 的人。
虽然网络上有很多资源演示如何在 docker 中构建和运行 .NET Core 应用,但在 MAC 上进行操作的资源似乎有限。本文将引导您构建您的第一个 ASP.NET Core 应用,其中包含 Web API、EF、PostgreSQL,并在 Docker 上运行。
入门
在动手之前,让我们先安装构建和运行应用程序所需的工具。如果您已经安装了下面提到的先决条件,那么您可以跳过并继续。
必备组件
NET Core
.NET Core 为我们提供了 dotnet 命令行工具,无需任何 IDE 即可构建和运行 .NET Core 应用。在 MAC 上下载并按照 .NET Core 的安装步骤进行操作,请点击 此处。
Visual Studio Code
Visual Studio Code 是一款轻量级但功能强大的代码编辑器,可在 MAC、Linux 和 Windows 上运行。我们将使用 VSCode 编写 C# 代码和 HTML 标记。请点击 此处 下载并安装 Visual Studio Code。
NodeJS 和 NPM
我们将需要 NodeJS,因为我们将使用 Yeoman 来搭建 ASP.NET Core Web 应用模板,我们将使用 NPM 来安装包。安装 NodeJs 和 NPM,您可以在 此处 获取最新安装程序。
创建 .NET Core 应用程序
打开终端,让我们首先安装 Yeoman 和 Bower。运行以下命令
$ sudo npm install -g yo bower
完成之后,运行以下命令安装 ASP.NET Core 模板生成器
$ sudo npm install -g generator-aspnet
-g
标志全局安装生成器,这样它就可以从任何路径使用。
现在,我们准备好创建 ASP.NET Core 应用程序了。首先,我们需要为项目创建一个目录。为此,运行以下命令
$ mkdir src/dotnetcoreapp
$ cd src/dotnetcoreapp
上面的命令在我的用户帐户中创建了一个名为 `scr/dotnetcoreapp` 的文件夹。现在让我们运行 ASP.NET 生成器
$ yo aspnet
现在,您可能会被要求报告使用统计信息以改进工具,只需键入 Y/N 回答即可。在我的情况下,我选择了 Y(是)。之后,它应该会为您提供以下结果
生成器显示一个项目类型列表供我们选择。对于这个演示,我们将选择 **空 Web 应用程序** 项目模板。点击回车,然后输入项目名称。在这种情况下,我们将项目命名为 "dotnetcorehello"。点击回车,用默认文件生成项目,如下图所示
正如我们所看到的,生成器创建了一个 ASP.NET Core 项目。这个新创建的项目可以加载到 Visual Studio Code 中,或者使用命令行运行应用程序。
恢复、构建和运行应用程序
为了确保我们走在正确的轨道上,我们将通过运行项目来测试应用程序。现在将命令行的目录更改为指向我们新创建的项目。在这种情况下,执行
$ cd dotnetcorehello
然后运行以下命令
$ dotnet restore
最终的命令结果应该类似于这样
然后我们可以使用以下命令构建应用程序
$ dotnet build
然后使用以下命令运行它
$ dotnet run
现在打开您的浏览器,然后尝试浏览以下 URL:`https://:5000`。如果一切正常,那么您应该能够看到以下输出。
太棒了!我们刚刚在 MAC 上运行了第一个 .NET Core 应用程序。是时候进一步行动,创建一个简单的 Web API,公开一些方法并探索 Docker on MAC 了。
在 Docker 上安装并运行应用程序
请 点击此处 安装 Docker for MAC。
现在,让我们尝试在 docker 中运行我们的 .NET Core 应用程序。首先是打开 Visual Studio Code,然后安装 C# 扩展。
之后,打开我们之前创建的项目。您会注意到项目已经包含“Dockerfile”,如下图所示。
Dockerfile 包含构建 docker 镜像的指令。有关更多信息,请参阅:Dockerfile 参考
打开 startup.cs,并在 `Configure()` 方法中,将输出修改为如下所示
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello .NET Core from Docker!");
});
为了确保我们的更改能够反映出来,请再次运行以下命令进行构建:
$ dotnet build
现在我们来看看如何构建和运行 Docker 镜像。打开终端,确保目录指向 `project.json` 所在的根目录。设置好后,运行以下命令
$ docker build -t dockerdotnetcore .
如果构建成功,您应该会看到类似这样的内容
太好了,让我们通过运行以下命令来验证镜像是否已在我们的 Docker 机器中成功创建
$ docker images
正如您所看到的,我们新创建的名为“dockerdotnetcore”的镜像已列出。太棒了,现在我们准备运行应用程序。输入以下命令。
$ docker run -d -p 5000:5000 dockerdotnetcore
运行上述命令将得到类似以下结果。
要查看所有正在运行的镜像,请运行以下命令。
$ docker ps
我们去浏览器并向本地 IP 添加端口 `5000`。输出应该类似这样。
太棒了!我们现在在 Docker 上运行着 .NET Core。下一步是集成 EF Core、PostgreSQL,并创建一些提供数据的基本 Web API 方法。
集成 EF Core 和 PostgreSQL
Entity Framework Core 现在支持多种 数据库提供程序。在这个特定的演示中,我们将探讨如何在 .NET Core 应用程序中集成 PostgreSQL。安装 Postgres 最简单的方法是使用 Homebrew,它应该在安装 .NET Core SDK 时包含。现在运行以下命令下载并安装 PostgreSQL
$ brew install postgresql
如果安装顺利,数据库管理器应该已经安装。现在,让我们通过运行以下命令启动 PostgreSQL 服务容器
$ docker run -d --name pg-db -e POSTGRES_PASSWORD=supersecret postgres
`-d` 选项在后台运行容器并打印容器 ID。`--name` 为容器分配一个名称,在这里我们将容器命名为 "pg-db"。`-e` 允许我们设置环境变量,在这种情况下,我们使用 `POSTGRES_PASSWORD` 变量为我们的 Postgres 镜像设置了一个密码 "supersecret"。
运行上述命令将暴露 postgres 端口 `5432`,这允许标准容器可供链接容器使用。`initdb` 也将生成默认用户和数据库。
再次,为了验证我们的 PostgresSQL Docker 容器是否已启动并运行,请执行
$ docker ps
要测试连接,您可以这样做
$ docker run -it --rm --link pg-db:postgres postgres psql -h postgres -U postgres
集成 Entity Framework Core 和 MVC
是时候集成 EF 及其依赖项了,这样我们就可以对数据库运行迁移。迁移使我们能够在代码中创建模型(Code-First 方法),并根据模型创建数据库。打开 `project.json`,然后在 `dependencies` 节点中添加以下引用
"Npgsql.EntityFrameworkCore.PostgreSQL": "1.0.0",
"Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final",
"Microsoft.AspNetCore.Mvc": "1.0.1",
"Microsoft.AspNetCore.Routing": "1.0.1"
然后在 tools 节点下添加以下引用
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
确保保存文件,或者简单地从终端输入命令 `dotnet restore` 以恢复我们添加的包和工具。
创建实体模型
在您的应用程序中创建以下类
namespace dotnetcorehello
{
public class Band{
public int Id { get; set; }
public string Name { get; set; }
public string Genre { get; set; }
}
}
然后为我们的 DbContext 创建另一个类
using Microsoft.EntityFrameworkCore;
namespace dotnetcorehello
{
public class BandDbContext : DbContext
{
public BandDbContext(DbContextOptions<BandDbContext> options)
: base(options)
{ }
public DbSet<Band> Bands { get; set; }
}
}
`Band` 类作为我们的模型,其中包含一些属性。这个模型只是一个简单的 POCO 对象。`BandDbContext` 通常用于自定义模型并公开 `DbSet
配置连接字符串
现在我们已经准备好模型和 DB 上下文,下一步是设置连接字符串,以便我们能够对数据库运行迁移。在 `appsettings.json` 文件中添加以下配置
"DbContextSettings" :{
"ConnectionString": "User ID=postgres;Password=supersecret;Server=postgres;Port=5432;Database=POSTGRES_USER;Integrated Security=true;Pooling=true;"
}
配置服务
我们需要注入 `BandDbContext` 并启用 MVC 服务。打开 `Startup.cs` 文件,并在 `ConfigureServices()` 方法中追加以下代码
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc():
var connectionString = Configuration["DbContextSettings:ConnectionString"];
services.AddDbContext<BandDbContext>(opts => opts.UseNpgsql(connectionString));
}
最后,我们需要更新 `Configure()` 方法,使其看起来像这样
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseMvc();
// Create database on startup
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<ArticleDbContext>().Database.Migrate();
}
}
EF Core 不会自动执行迁移,这就是为什么我们需要上述配置才能使用 Code-First 迁移。`Database.Migrate()` 方法负责两件事:(1) 如果 PostgreSQL 数据库尚不存在,则在其中创建数据库。(2) 将数据库模式迁移到最新版本。
生成迁移
您可能已经猜到,我们将使用 EF Core 工具来搭建迁移,当然还有更新数据库。我们将使用命令行(dotnet CLI)来运行迁移。
尽管迁移过程会首先构建您的应用程序,但我们也可以提前构建应用程序,以确保我们的应用程序没有错误,通过运行以下命令
$ dotnet build
如果成功,运行以下命令生成迁移
$ dotnet ef migrations add InitialMigration
`ef migration add` 是添加迁移的命令。如果迁移成功,您应该会看到一个名为“Migrations”的新文件夹,其中包含迁移文件。
上面生成的文件将用于在初始运行时创建数据库。
创建 Web API
好的,是时候创建一些简单的 Web API 方法来处理简单的 `GET` 和 `POST` 请求了。添加一个新类并复制以下代码
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace dotnetcorehello.Controllers
{
[Route("api/[controller]")]
public class BandController : Controller
{
private readonly BandDbContext _context;
public BandController(BandDbContext context)
{
_context = context;
}
// GET: api/band
public IEnumerable<Band> Get()
{
return _context.Bands.ToList();
}
// GET api/band/5
[HttpGet("{id}")]
public Band Get(int id)
{
return _context.Bands.FirstOrDefault(x => x.Id == id);
}
// POST api/band
[HttpPost]
public IActionResult Post([FromBody]Band value)
{
_context.Bands.Add(value);
_context.SaveChanges();
return StatusCode(201, value);
}
}
}
没有什么特别花哨的,上面的代码只包含一些与我们的 PostgreSQL 数据库通信的基本方法。请注意,我们在控制器的构造函数中注入了 `BandDbContext` 的实例,这样我们就可以与数据库交互,并使用它来查询数据库。
在 Docker 上运行应用程序
此时,我们已准备好将应用程序部署到 Docker。首先,让我们运行以下命令构建应用程序
$ docker build -t dockerdotnetcore .
上述命令将在我们的 docker 机器中生成一个新的镜像实例。您可以通过在命令行中运行 `docker images` 来查看镜像列表。
现在,运行以下命令以确保我们的 PostgreSQL 数据库镜像已启动并运行
$ docker ps
现在,让我们运行我们的 .NET Core 应用程序,并使用以下命令链接我们创建的数据库
$ docker run -d -p 5000:5000 --link pg-db:postgres dockerdotnetcore
测试应用程序
以下是我使用 Postman 进行测试的一些截图。
POST: http:<你的 IP>:5000/api/band
GET: http:<你的 IP>:5000/api/band
GET: http:<你的 IP>:5000/api/band/<id>
就是这样!希望您觉得这篇文章有用。
摘要
在本文中,我们学习了在 MAC 环境中设置 .NET Core 的基础知识,并学习了如何创建一个简单的 ASP.NET Core 应用程序,其中包含 Web API、EF、PostgreSQL,并在 Docker 上运行。
参考文献
- https://docs.dockerd.com.cn/docker-for-mac/
- https://docs.dockerd.com.cn/docker-for-mac/docker-toolbox/
- https://getcarina.com/docs/tutorials/run-docker-image/
- https://hub.docker.com/r/proudmonkey30/netcoredemo/
- https://medium.com/trafi-tech-beat/running-net-core-on-docker-c438889eb5a#.8a9aini0b
- https://hahoangv.wordpress.com/2016/08/05/docker-for-net-developers-net-core-ef-core-and-postresql-in-docker/
- http://blog.thoward37.me/articles/where-are-docker-images-stored/
- https://docs.dockerd.com.cn/engine/examples/postgresql_service/
- http://andrewlock.net/adding-ef-core-to-a-project-on-os-x/
- Docker 命令:https://docs.dockerd.com.cn/engine/reference/commandline/run/