在Docker中运行SQLServer ASP.NET应用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文介绍了如何在Docker中运行.NET程序并访问SQL Server云数据库。

logos

云栖社区的文章在阿里云上运行ASP.NET Docker应用一文和大家探讨了如何在Docker中运行ASP.NET应用。本文是上一篇文章的续篇,讨论如何让应用访问SQLServer数据库。

创建SQLServer数据库

我们首先在阿里云上开通一个SQLServer服务器实例,创建用户user1

user

创建一个名为Blog的数据库,并授权user1能够访问数据库。为数据库开通外网访问,获得数据库外网访问地址。

database

所有这些操作都能够在控制台完成,如果你想进入SQLServer的控制台,可以点击上图的登录数据库进入数据库的访问界面:

dbmgmt

上图显示的内容示例程序运行完成后的结果,现在不用手工创建数据库表,我们会利用Entity Framework的数据库Migration功能初始化数据库。

至此你应当有如下数据库访问信息,记录下这些信息以备下文的程序使用。

  • 数据库地址
  • 端口号
  • 用户名
  • 密码

引入ORM框架Entity Framework

Entity Framework是.NET上的ORM框架,支持多种常见数据库,包括MS SQL Server、SQLite、Postgres等。详细信息请访问官方博客:Announcing Entity Framework Core 1.0

我们在project.json中引入Entity Framework和SQLServer。

"dependencies": {
"Microsoft.EntityFrameworkCore.Sqlite": "1.0.0",
"Microsoft.EntityFrameworkCore.Design": {
  "version": "1.0.0-preview2-final",
  "type": "build" 
},
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0"
},

还有这一段:

"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" 
} 

执行restore命令加载所有依赖包和工具。

dotnet restore

命令完成后创建project.lock.json文件,不要手工更改这个文件,每次引入新的依赖后请再次执行Restore命令。

数据模型和数据库连接

Entity Framework通过DbContext定义对数据库的访问以及对象和数据库的关系映射。我们首先创建一个新C#文件,命名为Model.cs。

在Model.cs中创建一个类BloggingContext继承自DbContext。

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var serverAddress = Environment.GetEnvironmentVariable("SQLSERVER_ADDRESS");
        var serverPort = Environment.GetEnvironmentVariable("SQLSERVER_PORT");
        var userName = Environment.GetEnvironmentVariable("SQLSERVER_USERNAME");
        var password = Environment.GetEnvironmentVariable("SQLSERVER_PASSWORD");

        var connection = string.Format("Server={0},{1};Database=blog;User Id={2};Password={3};",
        serverAddress,serverPort,userName,password);
        optionsBuilder.UseSqlServer(connection);
    }
}

OnConfiguring方法里定义如何访问数据库。从环境变量中读取值构建connection字符串,然后调用optionsBuilder的UseSqlServer方法建立和数据库的连接。如何想要访问其他类型的数据库,例如sqlite,调用optionsBuilder的相应方法即可。

var connection = string.Format("Server={0},{1};Database=blog;User Id={2};Password={3};",
    serverAddress,serverPort,userName,password);
optionsBuilder.UseSqlServer(connection);

我们的示例中定义两个类,分别是博客Blog和帖子Post,在数据库中是两个不同的数据库表。每个类都只定义了属性和get/set方法。随后我们会利用Entity Framework初始化数据库。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public string Name { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

访问数据库的代码

更改Startup.cs,加入对数据库的访问。把Startup.cs中的这一段替换:

return context.Response.WriteAsync("Hello from ASP.NET Core!");

替换的内容为:

using (var db = new BloggingContext())
{
    var result = "";
    db.Blogs.Add(new Blog { Url = "https://yq.aliyun.com/teams/11" });
    var count = db.SaveChanges();
    result += string.Format("{0} records saved to database\n", count);

    result += string.Format("All blogs in database:\n");
    foreach (var blog in db.Blogs)
    {
        result += string.Format(" - {0}\n", blog.Url);
    }                
    return context.Response.WriteAsync(result);
}

这段代码的作用是在通过创建一个Blog对象在数据库中插入一行,然后从数据库中读取并显示。

利用Entity Framework初始化数据库

运行Entity Framework工具创建一个数据库迁移脚本,并初始化数据库。

dotnet ef migrations add MyFirstMigration
dotnet ef database update

登陆到数据库中可以看到新创建的两个表BlogPost

运行

所有代码就绪后即可运行应用观察效果:

$ dotnet run
$ curl http://localhost:5000/
1 records saved to database
All blogs in database:
 - https://yq.aliyun.com/teams/11

从输出可以看到,我们的程序成功地写入数据库一条数据,然后读取数据库中的所有内容。

容器化

Dockerfile内容和helloword的Dockerfile内容一样,抄录在此。

FROM microsoft/dotnet:latest
COPY bin/release/netcoreapp1.0/publish/ /app/
EXPOSE 5000/tcp
ENTRYPOINT dotnet /app/aspnet-sqlserver.dll

创建docker-compose.yml,用于在本地Docker环境中运行:

version: "2"
services:
  aspnet-helloworld:
    image: registry.cn-hangzhou.aliyuncs.com/jingshanlb/aspnet-sqlserver
    environment:
      - SQLSERVER_ADDRESS=
      - SQLSERVER_PORT=
      - SQLSERVER_USERNAME=
      - SQLSERVER_PASSWORD=
    ports:
      - 5000:5000

填入相应的环境变量值,分别是数据库地址、端口号、用户名和密码,运行docker compose命令启动容器。

$ docker-compose up -d

用同样的方式curl访问本机5000端口,可以看到在容器中也运行正常。

部署到阿里云容器服务上

部署到阿里云上的模版内容和在本机的文件基本一致,但是有几个小的变化:

  • 利用变量名输入数据库的地址、端口、用户和密码
  • 不用将容器映射到主机500端口,利用容器服务的路由服务能力
  • 指定该服务启动两个容器

这是docker-compose-acs.yml内容:

version: "2"
services:
  aspnet-helloworld:
    image: registry.cn-hangzhou.aliyuncs.com/jingshanlb/aspnet-sqlserver
    environment:
      - SQLSERVER_ADDRESS=${SQLSERVER_ADDRESS}
      - SQLSERVER_PORT=${SQLSERVER_PORT}
      - SQLSERVER_USERNAME=${SQLSERVER_USERNAME}
      - SQLSERVER_PASSWORD=${SQLSERVER_PASSWORD}
    labels:
      aliyun.scale: '2'
      aliyun.routing.port_5000: http://aspnet-sqlserver

利用模版部署后,访问服务端点URL,可以看到如下输出:

access

讨论和总结

本文介绍了如何在Docker中运行.NET程序并访问SQL Server云数据库,利用ORM框架Entity Framework Core,我们可以很容易地对数据库进行初始化和Migration。

.NET Core应用容器化上云后可以利用阿里云容器服务的丰富功能。容器服务不但支持docker-compose模板提供的容器功能,使得本地开发的Docker镜像和编排模板可以轻松上云;更提供了灵活的部署约束描述,使得对分布式应用的部署和控制变得非常方便。

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
3天前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
18 1
|
5天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
5天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
5天前
|
关系型数据库 MySQL Shell
4.Docker 应用部署
4.Docker 应用部署
|
5天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
5天前
|
机器学习/深度学习 人工智能 异构计算
【Docker 专栏】Docker 与 GPU 加速应用的结合
【5月更文挑战第9天】GPU加速技术在处理大规模数据和复杂计算时展现强大性能,尤其在AI和深度学习领域。Docker作为轻量级容器化工具,提供隔离、可移植和高效的环境。结合GPU加速,关键在于容器访问GPU设备和安装相应驱动。NVIDIA提供了支持工具,允许Docker利用GPU。应用场景包括人工智能、科学计算和视频处理。优势包括资源利用率提升和部署灵活性,但面临驱动兼容性、资源管理和监控调试的挑战。未来,随着技术发展,Docker与GPU加速在边缘计算中的应用将有广阔前景。
【Docker 专栏】Docker 与 GPU 加速应用的结合
|
5天前
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
【Docker 专栏】Docker 容器内应用的调试与故障排除
|
5天前
|
开发框架 安全 网络安全
【Docker 专栏】Docker 多平台应用构建与部署
【5月更文挑战第8天】Docker作为一种关键的容器化技术,简化了多平台应用的构建与部署。它提供一致的运行环境,确保应用在不同平台无缝运行;通过分层构建机制加速镜像创建,提升开发效率。Docker的可移植性、高效部署及资源利用率是其主要优势。流程包括开发环境准备、构建镜像、测试验证及部署。然而,面临操作系统差异、网络安全和资源限制等挑战,需注意安全、版本管理和性能优化。Docker在多平台场景的应用将持续发挥价值。
【Docker 专栏】Docker 多平台应用构建与部署
|
5天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
|
5天前
|
前端开发 API 数据库
【Docker专栏】Docker Compose实战:编排多容器应用
【5月更文挑战第7天】Docker Compose是Docker的多容器管理工具,通过YAML文件简化多容器应用部署。它能一键启动、停止服务,保证开发、测试和生产环境的一致性。安装后,创建`docker-compose.yml`文件定义服务,如示例中的web和db服务。使用`docker-compose up -d`启动服务,通过`docker-compose ps`、`stop`、`down`和`logs`命令管理服务。
【Docker专栏】Docker Compose实战:编排多容器应用