前言

小白直接上手 docker  构建我们的第一个项目,简单粗暴,后续各种概念边写边了解,各种概念性的内容就不展开,没了解过的点击 Docker 教程 进行初步了解。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。


1、安装docker

由于我们是windows环境,所以安装的是 Docker Desktop for Windows

系统要求:

  • Windows 10 64位:专业版,企业版或教育版(Build 15063或更高版本)。
  • 在BIOS中启用虚拟化(各个主板的BIOS的操作面板不同,可咨询主板商)。通常,默认情况下启用虚拟化。
  • 具有CPU SLAT功能。
  • 至少4GB的运行内存。
  • 启用Hyper-V

这里需要重点注意,Windows 10 64位、在BIOS中启用虚拟化、启用Hyper-V这三个条件比较重要。

可以点击下面的连接进行详细安装指导

详细安装步骤:Docker Desktop for Windows 安装要求已经安装步骤:https://www.jc2182.com/docker/docker-windows-install.html

PS:不同的主板可以百度查询一下如:HP工作站如何在BIOS下开启关闭虚拟化技术:https://jingyan.baidu.com/article/ce436649184b393773afd309.html


2、创建docker项目

1.创建项目

安装完docker后,我们创建第一个docker项目。

新建一个ASP.NET Core Web(模型-视图-控制器)项目,命名为 AspNetCoreWeb (你也可以自己取一个名称),

选择 .NET Core 3.1(长期支持)  ,勾选 启用Docker  ,Docker OS 下拉选择 Linux ,如下展示:

到这里默认代码就创建完成了,不需要的可以跳过,需要查看数据库交互的可以继续往下看。

我们之前介绍过:10分钟系列:NetCore3.1+EFCore三步快速完成数据库交互。现在就基于这个进行数据库交互,下面介绍的就是这里面的做法。

2.引入NuGet包并创建上下文对象

这里只需要两个包,一个是EFCore的引用包,一个是数据库连接的引用包。

在NuGet分别引入下面两个包,

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.SqlServer

在项目里面创建一个 EntityDbContext 文件夹,然后在文件夹里面创建一个 DbContext_first 类,并继承 EFCore框架中的 DbContext,

在  EntityDbContext 文件夹下创建 Entity 文件夹,创建 StudentTable 实体映射。如下展示

PS:(注意,这里默认是数据库存在StudentTable表的,如果没有请先创建,EFCore支持实体映射表到数据库的,这里就不体现了,有需要了解的自行百度或私信小编)

上下文里面的内容如下(注意:在Docker里面连接的数据库需要是外网可以访问的):

using AspNetCoreWeb.EntityDbContext.Entity;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace AspNetCoreWeb.EntityDbContext
{
public class DbContext_first:DbContext
{
/// <summary>
/// 在这里重写OnConfiguring的方法来配置数据库的连接字符串
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//SQL Server/Azure SQL 数据库、SQLite、Azure Cosmos DB、MySQL、PostgreSQL数据库连接
//注意,这个链接是外网可以访问的,本地链接不可以,Docker里面读取不到
optionsBuilder.UseSqlServer("Data Source=47.101.72.203; Initial Catalog=Demo;User Id=sa;Password=Ai562723XueEr@");
} public DbSet<StudentTable> StudentTable { get; set; } //需要操作的数据库对应的表
}
}

3.编写一个查询语句并返回数据

在自动生成的Home控制器里面添加如下查询代码

       //查询
public JsonResult GetStudentList()
{
List<StudentTable> studeltList = new List<StudentTable>();
ResultInfo result = new ResultInfo();
try
{
using (var ctx = new DbContext_first())
{
try
{
studeltList = ctx.StudentTable.ToList();
}
catch (Exception ex)
{
result.code = -1;
result.message = "数据库查询失败:"+ex.Message;
return Json(result);
}
result.code = 0;
result.message = "成功";
result.info = studeltList;
}
}
catch (Exception ex)
{
result.code = -2;
result.message = "数据库连接失败:" + ex.Message;
}
return Json(result);
} public class ResultInfo
{
public int code { get; set; }
public string message { get; set; }
public object info { get; set; }
}

4.配置相关数据

配置1:避免中文变成Unicode

Startup.cs 类的 ConfigureServices 方法添加返回的格式定义为JSON,否则默认返回的是被编译的Unicode,不是中文。

由于一些 JS 组件要求 JSON 格式是 PascalCase ,新版本 ASP.NET Core 3.0 中默认移除了 Newtonsoft.Json ,使用了微软自己实现的 System.Text.Json 来代替,可以修改继续使用 Newtonsoft.Json 来设置 PascalCase 格式属性名。

 // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddControllersWithViews().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
}

配置2:避免数据库版本过低和Docker版本不一致

在Dockerfile的最后添加一行代码,添加内容如下:

RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf

下面是详细解释,可以不看。

我是用SqlServer2012进行操作,发现返回下面下面的35错误:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 35 - An internal exception was caught

出现问题的 asp.net core 程序是跑在容器中的,容器镜像用的是 mcr.microsoft.com/dotnet/core/aspnet:3.0

运行容器内的 openssl 命令发现 openssl 的版本比较高

1.进入容器

docker exec -it [容器ID] bash

2.查看容器openssl版本

openssl version

OpenSSL 1.1.1d 10 Sep 2019

3.查看 openssl.cnf 配置文件

cat /etc/ssl/openssl.cnf

[system_default_sect] MinProtocol = TLSv1.1 CipherString = DEFAULT@SECLEVEL=2

发现允许的 ssl 最低版本是 TLSv1.2 ,而程序所使用的 SQL Server 数据库版本比较低不支持 TLSv1.2 ,修改为 TLSv1.0 后问题解决

4.修改方法:在 Dockerfile 中添加下面的指令

RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf


3、生成Docker镜像并在浏览器运行

运行 Docker Desktop,也就是刚刚安装的docker,然后出现面板,直接点下面的按钮跳过,进入主面板。

在项目里面点击Dockerfile右键,点击 生成 Docker 映像,等待打包生成,生成后点查看Docker Desktop,在Images里面就有一个镜像包。如下

点击镜像文件后面的RUN运行镜像,然后在弹出的狂内下拉打开,数据端口号8088,你也可以输入其他端口号,然后点击Run。

这个镜像文件就运行成功了,然后点击OPEN IN BROWSER(在浏览器打开)就可以看到效果了。

然后在浏览器手动输入http://localhost:8088/Home/GetStudentList访问我们刚刚在Home控制器写的查询方法进行数据库交互验证,如下成功交互。


参考文献

 
欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取

作者:熊泽-学习中的苦与乐
公众号:熊泽有话说


出处: https://www.cnblogs.com/xiongze520/p/15069441.html



创作不易,任何人或团体、机构全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。

windows环境30分钟从0开始快速搭建第一个docker项目(带数据库交互)的更多相关文章

  1. 作为Java新手,如何才能快速的看透一个Java项目?

    前言 技术学习是一个总结.纠错.触类旁通的过程,而不是单纯重复练习的过程,如果你问一个做过5年以上Java的老码农,他们很多人都会有很强的"搬砖感",这种"搬砖感&quo ...

  2. Windows环境下ELK(5.X)平台的搭建

    一.Windows环境下ELK平台的搭建(2.*) 1.安装配置Java环境 在Oracle官网获取最新版的Java版本,由于只是运行不是开发,所以也可以只下载JRE.官网:http://www.or ...

  3. 如何基于 Docker 快速搭建 Springboot + Mysql + Redis 项目

    目录 前言 项目目录 搭建项目 1. docker安装启动mysql以及redis 1.1 安装mysql 1.2 安装redis 2. 初始化数据库 3.创建项目 4.初始化代码 4.1 全局配置文 ...

  4. 使用vuejs2.0和element-ui 搭建的一个后台管理界面

    说明: 这是一个用vuejs2.0和element-ui搭建的后台管理界面. 相关技术: vuejs2.0:一套构建用户界面的渐进式JavaScript框架,易用.灵活.高效. element-ui: ...

  5. Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]

    更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...

  6. hadoop3.1.0 HDFS快速搭建伪分布式环境

    1.环境准备 CenntOS7环境 JDK1.8-并配置好环境变量 下载Hadoop3.1.0二进制包到用户目录下 2.安装Hadoop 1.解压移动 #1.解压tar.gz tar -zxvf ha ...

  7. Windows环境下安装 mysql-8.0.11-winx64 遇到的问题解决办法

    下载mysql安装包,我的是下载mysql-8.0.11-winx64,解压到你想安装的目录下,然后配置环境(window环境下,mac本还没试过), 1.首先,配置环境:右击此电脑->属性-& ...

  8. 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

    2016年时,Jerry曾经写过一系列关于SAP Fiori Smart Template(现在更名为Fiori Elements了)的博客,介绍了所谓的MDD开发方法论 - Metadata Dri ...

  9. 30分钟使用Docsify+Github Pages搭建个人博客

    前言 现如今网上有许多完善的博客平台,如博客园.掘金.思否.知乎等.有人会说为什么现在网上有这么多成熟的博客平台,你还要浪费时间搭建一个自己的博客平台呢?首先我相信每一个程序员都会想要拥有一个属于自己 ...

随机推荐

  1. csp-s模拟测试59(10.4)「Reverse」(set)·「Silhouette」(容斥)

    A. Reverse 菜鸡wwb又不会了..... 可以线段树优化建边,然而不会所以只能set水了 发现对于k和当前反转点固定的节点x确定奇偶性所到达的节点奇偶性是一定的 那么set维护奇偶点,然后每 ...

  2. NOIP模拟测试11「string&#183;matrix&#183;big」

    打的big出了点小问题,maxx初值我设的0然后少了10分 第二题暴力打炸 第一题剪了一些没用的枝依然40分 总分70 这是一次失败的考试 string 想到和序列那个题很像,但我没做序列,考场回忆学 ...

  3. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  4. Linkerd 2.10(Step by Step)—使用 Debug Sidecar,注入调试容器来捕获网络数据包

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...

  5. [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构

    [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...

  6. DOS命令行(9)——wmic-系统管理命令行工具

    wmic 介绍与语法 WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远 ...

  7. NAT网络地址转换技术

    NAT网络地址转换技术 目录 一.NAT概述 1.1.概述 1.2.NAT 的应用场景 二.NAT的类型及配置命令 2.1.静态NAT 2.2.动态NAT 2.3.Easy IP 2.4.NATP 2 ...

  8. js 实时监听滚动条状态 判断滚动条位置

      var scrollFunc = function (e) {    e = e || window.event; var t = document.documentElement.scrollT ...

  9. 详解 MD5 信息摘要算法

    对于软件研发人员来说 MD5 不是一个陌生的词汇,平时的软件研发中,经常使用 MD5 校验消息是否被篡改.验证文件完整性,甚至将MD5当作加密算法使用. MD5虽不陌生,但不是所有研发人员都了解其算法 ...

  10. 令牌桶限流思路分享(PHP+Redis实现机制)

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...