文章目录
一、本机环境
- 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
赞赏
如果您觉得文章还不错,那就请作者喝杯咖啡吧!