ASP.NETCore WebApp + EFCore +Docker +MSSQL(Docker for Window)

12 篇文章 0 订阅
10 篇文章 0 订阅

一、本机环境

  • Window 10
  • Docker for window
  • NETCore 5.0
  • Vistual Studio 2019

二、创建ASP.NET Core WebApp

创建项目

1、创建一个名为“WebAppEFCore”的ASP.NET Razor项目。
在这里插入图片描述
2、目标框架选择“.NET 5.0”,选择“启动Docker”,Docker OS选择“Linux”。
在这里插入图片描述
3、目录解析

1、Pages 文件夹
	(1)包含 Razor 页面和支持文件。 每个 Razor 页面都是一对文件:
	(2)一个 .cshtml 文件,其中包含使用 Razor 语法的 C# 代码的 HTML 标记。
	(3)一个 .cshtml.cs 文件,其中包含处理页面事件的 C# 代码。
支持文件的名称以下划线开头。 例如,_Layout.cshtml 文件可配置所有页面通用的 UI 元素。 此文件设置页面顶部的导航菜单和页面底部的版权声明。 
2、wwwroot 文件夹
	包含静态资产,如 HTML 文件、JavaScript 文件和 CSS 文件。 
3、appsettings.json
	包含配置数据,如连接字符串。 有关详细信息,
4、Program.cs
	包含应用的入口点。 
5、Startup.cs
	包含配置应用行为的代码。 

添加模型

1、在“解决方案资源管理器”中,右键单击“WebAppEFCore”项目 >“添加” > “新建文件夹”。 将文件夹命名为“Models”。
2、右键单击“Models”文件夹。 选择“添加” > “类” 。 将类命名“Movie”。
3、向 Movie 类添加如下代码:

using System;
using System.ComponentModel.DataAnnotations;
namespace WebAppEFCore.Models
{
    public class Movie
    {
        /// <summary>
        /// 数据库需要 ID 字段以获取主键
        /// </summary>
        //[Key] //加这个表示当前字段为主键,EF默认字段为id的是主键
        public int ID { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 日期
        /// </summary>

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }
        /// <summary>
        /// 电影类型
        /// </summary>
        public string Genre { get; set; }
        /// <summary>
        /// 价格
        /// </summary>
        public decimal Price { get; set; }
    }
}

搭建基架

1、右键单击“Pages”文件夹 >“添加”>“新建文件夹”,将文件夹命名为“Movies”,创建“Pages/Movies”文件夹。
2、右键单击“Pages/Movies”文件夹 >“添加”>“新搭建基架的项目”。
在这里插入图片描述
3、在“新搭建基架的项目”对话框中,依次选择“使用实体框架的 Razor 页面 (CRUD)”>“添加”。
在这里插入图片描述
4、在“添加使用实体框架的 Razor 页面 (CRUD)”对话框中做如下操作:
(1)在“模型类”下拉列表中,选择“Movie (WebAppEFCore.Models)” 。
(2)在“数据上下文类”行中,选择 +(加号) ,在“添加数据上下文”对话框中,生成类名 WebAppEFCore.Data.WebAppEFCoreContext。
(3)选择“添加”,等待代码自动创建成功即可(注:如果出现“运行所选代码生成器时出错”的错误提示框,先重新生成解决方案或重启VS后再次执行上面步骤试试,如果还是报这个错误,则更新VS2019即可)。
在这里插入图片描述
5、通过骨架生成的Razor代码如下所示:
在这里插入图片描述
6、此时可看到appsetting.json中出现了“ConnectionStrings”数据库连接字符串,通过骨架配合EF创建CRUD时,默认连接的是VS自带的数据库。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "WebAppEFCoreContext": "Server=(localdb)\\mssqllocaldb;Database=WebAppEFCoreContext-5ead5ad5-34e5-46cf-b12c-6cfef7fc5365;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

7、startup.cs中的“ConfigureServices”中自动配置了DBContext,如果没有使用骨架创建的话,不论是EFCore的nuget引入还是appsetting.json和startup.cs中的配置都需要程序员手动添加。

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();

            services.AddDbContext<WebAppEFCoreContext>(options =>
                    options.UseSqlServer(Configuration.GetConnectionString("WebAppEFCoreContext")));
        }

8、WebAppEFCoreContext的配置如下:
在这里插入图片描述

使用CoreFirst方式初始数据库架构

1、从“工具”菜单中,选择“NuGet 包管理器”>“包管理器控制台” ,执行如下操作:
(1)添加初始迁移。
(2)使用初始迁移来更新数据库。
2、在 PMC 中,输入以下命令:

PM> Add-Migration InitialCreate
PM> Update-Database

在这里插入图片描述
3、Add-Migration命令生成用于创建初始数据库架构的代码。 该架构基于在 DbContext 中指定的模型。 InitialCreate 参数为迁移命名,该名称可自定义。
4、Update-Database命令会调用Add-Migration命令生成的Up 方法。
5、目录中的Migrations文件夹记录着当前迁移记录。
6、点击“视图”->“SQL Server对象资源管理器(S)”,可看到右侧的数据库中出现了“Movie”数据库表。
在这里插入图片描述
在这里插入图片描述
7、点击“IIS Express”,运行项目,输入IP:Port/Movies/Index,进行CRUD的测试,如下可成功进行CRUD操作(这个就不演示了)
在这里插入图片描述

三、MSSQL+Docker

拉取MSSQL Docker镜像

1、Docker Hub中MSSQL网址为:https://hub.docker.com/_/microsoft-mssql-server。
2、使用Win+R快捷键调出如下窗口,并输入powershell,打开powershell工具。
在这里插入图片描述
在这里插入图片描述
2、在powershell中输入docker pull mcr.microsoft.com/mssql/server:2017-latest命令,拉取mssql2017镜像。
3、使用docker images命令查看当前拉取的镜像

PS D:\Project\StudyProject\NETCoreCode\202104\WebAppEFCore> docker images
REPOSITORY                             TAG               IMAGE ID       CREATED         SIZE
mcr.microsoft.com/mssql/server         2017-latest       861938177a03   7 weeks ago     1.3GB

启动容器

1、使用docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=你的8位密码(含大小写字母和数字)' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest命令基于MSSQL2017镜像生成docker容器(注:可以使用–name参数自定义容器名)。
2、使用docker ps命令查看当前正在运行的容器。

CONTAINER ID   IMAGE                                        COMMAND                  CREATED        STATUS        PORTS                    NAMES
2d5215ee91bd   mcr.microsoft.com/mssql/server:2017-latest   "/opt/mssql/bin/nonr…"   22 hours ago   Up 21 hours   0.0.0.0:1433->1433/tcp   recursing_dubinsky
环境要求

(1)该镜像只能运行在Docker(引擎)1.8+支持的任一平台。

(2)至少 2GB 的 RAM(2017-CU2 之前为 3.25 GB)。如果您在 Docker 上运行 Mac或Windows,请确保为 Docker VM 分配足够的内存。

参数解析

(1)ACCEPT_EULA=Y,确认您接受最终用户许可协议

(2)SA_PASSWORD=<your_strong_password>,系统管理员 (SA) 密码:至少 8 个字符,包括大写字母、小写字母、基本 10 位数字和/或非字母数字符号。
(3)注:密码少于8位生成的容器运行几秒后就会停止,故请设置大小写字母和数字混合的8位密码。

连接MSSQL容器

1、使用ipconfig命令查看当前电脑的IP地址。
2、打开navicat,“主机名或IP地址”填写ipconfig查询出来的IP,验证选择“SQL Server验证”,用户名填写“sa”,密码填写的是docker run时设置的密码。
在这里插入图片描述

四、WebApp连接MSSQL

1、appsetting.json中的内容更改如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "WebAppEFCoreContext": "Server=ipconfig查询的ip,1433;Database=WebAppMovieDB;uid=sa;pwd=Xgy.123456;Packet Size=512;"
  }
}

2、在“包管理器控制台”中执行数据库迁移操作

PM> Add-Migration InitialDockerCreate
PM> Update-Database

3、此时打开navicat,可看到数据库中出现Movie表。
在这里插入图片描述
4、使用IISExpress的方式运行NETCore项目,创建如下图所示的两条数据,在数据库中可看到对应的数据,说明WebApp项目可连接到MSSQL镜像创建的容器。
在这里插入图片描述

五、将WebApp打包为Docker镜像

构建Dockerfile

1、如果创建项目时未勾选“启用Docker”,则右击“WebAppEFCore项目”->“添加”->“Docker支持”->目标OS选择“Linux”,让VS2019帮助我们创建一个Dokcerfile文件。
在这里插入图片描述
在这里插入图片描述
2、Dockerfile的内容如下,

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

#使用最小可执行的aspnet5.0镜像作为基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
#设置工作目录为app
WORKDIR /app	
#容器向外暴露的端口为80
EXPOSE 80
#使用最小可执行的sdkt5.0镜像作为构建项目的基础镜像(安装VS2019时会自动装想应的sdk镜像,这也是为什么可以构建打包的原因)
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["WebAppEFCore.csproj", ""]
#还原项目
RUN dotnet restore "./WebAppEFCore.csproj"
#拷贝当前目录的文件到容器的工作目录(构建)
COPY . .
#设置容器的工作目录(构建)
WORKDIR "/src/."
#这个命令相当于VS中的“生成”项目
RUN dotnet build "WebAppEFCore.csproj" -c Release -o /app/build
#将build目录中的项目打包到publish目录中
FROM build AS publish
RUN dotnet publish "WebAppEFCore.csproj" -c Release -o /app/publish

#将publish中的内容复制到容器的app目录中
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

#使用dotnet WebAppEFCore.dll运行项目
ENTRYPOINT ["dotnet", "WebAppEFCore.dll"]

打包webapp镜像

1、打开powershell,使用cd 你的项目存放Dockerfile的目录进入webapp的根目录。
2、执行docker build -t webapp-efcore .命令构建一个名为“webapp-efcore”的webapp镜像,注意,后面还有一个“.”,表示找到当前目录的dockerfile文件进行构建镜像的操作。
3、执行docker images命令可看到当前有两个镜像,一个是asp.net5.0镜像(构建webapp的基础镜像),一个是webapp-efcore镜像。

PS D:\Project\StudyProject\NETCoreCode\202104\WebAppEFCore> docker build -t webapp-efcore .
[+] Building 12.0s (18/18) FINISHED
PS D:\Project\StudyProject\NETCoreCode\202104\WebAppEFCore> docker images
REPOSITORY                             TAG               IMAGE ID       CREATED         SIZE
mcr.microsoft.com/dotnet/aspnet        5.0-buster-slim   5b6745109cae   5 days ago      205MB
webapp-efcore                          latest            47d712f812a1   19 hours ago    261MB

4、执行docker run --name webapp-efcore-container -d -p 3001:80 webapp-efcore运行一个名为“webapp-efcore-container ”的容器,“-d”表示挂载在后台运行,“-p 3001:80”表示将容器的80端口映射到主机的3001端口上。

PS D:\Project\StudyProject\NETCoreCode\202104\WebAppEFCore> docker run --name webapp-efcore-container -d -p 3001:80 webapp-efcore

5、执行docker ps命令查看当前正在运行的容器,可看到上面创建的“webapp-efcore”。

PS D:\Project\StudyProject\NETCoreCode\202104\WebAppEFCore> docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED        STATUS        PORTS                    NAMES
d8354234d7bb   webapp-efcore                                "dotnet WebAppEFCore…"   20 hours ago   Up 20 hours   0.0.0.0:3001->80/tcp     webapp-efcore-container
2d5215ee91bd   mcr.microsoft.com/mssql/server:2017-latest   "/opt/mssql/bin/nonr…"   22 hours ago   Up 21 hours   0.0.0.0:1433->1433/tcp   recursing_dubinsky

测试

1、访问“localhost:3001/Movie/Index”,进行CRUD操作。
2、打开mssql容器对应的数据库,查看数据库的数据是否与界面的数据同步。
在这里插入图片描述

参考

使用 Docker 运行 SQL Server 容器映像
编写Dockerfile
使用 ASP.NET Core 创建 Razor Pages Web 应用
DockerHub microsoft-mssql-server

赞赏

如果您觉得文章还不错,那就请作者喝杯咖啡吧!
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值