windows 環境 30 分鐘從 0 開始快速搭建第一個 docker 項目(帶數據庫交互)

 業精於勤,荒於嬉;行成於思,毀於隨。****”

目錄

前言

小白直接上手 docker  構建我們的第一個項目,簡單粗暴,後續各種概念邊寫邊瞭解,各種概念性的內容就不展開,沒了解過的點擊 Docker 教程 進行初步瞭解。

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux 或 Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。

1、安裝 docker

由於我們是 windows 環境,所以安裝的是 Docker Desktop for Windows 

 系統要求:

這裏需要重點注意,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 ></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; }  //需要操作的數據庫對應的表
    }
}
  1. 編寫一個查詢語句並返回數據

在自動生成的 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; }
        }
  1. 配置相關數據

配置 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 控制器寫的查詢方法進行數據庫交互驗證,如下成功交互。

 參考文獻

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/sMKrfOtsx9enIrmt435mdw