Quickstart: Compose and ASP.NET Core with SQL Server
预计阅读时间:6分钟
本快速入门指南演示了如何使用 Linux 上的 Docker 引擎和 Docker Compose 使用.NET Core SDK 映像和Linux 上的 SQL Server映像来设置和运行示例 ASP.NET Core 应用程序. 您只需要在您选择的平台上安装Docker Engine和Docker Compose :Linux、Mac 或 Windows.
对于此示例,我们使用microsoft/dotnet:2.1-sdk
Docker 映像创建一个示例 .NET Core Web 应用程序. 之后,我们创建一个Dockerfile
,配置这个应用程序以使用我们的 SQL Server 数据库,然后创建一个docker-compose.yml
来定义所有这些组件的行为.
注意:此示例是为 Linux 上的 Docker 引擎制作的. 对于 Windows 容器,请访问Docker Labs for Windows Containers .
-
为您的应用程序创建一个新目录.
这个目录是你的 docker-compose 项目的上下文. 对于Docker Desktop for Windows和Docker Desktop for Mac ,您需要为需要映射的卷设置文件共享.
-
在您的目录中,使用
dotnet:2.1-sdk
Docker 映像在/app
目录下的容器中生成示例 Web 应用程序,并在工作目录中的主机中生成示例 Web 应用程序:$ docker run -v ${PWD}:/app --workdir /app microsoft/dotnet:2.1-sdk dotnet new mvc --auth Individual
注意:如果在 Docker Desktop for Windows 中运行,请确保使用 Powershell 或指定应用目录的绝对路径.
-
在您的应用程序目录中创建一个
Dockerfile
并添加以下内容:# syntax=docker/dockerfile:1 FROM microsoft/dotnet:2.1-sdk COPY . /app WORKDIR /app RUN ["dotnet", "restore"] RUN ["dotnet", "build"] EXPOSE 80/tcp RUN chmod +x ./entrypoint.sh CMD /bin/bash ./entrypoint.sh
此文件定义如何构建 Web 应用程序映像. 它使用.NET Core SDK 映像,使用生成的代码映射卷,恢复依赖项,构建项目并公开端口 80.之后,它调用我们在下一步中创建的
entrypoint
脚本. -
Dockerfile
使用 webapp Docker 映像的入口点. 在名为entrypoint.sh
的文件中创建此脚本并粘贴以下内容.注意:确保使用 UNIX 行分隔符. 如果您使用基于 Windows 的分隔符(回车和换行),该脚本将不起作用.
#!/bin/bash set -e run_cmd="dotnet run --server.urls http://*:80" until dotnet ef database update; do >&2 echo "SQL Server is starting up" sleep 1 done >&2 echo "SQL Server is up - executing command" exec $run_cmd
此脚本在启动后恢复数据库,然后运行应用程序. 这允许 SQL Server 数据库映像启动一些时间.
-
创建一个
docker-compose.yml
文件. 在文件中写入以下内容,并确保替换下面db
下的SA_PASSWORD
环境变量中的密码. 此文件定义图像作为独立服务交互的方式.注意:SQL Server 容器需要安全密码才能启动:最少长度为 8 个字符,包括大写和小写字母、以 10 为基数的数字和/或非字母数字符号.
version: "3.9" services: web: build: . ports: - "8000:80" depends_on: - db db: image: "mcr.microsoft.com/mssql/server" environment: SA_PASSWORD: "Your_password123" ACCEPT_EULA: "Y"
该文件定义了
web
和db
微服务、它们的关系、它们使用的端口以及它们的特定环境变量.注意:如果您选择了错误的 Compose 文件版本,您可能会收到错误消息. 请务必选择与您的系统兼容的版本.
-
转到
Startup.cs
并找到名为ConfigureServices
的函数(提示:它应该在第 42 行下). 替换整个函数以使用以下代码(注意括号!).注意:确保将下面
connection
变量中的Password
字段更新为您在docker-compose.yml
文件中定义的密码字段.<...> public void ConfigureServices(IServiceCollection services) { // Database connection string. // Make sure to update the Password value below from "Your_password123" to your actual password. var connection = @"Server=db;Database=master;User=sa;Password=Your_password123;"; // This line uses 'UseSqlServer' in the 'options' parameter // with the connection string defined above. services.AddDbContext<ApplicationDbContext>( options => options.UseSqlServer(connection)); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddMvc(); // Add application services. services.AddTransient<IEmailSender, AuthMessageSender>(); services.AddTransient<ISmsSender, AuthMessageSender>(); } <...>
-
转到
app.csproj
. 你会看到这样的一行:<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.2" />
生成的项目默认使用 sqlite. 要使用 SQL Server,请将此行添加到
app.csproj
:<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.2" />
在撰写本文时,Sqlite 依赖项的版本为 1.1.2. 对 SQL Server 依赖项使用相同的版本.
-
准备好! 您现在可以运行
docker-compose build
命令.$ docker-compose build
-
确保为 Docker 引擎分配至少 2GB 的内存. 这是在Docker Desktop for Mac和Docker Desktop for Windows上的操作方法. 这是在 Linux 容器上运行 SQL Server 所必需的.
-
运行
docker-compose up
命令. 几秒钟后,您应该能够打开localhost:8000并看到 ASP.NET 核心示例网站. 应用程序默认监听 80 端口,但我们将其映射到docker-compose.yml
中的 8000 端口.$ docker-compose up
Go ahead and try out the website! This sample uses the SQL Server database image in the back-end for authentication.
准备好! 现在,您已经在 Docker Compose 中针对 SQL Server 运行了一个 ASP.NET Core 应用程序! 此示例使用了一些最流行的适用于 Linux 的 Microsoft 产品. 要了解有关 Windows 容器的更多信息,请查看Docker Labs for Windows Containers以试用 .NET Framework 和更多 SQL Server 教程.