1. 程式人生 > 其它 >windows環境30分鐘從0開始快速搭建第一個docker專案(帶資料庫互動)

windows環境30分鐘從0開始快速搭建第一個docker專案(帶資料庫互動)

前言

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