windows環境30分鐘從0開始快速搭建第一個docker項目(帶數據庫交互) 10分鐘系列:NetCore3.1+EFCore三步快速完成數據庫交互

前言

小白直接上手 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
創作不易,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置註明作者和原文鏈接。  

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章