65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (9投票s)

2016年11月14日

CPOL

9分钟阅读

viewsIcon

27331

downloadIcon

170

一个快速演示教程,介绍如何在 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 应用程序

打开终端,让我们首先安装 YeomanBower。运行以下命令

$ 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/
© . All rights reserved.