windows 下部署 .netcore 到 docker

TANZAME發表於2020-08-05

  前面我們演示瞭如何將 Asp.Net Core 程式部署到 iis 和 部署到 windows 服務。其實前面的都是鋪墊,如何將 Asp.Net Core 站點部署到 docker 才是這個系列文章的重點。畢竟 .net core 它是跨平臺的,能跑在 Linux 下才能體現它的跨平臺性。

 

  一、一分鐘瞭解 Docker    

  Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從Apache2.0協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。

簡而言之> 容器是一個打包了應用服務的環境,它是一個輕量級的虛擬機器,每一個容器由一組特定的應用和必要的依賴庫組成。

  Docker和傳統虛擬化之間最大的區別在於:容器是在作業系統層面上實現虛擬化,即直接複用本地主機的作業系統;而傳統虛擬化則是在硬體層面實現,如VMware vShpere, Xen及Citrix等。

  

  

 

  Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。

  Docker 容器通過 Docker 映象來建立。

  容器與映象的關係類似於物件導向程式設計中的物件與類。  

  Docker的架構如下圖所示,Client 通過介面與Server程式通訊實現容器的構建,執行和釋出。Client和Server可以執行在同一臺叢集,也可以通過跨主機實現遠端通訊。

  具體詳細內容,請瀏覽:《幾張圖幫你理解Docker基本原理及快速入門

 

  二、安裝 Docker

  windows 10 下安裝 Docker Desktop for Windows,windows 10 之前的版本安裝 Docker Toolbox。由於我當前演示的環境是 windows 8.1,所以下載 Docker Toolbox

Docker Desktop for Windows is available for free.

Requires Microsoft Windows 10 Professional or Enterprise 64-bit. For previous versions get Docker Toolbox.

By downloading this, you agree to the terms of the Docker Software End User License Agreement and the Docker Data Processing Agreement (DPA).

  安裝 Docker Toolbox  之前,必須確定開啟了硬體虛擬化。windows 8.1如果沒有開啟,需要去 BIOS 設定開啟虛擬化技術。windows 10 網上的介紹是去 控制皮膚 \ 所有控制皮膚項 \ 程式和功能 \ 啟用或關閉 windows 功能 裡勾上 Hyper-v,不過我沒試過。 

   之後安裝過程保持預設設定,但在 Setup-Docker Toolbox 介面下 Select Additional Tasks 中一定記得勾選最後一項(Install VirtualBox with NDIS5 driver[default NDIS6])。

 

   安裝完成後桌面會生成三個快捷方式,分別為:

  1. Docker Quickstart Terminal: 提供Docker的命令列操作
  2. Oracle VM VirtualBox: 虛擬機器軟體。
  3. Kitematic (Alpha):圖形化的docker工具

   在使用Docker前,要先建立docker machine,它其實是臺輕量級 linux 核心虛擬機器,不過在使用它的時候,你可能根本察覺不出來它是虛擬的。直接雙擊開啟 Docker Quickstart Terminal,它就會自動安裝好 docker machine,前提是你要有梯子,不然會卡死在安裝 boot2docker.iso 這一步。沒梯子的可以參考這裡

 

  三、部署程式

  3.1  新增 Docker 支援

  開啟上一篇的專案,右鍵新增 Docker 支援。

  3.2  編輯 Dockerfile 指令碼

  刪掉自動生成的 DockerFile 指令碼,使用以下指令碼:   

#引入映象,低版本 docker 去掉  AS base
#換成阿里映象
#FROM registry.cn-chengdu.aliyuncs.com/jimlicatpub/aspnet:3.1-buster-slim AS base
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

#配置工作目錄
WORKDIR /app
 
#暴露容器埠,此埠與程式執行路徑一致,可
EXPOSE 80
 
#複製檔案到工作目錄
COPY . .

#ENV :配置系統環境變數,比如程式環境環境等在這裡配置(開發、預發、線上環境)
#這裡是配置程式執行埠 如果程式不使用預設的80埠這裡一定要設定(程式執行埠)
ENV ASPNETCORE_URLS http://+:80

#啟動程式
ENTRYPOINT ["dotnet", "Riz.Web.dll"]

  同時修改 DockerFile 輸出屬性

  3.3 釋出程式

   3.4 生成映象檔案

  轉到釋出後的目錄,shift + 右鍵 - 在此處開啟命令 開啟命令列,使用以下命令生成映象。注意後面的 . 不能去掉。

#docker build -t imagename:version .
#版本號可以不寫,表示沒有版本號(last)
#指令後面有一個"." 不能漏,代表當目前目錄的意思
#riz.web 是映象的名稱,可以根據自己需要修改 docker build -t riz.web .

  完成後可檢視生成的映象。這裡如果沒有翻牆,在拉取 .net core 映象時可能會卡住。解決方案是使用 docker-mcr 加速映象,跟著它的說明步驟手動拉取映象,再執行 docker build 命令Ok。

  3.5 執行映象

#https://www.runoob.com/docker/docker-run-command.html
#docker run -d -p 2000:80 --name containername imagename:version
#-d 意思是後臺執行
#-p: 指定埠對映,格式為:主機(宿主)埠:容器埠。例如配置2000:80就是外網的2000埠對映到docker的80埠
#-name 為容器指定一個名稱
#imagename:version 映象:版本
#注意事項:如果你的伺服器是阿里、騰訊、華為雲等,配置的埠一定要在安全組配置裡開啟,比如下面的2000埠,不然訪問不了
docker run -d -p 2000:80 --name riz.web riz.web

  如果執行後出現一串ID,則表示執行正常,80為docker容器的埠,對映到本機的埠號位2000。按照園子裡的一些介紹文章,容器執行起來就萬事大吉了,瀏覽器裡輸入 http://localhost:2000/ 就能看到執行效果。可到我這怎麼倒騰不行,直接顯示 localhost 拒絕了我們的連線請求。難道是因為我的環境是 win8.1,只有 win 10 的 Hyper-v 才能做得到?如果有朋友在 win10 下直接輸入 localhost:port 能執行成功,麻煩留言告知,不勝感謝。後來仔細想想,localhost 表示的是本地主機(宿主主機),那麼站點的 host 應該是 docker 所在虛擬機器的 ip 才對。docker-machine ip default,看到 docker 的 ip 是 192.168.99.100,瀏覽器裡輸入 http://192.168.99.100:2000/,執行效果馬上出來~~

 

  

  參考資料:

  1. 官方文件, 《Host ASP.NET Core in Docker containers

  2. Edison Zhou,《 .NET Core微服務之ASP.NET Core on Docker

  3. SzeCheng,《幾張圖幫你理解Docker基本原理及快速入門

  4. 優雅轉身,《Windows下部署安裝Docker

  

  示例程式碼託管:https://gitee.com/TANZAME/Demo/tree/master/07.Core/Riz.Web 

  技術交流 QQ 群:816425449

 

相關文章