windows 環境 30 分鐘從 0 開始快速搭建第一個 docker 項目(帶數據庫交互)
“ 業精於勤,荒於嬉;行成於思,毀於隨。****”
目錄
-
前言
-
1、安裝 docker
-
2、創建 docker 項目
-
- 創建項目
-
- 引入 NuGet 包並創建上下文對象
-
- 編寫一個查詢語句並返回數據
-
- 配置相關數據
-
3、生成 Docker 鏡像並在瀏覽器運行
-
參考文獻
前言
小白直接上手 docker 構建我們的第一個項目,簡單粗暴,後續各種概念邊寫邊瞭解,各種概念性的內容就不展開,沒了解過的點擊 Docker 教程 進行初步瞭解。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux 或 Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
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 項目
- 創建項目
安裝完 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; } //需要操作的數據庫對應的表
}
}
- 編寫一個查詢語句並返回數據
在自動生成的 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:避免中文變成 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 控制器寫的查詢方法進行數據庫交互驗證,如下成功交互。
參考文獻
-
HP 工作站如何在 BIOS 下開啓關閉虛擬化技術:https://jingyan.baidu.com/article/ce436649184b393773afd309.html
-
Docker 教程 | 菜鳥教程:https://www.runoob.com/docker/docker-tutorial.html
-
Docker——從入門到實踐:https://www.kancloud.cn/docker_practice/docker_practice/469767
-
Docker 教程:https://www.jc2182.com/docker/docker-windows-install.html
-
Docker 百度百科:https://baike.baidu.com/item/Docker/13344470?fr=aladdin
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/sMKrfOtsx9enIrmt435mdw