前言
小白直接上手 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項目
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控制器寫的查詢方法進行數據庫交互驗證,如下成功交互。
參考文獻
- 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
歡迎關注訂閱微信公眾號【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂 公眾號:熊澤有話說 出處: https://www.cnblogs.com/xiongze520/p/15069441.html 創作不易,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接。
|