如何將 .NET Core 發佈到 Linux ?
.NET Core 為跨平台解決方案,我們可在 macOS 或 Windows 開發 .NET Core App,最後再發佈到 Linux 主機上。
.NET Core 提供 FDD 與 SCD 兩種發佈方式。
Version
macOS High Sierra 10.13.4
.NET Core 2.0.7
Docker for Mac 18.03.1-ce-mac65 (24312)
Ubuntu 16.04 LTS
建立 Ubuntu Container
1 | $ docker run --name MyUbuntu -dt -v /Users/Oomusou/Code:/var/code ubuntu:16.04 |
注意指令是下在 host os,不是 container 內
使用 docker run
由 image 建立 container,當 Docker 發現本機沒有 image,會自動從 Docker Hub 下載。
- –name : 替 container 取一個人能夠識別的名字
MyUbuntu
( 若省略,Docker 將隨機命名 ) - -d :
d
etach,建立 container 後,就脫離目前 process - -t :
t
erminal,預設執行/bin/bash
process,為了讓 container 啟動後不會立即停止 - -v :
v
olumn,定義 container 與 host os 的共用路徑,:
左側的/Users/Oomusou/Code
為 host os 的路徑;:
右側的/var/code
為 Ubuntu container 內部的路徑 - ubuntu:16.04 : Ubuntu 的官方 image 名稱,特別指定版本 16.04
因為目前 Ubuntu 18.04 LTS 已經發布,但 .NET Core SCD 尚未支援 Ubuntu 18.04,所以先暫時使用 Ubuntu 16.04
- 輸入
docker run
下載 Ubuntu 16.04 LTS image 並執行 container
進入 Ubuntu
1 | $ docker exec -it MyUbuntu bash |
注意指令是下在 host os,不是 container 內
使用 docker exec
對已經執行中的 container 下指令。
- -i :
i
nteractive,可對 terminal 輸入資料 - -t :
t
erminal,可對 terminal 顯示資料 - MyUbuntu : Container 名稱
- bash : 對 container 下的指令
- 輸入
docker exec -it MyUbuntu bash
進入 Ubuntu - 顯示 Ubuntu command prompt
安裝 Linux Library
1 | root@0677c0f17607 $ apt-get update |
注意指令是下在 container 內,不是 host os
.NET Core 要能執行在 Linux,除了 .NET Core Runtime Library 外,有些 Linux 的 Library 也必須具備。
根據 Prerequisites for .NET Core on Linux 所建議,一個能執行 .NET Core 的 Ubuntu,必須具備以下 library:
- libunwind8
- liblttng-ust0
- libcurl3
- libssl1.0.0
- libuuid1
- libkrb5-3
- zlib1g
- libicu52 (for 14.X)
- libicu55 (for 16.X)
- libicu57 (for 17.X)
一般 Ubuntu Desktop 或 Ubuntu Server,這些 library 都已經內建,不用另外安裝,但 Ubuntu Docker 則需要另外安裝這些 library
- 輸入
apt-get update
更新本機套件清單 - 輸入
apt-get …
安裝 Linux library
安裝完 Linux library 後,輸入
exit
暫時離開 container 回到 host os
建立 .NET Core App
1 | $ dotnet new console -o MyConsole |
注意指令是下在 host os,不是 container 內
使用 dotnet new
建立專案。
- console : 建立 console 類型專案
- -o :
o
output,建立在MyConsole
目錄下
- 輸入
dotnet new console -o MyConsole
建立 .NET Core App
SCD
SCD
Self-Contained Deployment
Linux 不需事先安裝 .NET Core SDK,直接將檔案複製到 Linux 即可執行
以 SCD 發佈1
2~ $ cd MyConsole
~/MyConsole $ dotnet publish -c Release -r linux-x64
注意指令是下在 host os,不是 container 內
使用 dotnet publish
將編譯後的 dll 與其 dependency 整理到 publish
目錄,將來只要將此目錄 deploy 到 server 即可。
- -c :
c
onfiguration,預設dotnet publish
是將Debug
模式的 dll 整理至publish
目錄,若要整理Release
模式的的 dll,需要配合-c
參數 - -r:
r
untime,根據指定參數整理成該平台 SCD 所需要的所有檔案,其中linux-x64
為 Linux 平台
- 進入專案目錄內
- 輸入
dotnet publish -c Release -r linux-x64
以 SCD 發佈 - 發佈到
/bin/Release/netcoreapp2.0/linux-x64/publish
目錄下
由於 SCD 不要求 Linux 預先安裝 .NET Core SDK,因此 publish
目錄下多達 178 個檔案。
再次進入 Ubuntu
1 | $ docker exec -it MyUbuntu bash |
注意指令是下在 host os,不是 container 內
- 輸入
docker exec -it MyUbuntu bash
再次進入 Ubuntu - 顯示 Ubuntu command prompt
執行 .NET Core App
1 | root@0677c0f17607 $ cd /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/linux-x64 |
注意指令是下在 container 內,不是 host os
由於目前 Ubuntu container 與 host os 共用目錄,因此不用特別將檔案複製到 Ubuntu 內,直接將目錄切換到 /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/linux-x64 /publish
執行 MyConsole
。
- 將目錄切換到
publish
目錄下 - 執行
MyConsole
- 成功顯示
Hello World!
注意此時 Ubuntu 並未安裝任何 .NET Core Runtime,只安裝了 .NET Core 所要求的 library 而已,一般 Ubuntu Desktop 或 Ubuntu Server 甚至連 library 都不用安裝,可以說真的將
publish
複製到 Ubuntu 即可執行
FDD
FDD
Framework-Dependent Deployment
須先在該平台安裝 .NET Core SDK,然後將相關 DLL 複製過去即可執行
安裝 Curl Library
1 | root@0677c0f17607 $ apt-get install curl |
注意指令是下在 container 內,不是 host os
由於需使用 curl
下載 .NET Core SDK,先安裝 curl
library。
安裝 microsoft.qpg
1 | root@0677c0f17607 $ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg |
注意指令是下在 container 內,不是 host os
- 輸入
curl …
下載microsoft.qpg
到本機 - 將
microsoft.qpg
移到適當目錄 - 加入 Microsoft 套件庫位置
安裝 .NET Core SDK
1 | root@0677c0f17607 $ apt-get install apt-transport-https |
注意指令是下在 container 內,不是 host os
安裝 apt-transport-https
套件。
- 輸入
apt-get install apt-transport-https
安裝apt-transport-https
套件
1 | root@0677c0f17607 $ apt-get update |
注意指令是下在 container 內,不是 host os
由於剛剛新加入了 Microsoft 自己的套件庫,所以需要在執行 apt-get update
更新一次本機套件清單。
- 輸入
apt-get update
更新本機套件清單
1 | root@0677c0f17607 $ apt-get install -y dotnet-sdk-2.1.4 |
注意指令是下在 container 內,不是 host os
正式安裝 .NET Core SDK 2.1.4。
- 輸入
apt-get install -y dotnet-sdk-2.1.4
安裝 .NET Core SDK
安裝完 .NET Core SDK 後,輸入
exit
暫時回到 host os
以 FDD 發佈
1 | ~ $ cd MyConsole |
注意指令是下在 host os,不是 container 內
使用 dotnet publish
將編譯後的 dll 與其 dependency 整理到 publish
目錄,將來只要將此目錄 deploy 到 server 即可。
- -c :
c
onfiguration,預設dotnet publish
是將Debug
模式的 dll 整理至publish
目錄,若要整理Release
模式的的 dll,需要配合-c
參數
若不加
-r
,預設即為FDD
- 進入專案目錄內
- 輸入
dotnet publish -c Release
以 FDD 發佈 - 發佈到
/bin/Release/netcoreapp2.0/publish
目錄下
FDD 只需 4 個檔案而已。
再次進入 Ubuntu
1 | $ docker exec -it MyUbuntu bash |
注意指令是下在 host os,不是 container 內
- 輸入
docker exec -it MyUbuntu bash
再次進入 Ubuntu - 顯示 Ubuntu command prompt
執行 .NET Core App
1 | root@0677c0f17607 $ cd /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/publish |
注意指令是下在 container 內,不是 host os
由於目前 Ubuntu container 與 host os 共用目錄,因此不用特別將檔案複製到 Ubuntu 內,直接將目錄切換到 /var/code/CSharp/MyConsole/bin/Release/netcoreapp2.0/publish
執行 MyConsole
。
- 將目錄切換到
publish
目錄下 - 以
dotnet
執行MyConsole.dll
- 成功顯示
Hello World!
Summary
我們可發現 SCD 與 FDD 各有優點:
- SCD 不需 client 事先安裝 .NET Core SDK,但所需檔案數很多
- FDD 所需檔案數很少,但 client 必須事先安裝 .NET Core SDK
Conclusion
- SCD 與 FDD 都能使 .NET Core App 達成跨平台到 Linux 執行
- 若是開發 Linux Console App,則建議使用 SCD,畢竟 user 不見的有安裝 .NET Core SDK
- 若是要將 ASP.NET Core 安裝到到 Linux,則使用 SCD 或 FDD 皆可