將.Net Core發布至Docker,並連接 Redis、上傳文件到本機、連接sqlserver數據庫


此片文章目標是將 .Net Core 發布到 Docker 上,並且連接到在 Docker上的 Redis 、上傳文件到本機文件夾和連接 sqlserver 數據庫。

創建項目

創建項目就不用說了,我是用得 vs2019 創建的 net core 3.1 的項目,把上傳文件、連接redis和sqlserver的代碼寫好,因為我是在 window 環境下開發的,所以如果我們需要發布到 linux 系統的話需要注意所有用到路徑的地方,比如我遇到的這幾個點:

1.保存文件地址

如下在 window 上保存文件的話地址是如下使用 '\' 的

// 新文件名(包括路徑)
filename = Environment.CurrentDirectory + @"\upload\" + filename;

在 linux 系統下就需要用 '/' 否則可保存不了呀

// 新文件名(包括路徑)
filename = Environment.CurrentDirectory + @"/upload/" + filename;

2.加載程序集

我是通過如下方法動態加載實體映射類型的,看下面標黃的代碼,在獲取的路徑前加了一個 “/” 是因為在 linux 中需要使用絕對路徑,像是 /app/xxx 這種,不加的話就會報錯

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 通過反射獲取繼承IEntityTypeConfiguration的實體類型
    string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("Capricorn.Db.SqlServer.dll", "Capricorn.Entity.Mapping.dll").Replace("file:///", "");
    Assembly asm = Assembly.LoadFile("/" + assembleFileName);
    //.....省略其他代碼
}

報錯內容,看到這個就要注意路徑問題了

Absolute path information is required. (Parameter 'path')

我們還要在 Program.cs 文件下加上如下標黃的代碼,設置端口

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://*:80")
                .UseStartup<Startup>();

發布項目

發布代碼前需要先添加 Docker 支持,右鍵項目->添加-》Docker 支持 后就會讓你選擇發布的目標系統如下,我這里選擇 linux

 選擇完成后會添加一個 Dockerfile 文件,會幫我們生成相應的構建鏡像的代碼,但是我們可以簡化到如下

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "Capricorn.dll"]

注意 Dockerfile 文件中的第二行 RUN 的代碼因為需要更新鏡像環境的 TLS 版本,否則在連接 sqlserver 的時候可能會報如下錯誤:

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

 之后就發布為文件系統就行如下,我發布到 D:\website

 

打包鏡像

之后我們到發布的目標位置下,打開 PowerShell 執行如下打包代碼

PS D:\website> docker build -t myweb .

等待 Dockerfile 中的基礎鏡像下載完成,后就會完成我們打包的鏡像了

備注

其實我們還可以通過 vs 進行打包,我們如下圖所示,在工具欄出選擇 Docker,之后執行就會自動進行打包

但是會有個問題,你可能會發現打包了半天都打包不完,一直顯示容器預熱中,然后在輸出視圖中看到容器工具中輸出停止在如下代碼,這三個內容很關鍵

Info: Using vsdbg version '16.8.11013.1'
Info: Using Runtime ID 'linux-x64'
Info: C:\Users\Xu\vsdbg\vs2017u5 exists, deleting.

要解決這個問題我們可以手動拼接下載路徑,下載路徑如下

https://vsdebugger.azureedge.net/vsdbg-(你的版本號 .號換成-號)/vsdbg-(你的Runtime ID).zip

比如按照我的輸出中的內容就需要如下的下載鏈接 

https://vsdebugger.azureedge.net/vsdbg-16-8-11013-1/vsdbg-linux-x64.zip

下載完成后在我們在需要的路徑下直接解壓文件,再創建兩個文本文件 success_version.txt 和 success_rid.txt 。在 success_version.txt 文件中添加我們的版本號(我這是16.8.11013.1),在 success_rid.txt 中添加我們的 Runtime ID (我這是linux-x64),之后取消執行,重啟項目,然后在重新生成就行啦。

運行容器

我們因為需要連接 redis 所以需要一個網絡使容器可以互相通信,建立網絡代碼如下

PS D:\website> docker network create -d bridge test-net

之后我們運行項目的容器做如下操作

1.綁定剛剛創建的網絡 test-net,可以與后面的 redis 通信

2.掛載容器中的路徑 /app 到本機的發布路徑 d:\website 下,這樣我們如果代碼需要重新發布,在發布完成后直接重啟容器就可以生效了

3.綁定容器內的 80 端口到本機的 5000 端口,可以通過訪問本地端口訪問網站

PS D:\website> docker run -itd --name myweb --network test-net -v d:\website:/app -p 5000:80 myweb

 運行Redis容器,我們直接用 Docker Hub 中的鏡像

PS D:\website> docker run -itd --name redis_myweb --network test-net redis

如果數據庫用的也是容器那和 redis 的操作差不多,不過我這里使用的是本機上的 sqlserver 數據庫,具體在 appsetting.json 的配置內容如下

{
  "ConnectionStrings": {
    "BaseDb": {
      "ProviderName": "System.Data.SqlClient",
      "ConnectionString": "Data Source=host.docker.internal,1433;Database=****;User ID=sa;Password=*********"
    },
    "Redis": {
      "ConnectionString": "redis_myweb",
      "Prefix": "Cap_"
    }
  }
}

可以看到,由於 redis 是在容器中運行的,所以連接字符串為運行的容器的名稱。而數據庫因為連接本機,所以地址使用了 host.docker.internal 作為地址。host.docker.internal 表示主機的地址,在主機為 windows 的機器中才能用,如果 redis 想使用本機的,那連接字符串也可以用 host.docker.internal 。

運行網站

我們訪問地址 http://localhost:5000/ 可以看到訪問成功了

 

 之后上傳文件,也可以看到我們本機掛載的文件夾下多了一個 upload 文件夾,里面多了我們上傳的文件

 

 訪問數據庫可以看到成功返回了數據

 

 設置緩存也成功啦

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM